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命令将容器保存为镜像

如:

docker如何构建java项目 构建dockerfile_Dockerfile

新镜像命名为centos-with-vim。查看新镜像的属性

docker如何构建java项目 构建dockerfile_Dockerfile_02