栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Dockerfile编写指南

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Dockerfile编写指南

文章目录
  • 引言
      • 举例
      • 好处
  • 什么是Dockerfile
  • Dockerfile命令
    • 构建镜像命令
      • MAINTAINER
      • RUN
      • EXPOSE
      • CMD
      • ENTRYPOINT
      • CMD和entrypoint区别
      • ADD和COPY
      • VOLUME
      • ENV
      • USER
  • Dockerfile的构建过程
  • dockerfile分层原理

引言

远程仓库可以pull一个tomcat等镜像下来,然后docker run启动容器,然后docker exec -it 容器id /bin/bash进入容器,往webapps下仍我们的程序。等等这一系列操作,都需要人工一步步的去操作,那我问你:你没qa和生产环境的部署权限,你咋操作这些?这就需要将所有人工一步步操作的地方都写到Dockerfile文件里,然后将文件给到运维人员,他们build成镜像然后进行启动。

举例

比如:你要用tomcat部署一个war包,这时候你的Dockerfile文件内容会包含如下:

将tomcat从远程仓库拉下来
进入到tomcat的webapps目录
将宿主机上的war包扔到容器的webapps目录下
然后运维拿着这个Dockerfile进行build成image,在run一下启动容器。大功告成

好处

上面的例子好处不难发现

Dockerfile解放了手工操作很多步骤
Dockerfile保证了环境的统一
再也不会出现:QA是正常的,线上就是不行的情况了(前提是由于环境问题导致的 ),因为Dockerfile是同一份,大到环境,小到版本全都一致。再有问题那也是代码问题,节省了和运维人员大量“亲密接触”的时间。

什么是Dockerfile

Dockerfile中文名叫镜像描述文件,是一个包含用于组合镜像目录的文本文档,也可以叫“脚本”。他通过读取Dockerfile中的指令安装步骤自动生成镜像。

补充:文件名称必须是:Dockerfile

Dockerfile命令 构建镜像命令

Dockerfile中的指令有FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOING、VOLUME、USER、WORKDIR、ONBUILD,错误的指令会被忽略。下面将详细讲解一些重要的Docker指令
FROM

两种形式如下:

FROM 
FROM :
通过FROM指定的镜像名称必须是一个已经存在的镜像,这个镜像称之为基础镜像,必须位于第一条非注释指令
MAINTAINER
MAINTAINER 
指定镜像的作者信息,包含镜像的所有者和联系人信息
RUN
用于指定构建镜像时运行的命令,两种模式:

RUN  (shell模式)
RUN [ "executable", "param1", "param2" ] (exec模式)
在shell模式下,是使用/bin/sh -c COMMAND来运行命令的
在exec模式下可以指定其他的shell来运行命令RUN [“/bin/bash”, “-c”, “echo hello”]
多条RUN指令可以合并为一条:

RUN yum install httpd && yum install ftp
这样在构建的时候会减少产生中间层镜像
EXPOSE
指定运行该镜像的容器使用的端口,可以是多个。

EXPOSE 
使用这个指令的目的是告诉应用程序容器内应用程序会使用的端口,在运行时还需要使用-p参数指定映射端口。这是docker处于安全的目的,不会自动打开端口。

docker run -p 80 -d dockertest/dockerfile_build nginx -g "daemon off"
CMD
用于提供容器运行的默认命令,如果在docker run时指定了运行的命令,则CMD命令不会执行。CMD有三种模式:

CMD  (shell模式)
CMD [ "executable", "param1", "param2" ] (exec模式)
CMD [ 'param1', 'param2'] (通常与ENTRYPOINT搭配指定ENTRYPOINT的默认参数)
ENTRYPOINT
与CMD类似,ENTRYPOINT不会被docker run中指定的命令覆盖,如果想覆盖ENTRYPOINT,则需要在docker run中指定--entrypoint选项

它有两种模式:

ENTRYPOINT  (shell模式)
ENTRYPOINT [ "executable", "param1", "param2" ] (exec模式)
CMD和entrypoint区别

一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接run,否则想用其他参数,就run 里面加参数

ADD和COPY
作用都是将文件或目录复制到Dockerfile构建的镜像中

ADD  
ADD ["" ""] (适用于文件路径包含空格的情况)

COPY  
ADD ["" ""] (适用于文件路径包含空格的情况)
ADD包含了类似tar的解压功能,如果只是单纯复制文件,建议使用COPY,而且,两者的源文件路径使用Dockerfile相对路径,目标路径使用绝对路径。
COPY index.html /var/www/html
  • copy只能用于复制(节省资源)

  • ADD复制的同时,如果复制的对象时压缩包,ADD还可以解压(消耗资源)

  • COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执- 行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中

  • 满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩

VOLUME
用于向容器添加卷,可以提供共享存储等功能

VOLUME ['/data']
WORKDIR
在容器内部设置工作目录,这样ENTRYPOINT和CMD指定的命令都会在容器中这个目录下进行。

WORKDIR /path/to/workdir
ENV
用于设置环境变量

ENV  
ENV =
USER
用于指定镜像为什么用户去运行

USER nginx
镜像就会以nginx身份运行,可以使用uid,gid等各种组合使用
onBUILD
为镜像创建触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行。当子镜像被构建时会插入触发器中的指令。

onBUILD COPY index.html /var/www/html
Dockerfile的构建过程

docker会从Dockerfile文件头FROM指定的基础镜像运行一个容器
然后执行一条指令,对容器修改
接着执行类似docker commit的操作,创建新的镜像层
在基于刚创建的镜像运行一个新的容器
执行Dockerfile下一条指令,直到所有指令执行完毕
docker会删除中间层创建的容器,但不会删除中间层镜像,所以可以使用docker run运行一个中间层容器,从而查看每一步构建后的镜像状态,这样就可以进行调试。

dockerfile分层原理

1.docker镜像分层(基于AUFS构建):
docker镜像位于bootfs之上
每一层镜像的下一层成为父镜像
第一层镜像成为base image(操作系统环境镜像)
容器层(可读可写),在最顶层(writable)
容器层以下都是readonly

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/641832.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号