docker-6.使用Dockerfile定制镜像

Posted liang-yao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker-6.使用Dockerfile定制镜像相关的知识,希望对你有一定的参考价值。

一般情况下,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 [email protected]

#指定运行容器时的用户名或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"

......

以上是关于docker-6.使用Dockerfile定制镜像的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile 定制专属镜像|果断收藏

Dockerfile 定制专属镜像|果断收藏

使用 Dockerfile 定制镜像

使用Dockerfile定制自己的docker镜像

dockerfile定制镜像的使用

Dockerfile 定制镜像