Docker镜像构建-Dockerfile

Docker machine
Docker swarm
Docker compose

为什么要构建镜像?

那么在很多的生产环境中,我们可能需要构建适合自己生产环境的镜像,应为Github不可能拥有所有场合下都适用的镜像!那么这个时候我们就必须得构建自己镜像

构建镜像的方式

那么构建镜像的方式有两种

基于容器提交为一个新的镜像:此种方法我们需要先运行一个容器,然后对容器进行自定义配置,当我们配置完毕后,通过docker commint命令就可以生成一个新的镜像
基于Dockerfile构建镜像:我们无需提前运行一个容器,只需要将你所要执行的配置编排到一个Dockerfile文件中,然后直接通过docker build命令自动构建即可!

什么是Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

Dockerfile 的语法格式

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
下面我们来了解一下Dockerfile中常用的操作指令

FROM

FROM 指定基于哪个基础镜像,必须为第一个命令

**语法:**
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
**示例**
FROM php:5.6
注意:
tag和digest是可选的,如何不使用这两个值时,会使用latest版本的基础镜像,并以lates为tag

MAINTAINER 维护者信息

格式:
MAINTAINER <name>
示例:
	MAINTAINER fendo fendo
	MAINTAINER fendo.com
	MAINTAINER fendo fendo <[email protected]>

COPY 复制文件

将本地文件复制到镜像中
格式:
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
COPY指令有两种格式,第一种后边直接跟shell命令,第二种类似于函数调用

ADD 添加文件到镜像

ADD 指令和 COPY 的格式和性质基本一致,但是在 COPY 基础上增加了一些功能:
比如 <源路径> 可以是一个 URL ,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去
如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip , bzip2 以及 xz 的情况下, ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去

RUN 构建镜像时执行的命令

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
格式:
RUN <command>
RUN ["executable", "param1", "param2"]
第一种后边直接跟shell命令:
在linux操作系统上默认 /bin/sh -c,在windows操作系统上默认 cmd /S /C
第二种是类似于函数调用:
可将executable理解成为可执行文件,后面就是两个参数

RUN命令示例

RUN  mkdir -p /opt/tom/web
RUN [“ls”,”-l”,”/opt/tom/web”]

EXPOSE

暴漏容器运行时的监听端口给外部
格式:
EXPOSE port/协议(默认为TCP协议)
注意:
此处暴漏端口并不是直接暴漏给外部,而是允许暴露给外部,你若不通过-p或者-P参数指定端口映射,外部是无法直接访问的

VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点。
容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,在Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
格式:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

WORKDIR 指定工作目录

使用 WORKDIR 指令可以来指定工作目录( 或者称为当前目录) ,以后各层的当前目录就被改为指定的目录,如该目录不存在, WORKDIR 会帮你建立目录
格式:
WORKDIR <工作目录路径>
实例:
比如要在/opt/docker/下创建一个file.txt文件
你可以把/opt定义为工作目录,这样在创建这个文件时直接写相对路径就可以了
WORKDIR /opt
RUN touch docker/file.txt

CMD

容器启动时要运行的命令
格式:
CMD <command>
CMD ["executable","param1","param2"]
CMD ["param1","param2"]

ENTRYPOINT 入口点

ENTRYPOINT  配置容器,容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。和CMD不同是:CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖
格式:
ENTRYPOINT command param1 param2
ENTRYPOINT ["executable", "param1", "param2"]

ENV

 设置环境变量,它主要是为后续的RUN指令提供一个环境变量
格式:
ENV <key> <value>
ENV <key>=<value> ...
示例:
ENV myName fendo
ENV myDog fendo Dog
ENV myCat fendo

USER 指定当前用户

USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。 WORKDIR 是改变工作目录, USER 则是改变之后层的执行 RUN , CMD 以及 ENTRYPOINT 这类命令的身份。当然,和 WORKDIR 一样, USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。
格式
USER <用户名>

ONBUILD 为他人做嫁衣裳

ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN , COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
格式:
ONBUILD [INSTRUCTION]

ONBUILD 示例

比如当前镜像为A,在Dockerfile种添加:
ONBUILD RUN ls -al
这个 ls -al 命令不会在A镜像构建或启动的时候执行
此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行。

HEALTHCHECK 健康检查

容器健康状况检查命令
格式:
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令
[OPTIONS]的选项支持以下三中选项:
--interval=DURATION 两次检查默认的时间间隔为30秒
 --timeout=DURATION 健康检查命令运行超时时长,默认30秒
--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

HEALTHCHECK 健康检查

CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:
0: success - 表示容器是健康的
1: unhealthy - 表示容器已经不能工作了
2: reserved - 保留值
原创文章 167 获赞 6 访问量 4101

猜你喜欢

转载自blog.csdn.net/xiaowoniuwzx/article/details/105854049