设为首页 收藏本站
查看: 1565|回复: 0

[经验分享] docker-Dockerfile构建镜像详情

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-1-19 08:41:13 | 显示全部楼层 |阅读模式
介绍  docker在构建新的镜像时需要写一个Dockerfile文件里面描述了新的镜像是基于哪个镜像,中间需要哪些操作等等,下面做把镜像做比喻

docker创建镜像的创建想做饭一样:
1.首先我们准备一个干净厨房:目录`myimage`,然后把需要的食材(文件)放到这
2.在目录里面写一个饭菜需要的:食谱“Dockerfile”,当然食谱是需要注明食材加入的先后顺序的
1
2
3
4
5
6
7
8
9
10
11
12
FROM registry.cn-hangzhou.aliyuncs.com/forker/centos7            #这里声明镜像是基于哪个镜像创建的
MAINTAINER baishaohua                                                   
#指定维护的人
RUN yum -y
install sshd                                                                        
#给你的镜像执行特定操作相当于/bin/sh -c
CMD  /usr/sbin/sshd -D                                       #一个dockerfile只能有一个CMD如果有多个只执行最后一个
LABEL  version="1.0"                                                         
#标签信息
EXPOSE                                                                                          
#容器监听指定端口
上面是几个常用的,下面有几个:ENV,ADD, COPY, ENTRYPOINT, VOLUME, USER, WORKDIR





3.构建容器:材料准备好以后,下面就开始做饭了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[iyunv@salt-node1
bai]# cat Dockerfile
FROM centos7
RUN yum -y install
openssh-server openssh-clients
CMD /usr/sbin/sshd
-D

[iyunv@salt-node1
bai]# docker build -t centos7sshv1 .
Sending build context to Docker daemon 2.048 kB            #docker确认build需要的信息
Step 1 : FROM centos7                                                            
#引用指定的镜像到本地,这里ID是中间基础容器
---> 00f6c5817350
Step 2 : RUN yum -y install openssh-server openssh-clients               #基于上面的容器运行RUN里面的命令生成新的基础容器
---> Using cache
---> c173480a6c42
Step 3 : CMD /usr/sbin/sshd -D                                                                 
#基于上面的容器运行RUN里面的命令生成新的基础容器并构建成镜像,删除临时容器
---> Running in e8072b88b11b
---> ee81230261f1
Removing
intermediate container e8072b88b11b
Successfully built
ee81230261f1

4.运行新的容器
[iyunv@salt-node1
bai]# docker run -d --name "testssh" -p  8022:22 centos7sshv2
cc225eff2520c47d54b264d5a338bb127933812d53e98f1c2b799bc8bb688f21



#########################| 华丽分割线 |###################################

下面详细介绍各个Dockerfile的参数,这里执行要大些
  • FROM
FROM [base_image]

你的镜像基于哪个基础镜像进行构建的

  • MAINTAINER
MAINTAINER operation@example.com

这个是显示镜像维护人

  • RUN
运行命令,有两种方式如下,它的运行原理是 /bin/sh -c
注意:1. 这里传递是通过json所以只能用双引号,2.他不会运行脚本所以执行的时候不能获取系统变量
RUN ps
RUN["executable", "param1", "param2"]

  • LABEL
你可以通过标签让更多的人知道你的镜像信息例如:授权许可,帮助你的自动化,或者其它。
你可以添加一个开始标签,一个值或多个值。如果你的字符串包含空格请用双引号进行包裹。
举例:
# Set one or moreindividual labels
LABEL com.example.version="0.0.1-beta"
LABEL vendor="ACME Incorporated"
LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""
# Set multiple labelson one line
LABEL com.example.version="0.0.1-beta"com.example.release-date="2015-02-12"
# Set multiple labelsat once, using line-continuation characters to break long lines
LABEL vendor=ACME\ Incorporated \
      com.example.is-beta= \
      com.example.is-production=""\
     com.example.version="0.0.1-beta" \
     com.example.release-date="2015-02-12"

  • EXPOSE
用来指定容器监听哪些端口,但是容器并不会暴露这些端口给服务器,除非你启动容器时使用-P参数。

  • ENV
它将把容器内部的很多变量替换掉,用你指定的key
ENV key=value

  • ADD
把指定文件标准输入到镜像内,如果是压缩文件将会被自动解压,当然这里是 支持通配符
< dest >是一个绝对路径或相对路径WORKDIR,源将被复制在目的地的容器。
ADD hom*/mydir/        # adds all files startingwith "hom"
ADD hom?.txt/mydir/    # ? is replaced with anysingle character, e.g., "home.txt"
ADD testrelativeDir/          # adds"test" to `WORKDIR`/relativeDir/
ADD test/absoluteDir/         # adds"test" to /absoluteDir/

  • COPY

用法基本和ADD一致

  • ENTRYPOINT
有两种运行方式,他的主要作用:一些你常用的参数可以加到这里,当你执行的时候自动添加
ENTRYPOINT["executable", "param1", "param2"] (exec form,preferred)
ENTRYPOINT commandparam1 param2 (shell form)

