一般情况下,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
#为后续的RUN、CMD、ENTRYPOINT指令配置工作目录
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;"]
CMD、RUN、ENTRYPOINT的格式
*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"
......