Docker提供了两种构建镜像的方法:dokcer commit 命令与docker文件
一、Dockerfile 解析
1.是什么?
Docker file是用来构建docker镜像的文件文件,是由一条条构建镜像所需的指令和参数构成的脚本
- 官网:https://docs.docker.com/engine/reference/builder/
- 构建三步骤:
编写Dockerfile文件
docker bulid 命令构建镜像
docker run 依镜像运行容器示例
2.Dockerfile构建过程解析
- docker执行docker的大致流程
1)docker从基础镜像运行一个容器
2)执行一条指令并对容器做出修改
3)执行类型 docker commit的操作提交一个新的镜像层
4)docker 在基于刚提交的镜像运行一个容器
5)执行dockerfile中按序执行直到所有指令都执行完成
3.Dockerfile常用指令
Dockerfile由一行行命令语句组成,并且支持#开头注释
1)构建指令用于构建image,其指定操作不会在运行image的容器执行
2)设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行
一般dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
FROM(构建指令)
指定base镜像,必须指定且需要dockerfile其他指令的前面,后续的指令都依赖于该指定的镜像,
该命令格式有两种格式:
1)FROM <image>
2)FROM <image>:<tag>
MAINTAINER(构建指令)
设置镜像的作者,可以是任意字符串。用于将image的制作者相关的信息写入到image
中 ,现在已经被“LABEL maintainer=”取代
使用 docker inspect 命令输出相应的字段记录该信息
COPY(构建指令)
将文件从build context复制到镜像
COPY支持两种形式:
COPY src ... dest
COPY ["src",.."dest"]
ADD (构建指令)
与COPY类似,从build context 复制到镜像,如果 src 是归档文件(tar,zip,tgz等)文件会自动解压到test
ADD包含两种格式:
1.ADD <src> ...<test>
2.ADD ["src",... "test"]
ENV(构建指令)
设置环境变量,环境可被后面的指令使用,并在容器运行时保持
格式:ENV key value
例如:
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
EXPOSE(设置指令)
格式:
EXPOSE port
EXPOSE [<port>/<protocol>...]
指定容器开放的端口,供互联网系统使用
可以指定TCP或UDP,默认时TCP
在启动容器的时候如果使用-P,Docker主机自动分配一个端口和容器端口映射
在启动容器的时候如果使用-p,则可以具体指定哪个宿主机端口和容器端口映射
VOLUME(设置指令)
格式:VOLUME ["<mountpoint>"]
将文件或目录声明为volume,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用,
WORKDIR(设置指令)
格式:WORKDIR /etc/passwd
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
类似于cd命令切换到当前目录,为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
RUN (构建指令)
在构建镜像过程中指定要执行的命令
CMD(设置指令)
容器启动时运行指令的命令
dockerfile 中可以有CMD指令,但只有最后一个生效
ENTRYPOINT(设置指令)
设置容器启动时运行的命令
dockerfile 中可以有多个ENTRYPOINT 指令,但只有最后一个生效
USER
USER指令用于指定容器执行程序的用户身份,默认时root用户
当服务不需要管理员权限时,通过该命令指定运行用户
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
HEALTHCHECK
容器健康状况检查命令
语法有两种:
1.HEALTHCHECK [OPTIONS] CMD command
2.HEALTHCHECK NONE
第一个功能是在容器内部运行一个命令来检查容器的健康状况
第二个功能是在基础镜像中取消健康检查命令
[OPTIONS]的选项支持以下三种选项:
--interval=duration 两次检查默认的时间间隔为30秒,间隔(s秒、M分钟、h小时),从容器运行起来开始计时interval秒(或者分钟小时)进行第一次健康检查
--timeout=DURATION
--retries=N 连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3
注意:HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效
CMD关键字后面可以跟执行shell脚本的命令或者exec。CMD后面的命令执行完的返回值代表容器的运行状况,具体的返回值如下:
0: success - 表示容器是健康的
1: unhealthy - 表示容器已经不能工作
2: reserved - 保留值
ARG构建参数
格式:ARG <参数名>[=<默认值>]
ARG构建参数和ENV一样,都是设置环境变量,区别在于 ARG所设置的构建环境的变量,在容器中运行时不会存在这些变量,不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。
LABEL
给镜像添加信息。使用docker inspect可查看镜像的相关信息
语法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
一个Dockerfile种可以有多个LABEL:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号
二、docker commit
docker commit命令是创建新镜像最直观的方法,其过程包含三个步骤
• 运行容器。
• 修改容器。
• 将容器保存为新的镜像。
保存为新的镜像,新开启一个终端,执行docker commit命令将容器保存为镜像
如:
新镜像命名为centos-with-vim。查看新镜像的属性