wKioL1h_mhWgwpVuAACiu3Ct6QE266.png


  • VOLUME
创建一个数据卷,这个是映射到系统的“/var/lib/docker/volumes/<容器ID>/_data/”
如果你重新构建镜像这个数据卷信息将被清除,注意:因为这里是为了构建一个标准json所以只能用双引号,
单引号是会报错的
VOLUME /opt/code/
VOLUME["/data", "/opt"]

USER
RUN和ENTRYPOINT 将使用哪个用户运行
USER daemon

  • WORKDIR
设置Dockerfile里面RUN, CMD, ENTRYPOINT, COPY 和ADD工作目录,如果WORKDIR不存在,它将被创建,即使它没有在任何后续的Dockerfile指令中使用。

  • ARG
docker build时候的参数,如果命令中带有将不会被使用
ARG<name>[=<default value>]

1 FROM busybox
2 USER${user:-some_user}
3 ARG user
4 USER $user

构建docker时就可以传入参数
$ docker build--build-arg user=what_user Dockerfile

使用此Dockerfile示例,CONT_IMG_VER仍然保留在映像中,但其值为v1.0.0,因为它是ENV指令在第3行中的默认设置。

此示例中的变量扩展技术允许您从命令行传递参数,并通过利用ENV指令将它们持久保存在最终映像中。仅对一组有限的Dockerfile指令支持变量扩展。

Docker有一组预定义的ARG变量,您可以在Dockerfile中使用相应的ARG指令。通过这个参数调用下面的变量
--build-arg<varname>=<value>

    HTTP_PROXY
    http_proxy
    HTTPS_PROXY
    https_proxy
    FTP_PROXY
    ftp_proxy
    NO_PROXY
    no_proxy

  • ONBUILD
ONBUILD指令在镜像被用作另一个镜像的构建基础时,会触发执行的指令。 触发器将在下游构建的上下文中执行,就好像它已经在下游Dockerfile中的FROM指令之后立即插入指令。
任何构建指令都可以注册为触发器。
如果您正在构建将用作构建其他映像的基础的图像,例如应用程序构建环境或可以使用用户特定配置自定义的后台驻留程序,这将非常有用。
详解:
  • 当build镜像时遇到ONBUILD时候它将插入一个触发器到镜像的metadata,他不会影响当前的构建
  • 在构建结束时,所有触发器的列表存储在镜像的OnBuild清单中的key下。 可以使用docker inspect命令检查它们。
  • 当build执行的时候第一个执行的是FROM 引用一个基础镜像引用后这一步并不会结束他会检查并执行触发器,如果触发器全部执行完成FROM才能算成功,否则只要一个触发器失败FROM就算失败
  • 触发器在执行完成后会被清楚,也就是在新建的镜像中是不会集成这个触发器的
  • 使用ONBUILD ONBUILD是不允许的,也就是不能自己触发自己,同样也不可以触发FROM和MAINTAINER

[...]
ONBUILD ADD ./app/src
ONBUILD RUN/usr/local/bin/python-build --dir /app/src
[...]


  • STOPSIGNAL
给系统发送退出信号(终止信号),该信号可以是与内核系统调用 “9”相似,或者是格式为SIGNAME的信号名称,例如SIGKILL。
STOPSIGNAL signal

  • HEALTHCHECK
HEALTHCHECK指令是在Docker1.12版本加入,此指令有两种格式:
HEALTHCHECK [OPTIONS] CMD command                   #在容器内运行一个命令检测容器健康
HEALTHCHECK NONE                                                        #禁止从基础镜像集成任何健康检测
描述
HEALTHCHECK 指令告诉docker如何去检测容器仍然在工作,例如你的web容器因为一个无限循环卡住无法创建新的连接它可以告诉容器不再健康,即使现在进程依然在运行。
容器的初始状态是‘starting’,如果健康检测容器正常他的状态会是'healthy'状态码为“0”, 如果健康检测出现连续失败会出现'unhealthy' 状态码为“1”,如果因为非健康执行退出则为“reserved”状态码为“2”。
参数介绍:
可以出现在CMD的参数:
    --interval=DURATION          #默认间隔30s
    --timeout=DURATION          #默认超时时间30s
    --retries=N          #默认重试3次

HEALTHCHECK--interval=5m --timeout=3s \CMD curl -f http://localhost/|| exit 1

上面三个参数连贯起来就是,健康检测默认间隔5分钟运行一次,如果超过3秒则认为超时,如果尝试三次一直失败则认为容器不再健康执行"exit 1"。
假如说在Dockerfile里面多次出现这个参数,将会采用最后一个HEALTHCHECK 指令,这个是和CMD指令一样的。
如果你想获取容器现在的状态可以使用“docker inspect [CONTAINER ID ]”获取当前容器的health_status



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-330453-1-1.html 上篇帖子: docker-仓库使用和镜像提交 下篇帖子: Docker镜像
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表