编写 Dockerfile

$ vim Dockerfile
FROM wwwicbd/dev:latest
MAINTAINER @CbdFocus
COPY html/ /usr/share/nginx/html/
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

build 新镜像

$ docker build -t nginx .
Sending build context to Docker daemon  333.8kB
Step 1/4 : FROM wwwicbd/dev:latest
 ---> e6c137eaca9b
Step 2/4 : MAINTAINER @CbdFocus
 ---> Running in 4d737962b2a5
Removing intermediate container 4d737962b2a5
 ---> 1abd28a0d187
Step 3/4 : COPY html/ /usr/share/nginx/html/
 ---> fe273cca47b7
Step 4/4 : ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
 ---> Running in 39bee1fa2f52
Removing intermediate container 39bee1fa2f52
 ---> 17e3b992005c
Successfully built 17e3b992005c
Successfully tagged nginx:latest

运行容器

$ docker run -d -p 8080:80 --restart=always 17e3b992005c
e83c41a16f5dfa15de48adb4080074106a5feedac7a5adfccfed305f33938b71

查看容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e83c41a16f5d        17e3b992005c        "/usr/sbin/nginx -g …"   55 seconds ago      Up About a minute   0.0.0.0:8080->80/tcp   upbeat_cray
$ docker top e83c41a16f5d
PID                 USER                TIME                COMMAND
7451                root                0:00                nginx: master process /usr/sbin/nginx -g daemon off;
7478                998                 0:00                nginx: worker process
7479                998                 0:00                nginx: worker process

注意

docker run 中的 -d 意思是:

https://docs.docker.com/engine/reference/commandline/run/ –detach , -d Run container in background and print container ID

不是 daemon 的意思!!! 也就是说它仅仅把命令放到后台执行, 一旦命令完成, 容器即完成.

所以 ENTRYPOINT 中 nginx 一定要使用 daemon off; 模式运行, 让 nginx 常驻前台, 容器就不会自动结束了.

如果怕容器意外中断, 可以在 run 参数里加 --restart=always , 会令该容器随docker启动自动重启. 当然 docker stop hash 可以让它暂时停下来.

Dockerfile 的 RUN CMD 和 ENTRYPOINT

相同点:

都支持这两种格式:

COMMAND <command>
COMMAND ["executable","param1","param2"]

第一种格式实际上相当于: /bin/sh -c command .

第二种格式实际上是 JSON, 所以必须用双引号. 不会默认使用 shell, 所以不能写成 COMMAND [“echo”, “$PATH”] .

不同点:

RUN 用于构建 IMAGE 的命令, 可以使用多次. 每次运行都是在之前层次上的叠加.

CMDENTRYPOINT 用于运行容器的命令, 每条只能使用一次, 可以同时存在. CMD 会被命令行参数覆盖, ENTRYPOINT 不会.