一般情况下, Dockerfile 分为四部分: 基础镜像信息维护者镜像操作指令和容器启动时执行的指令
例:
- #This Dockerfile uses the centos image
- #This is a nginx web server
- #version 0.1
- #time 2017 年 10 月 27 日 13:00:01
- # 指定基础镜像, 可同时指定多个镜像
- FROM centos
- # 维护者
- MAINTAINER blog.rootr.cn admin@domain.com
- # 指定运行容器时的用户名或 UID,RUN 也会使用指定用户, 获取临时管理员权限推荐使用 gosu
- #USER root
- # 为后续的 RUNCMDENTRYPOINT 指令配置工作目录
- WORKDIR /root
- # 镜像操作指令
- RUN yum update -y
- RUN yum install -y epel-release
- # 指定环境变量, 供后面的 RUN 指令使用
- ENV web_server_name nginx
- RUN yum install -y $web_server_name
- # 复制指定的 <src> 到容器中的 < dest><src > 可以是 Dockerfile 所在目录的相对路径 (文件或目录); 也可以是 URL(默认权限 600) 或 tar 文件(自动解压为目录)
- RUN mkdir /usr/share/nginx/html/a
- ADD http://192.168.200.1/index.html /usr/share/nginx/html/a/
- RUN chmod 777 /usr/share/nginx/html/a/index.html
- # 复制本地主机的 < src > 到容器中的 < dest><src > 可以是 Dockerfile 所在目录的相对路径 (文件或目录) 目标路径不存在自动创建
- COPY index.html /usr/share/nginx/html/
- # 创建本地主机或其他容器的挂载点
- VOLUME /data/backup
- # 声明容器需要暴露的端口号
- EXPOSE 80 443
- # 配置容器启动后执行的命令, 不会被用户启动容器指定的参数覆盖(每个 Dockerfile 只能有一条 ENTRYPOINT 指令)
- #ENTRYPOINT command --parameter
- # 检查容器健康状况(每个 Dockerfile 只能有一条 HEALTHCHECK 指令) --interval: 两次健康检查间隔 --timeout: 超时时间 --retries: 连续失败指定次数后, 容器状态将更改为 unhealthy
- # 命令的返回值决定了该次健康检查的成功与否: 0: 成功; 1: 失败; 2: 保留, 不要使用这个值
- HEALTHCHECK --interval=15s --timeout=5s --retries=3 \
- CMD curl -fs http://127.0.0.1/ || exit 1
- # 容器启动时执行的指令(每个 Dockerfile 只能有一条 CMD 指令如果用户启动容器时指定了参数, 则不会被执行)
- CMD ["nginx","-g","daemon off;"]
CMDRUNENTRYPOINT 的格式
*shell 格式: CMD <命令>
*exec 格式: CMD ["可执行文件", "参数 1", "参数 2"...]
shell 格式: 实际的命令会被包装为 sh -c 的参数的形式进行执行比如:
CMD echo $HOME 在实际执行中, 会将其变更为:
CMD [ "sh", "-c", "echo $HOME" ]
exec 格式:
Docker 不是虚拟机, 容器中的应用都应该以前台执行, 没有后台服务的概念
而使用 service nginx start 命令, 则是以后台守护进程形式启动 nginx 服务
CMD service nginx start 会被理解为 CMD ["sh", "-c", "service nginx start"] , 因此主进程实际上是 sh 那么当 service nginx start 命令结束后, sh 也就结束了, sh 作为主进程退出了, 自然就会令容器退出
正确的做法是直接执行 nginx 可执行文件, 并且要求以前台形式运行
创建镜像
- docker build -t web:0.1 /root/docker/
- docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- web 0.1 b370d7fc0bac 17 minutes ago 438 MB
- docker run --name nginx -d -P web:0.1
- docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 49f07ad6a13e web:0.1 "nginx -g daemon off" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:32799->80/tcp, 0.0.0.0:32798->443/tcp nginx
- curl 127.0.0.1:32799
- test
- curl 127.0.0.1:32799/a/
- AAA
查看健康检查日志
- docker inspect --format {{json .State.Health}} nginx | python -m json.tool
- {
- "FailingStreak": 0,
- "Log": [
- {
- "End": "2017-10-30T14:20:07.95075839+08:00",
- "ExitCode": 0,
- "Output": "test\n",
- "Start": "2017-10-30T14:20:07.902212787+08:00"
- ......
来源: http://www.bubuko.com/infodetail-2498939.html