“好的剧本是一部好电影的出发点,这次我们来当一回编剧。——编程三分钟”
演员表:Nginx
容器、一个只会说hello world
的html
文件。
剧本:一个名为Dockerfile
的文件,记录了修改、安装、构建、操作的整个过程,我们将会用这个脚本来构建、定制镜像。
场景:docker
环境。
一号演员index.html
出场并对大家说了一句Hello World
<h1>Hello World</h1>
二号演员nginx:alpine
,他是一个现成的docker镜像,我们熟知的nginx:latest
是他的小弟弟,他比弟弟厉害的地方有三个:
nginx:latest
一模一样。alpine
镜像用的是Alpine Linux
内核,比ubuntu
内核要小很多。nginx:alpine
默认支持http2
。一部电影成功的最主要原因是有一个很好的故事,让我们来看看剧本。
创建一个Dockerfile文件,一般分为四个部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行指令。内容如下
# 基础镜像信息
FROM nginx:alpine
# 维护者信息
MAINTAINER docker_user docker_user@email.com
# 镜像操作指令
COPY . /usr/share/nginx/html
RUN echo hello
FROM
从nginx:alpine
的Docker镜像创建一个图层。MAINTAINER
标记镜像维护人信息。COPY
把当前目录的文件复制到/usr/share/nginx/html
,至于为什么是这个目录是因为官网镜像就是以这个目录作为静态网站部署目录。RUN
或RUN ["executable", "param1", "param2"]
;前者将在shell终端中运行命令,即/bin/sh -c
,后者则使用exec
执行,推荐使用。CMD
命令,用法和RUN
一样,用来指定运行容器时的操作命令,因为我们是基于nginx镜像来制作我们的镜像,相当于加了一个壳,此处nginx镜像里已经自己写了启动方式,所以我们就不用再写一次了。剧本写完以后,在Dockerfile所在文件夹路径下执行命令:docker build --tag name:tag .
,就可以按照描述构建一个镜像了。name是镜像的名称,tag是镜像的版本或者是标签号,不写就是lastest。注意后面有一个空格和点。
# 用法
docker build [选项] 路径
打镜像
$ docker build -t webserver-image:v1 .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM nginx:alpine
---> bfba26ca350c
Step 2/4 : MAINTAINER docker_user docker_user@email.com
---> Using cache
---> a8b84ca6d5a1
Step 3/4 : COPY . /usr/share/nginx/html
---> b25123c06e56
Step 4/4 : RUN echo hello
---> Running in 7c86a7bca405
hello
Removing intermediate container 7c86a7bca405
---> 55bcba5b3ab9
Successfully built 55bcba5b3ab9
Successfully tagged webserver-image:v1
使用docker images
命令查看镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver-image v1 55bcba5b3ab9 44 seconds ago 20.5MB
nginx alpine bfba26ca350c 2 weeks ago 20.5MB
指定webserver-image:v1
镜像,-d
后台运行容器,并镜像的80端口映射到本地的80端口。
$ docker run -d -p 80:80 webserver-image:v1
fe5dd3369f7766cf078c4049cad1c99fc444cac56752d2a1393b64fd46e43c4d
查看运行效果
$ curl 0.0.0.0:80
<h1>Hello World</h1>
学过git的都知道,.gitignore
文件可以忽略追踪,docker也有类似的文件,名为.dockerignore
,例如在此文件内写入以下忽略的文件和文件夹内容
.git/
logs