[Dockerfile构建镜像]

构建镜像

构建镜像的特征(前提)


1、需要基础环境
2、可执行命令
3、启动命令

Dockerfile


	Dockerfile 由一行行命令语句组成, 并且支持以 # 开头的注释行。一般而言, Dockerfile 主体内容分为四 部分:基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。

	Docker 以从上到下的顺序运行 Dockerfile 的指令。为了指定基本映像,第一条指令必须是 FROM。一个声 明以#字符开头则被视为注释。可以在 Docker 文件中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令。

	1、Dockerfile命名:Dockerfile

	2、Dockerfile是由指令组成(Dockerfile指令必须大写)

	3、实现基础环境:FROM

	4、可执行命令:RUN

	5、启动命令(指定命令必须运行在前台):CMD # 镜像启动后执行的命令

	6、开始构建:docker build -t [镜像名称] . ( . 指代的就是Dockerfile文件所在路径)

	7、docker build --no-cache 是禁止构建镜像使用缓存

[Dockerfile构建镜像]-LMLPHP

Dockerfile指令

FROM :指定基础镜像


以什么镜像为基础来构建自己的镜像,必须指定

格式:

    FROM <image>
    FROM <image>:<tag>
    FROM <image>@<digest>

示例:

	FROM mysql:5.6

注: tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像

MAINTAINER :维护者信息


可以备注一些信息,名字、联系方式等等一些信息,可以不写

格式:

    MAINTAINER <info>

示例:

    MAINTAINER username
    MAINTAINER [email protected]
    MAINTAINER Jusername [email protected]

RUN :执行一个命令


	构建镜像的时候,执行什么命令!执行的命令结果可以在构建的镜像中体现。

	如果 执行 echo 命令,则会构建镜像中 打印 echo 打印的信息,也可以安装一些 rpm 包,镜像启动后,容器中就会带有安装好的 rpm 。

格式:

    RUN <command>

注意:

	RUN 的每次执行应该是以根目录为当前位置

	RUN 指令创建的中间镜像会被缓存,只要不改变并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建 时指定--no-cache 参数,如:docker build --no-cache

[Dockerfile构建镜像]-LMLPHP

CMD:设置一个启动命令


构建的镜像 run 后调用,也就是在容器启动时才进行调用

格式:

	CMD command(执行的命令)

注:

	CMD 不同于 RUN,CMD 用于指定在容器启动时所要执行的 命令,而RUN 用于镜像指定构建时所要执行的命令。

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

WORKDIR:设置工作目录


容器启动后,默认所在的目录位置,进入容器就在这个目录

格式:

	WORKDIR /path/to/workdir

示例:

    WORKDIR /a (这时工作目录为/a)
    WORKDIR b (这时工作目录为/a/b)
    WORKDIR c (这时工作目录为/a/b/c)

注:

	通过 WORKDIR 设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。在使用 docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。

ENV:设置容器内默认的环境变量


格式:

	ENV <key> <value>
	#<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置 一个变量

	ENV <key>=<value> ...
	#可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果 <key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行

示例:

	ENV myName liudehua
	ENV myName=wuyanzu

EXPOSE:指定于外界交互的端口


对外暴露(开放)的端口 可以跟多个端口 也可指定协议

格式:

	EXPOSE <port> [<port>...多个端口号]

示例:

	EXPOSE 80
	EXPOSE 8080 9998
	EXPOSE 11211/tcp 11211/udp

注:

	EXPOSE 并不会让容器的端口访问到主机。要使其可访问,需要在 docker run 运行容器时通过-p 来 发布这些端口,或通过-P 参数来发布 EXPOSE 导出的所有端口.
	如果不使用EXPOSE指定端口,使用-大P也不会映射端口,只有-小p才能指定端口

[Dockerfile构建镜像]-LMLPHP

VOLUME : 指定存储卷


格式:

	VOLUME ["/path/to/dir"]

示例:

	VOLUME ["/data", "/var/log", "/mnt"]

注:

	还是需要 -v 映射挂载才可以使用,VOLUME 指定的是容器的路径,有个提示的作用,告诉我们需要挂载到容器内哪些目录来使用这个镜像。

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

查看挂载点


df -h

[Dockerfile构建镜像]-LMLPHP

ARG : 指定运行时变量


用于指定构建镜像中运行的变量

格式:

	ARG 变量名=默认的变量值(可以不写)

示例:

	ARG NAME
	ARG username=liudehua

使用场景:

	定义一个构建镜像的模板,不知道以后要装什么东西,可以先在构建镜像的Dockerfile文件里面定义变量名,构建镜像的时候传入参数(自己想要安装的rmp包名),比较方便。

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

ONBUILD : 触发器


当当前的镜像作为基础镜像时执行

格式:

	ONBUILD 指令(ADD、RUN之类的)

示例:

	ONBUILD ADD . /app/src
	ONBUILD RUN rm -rf /

注:

	构建自己的镜像的时候,在构建镜像的文件中加入ONBUILD 指令,这样你构建的镜像被人当作基础镜像时候的时候,就会触发你设置的ONBUILD 指令。如果不想别人使用你的镜像,便可以这样操作。

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

[Dockerfile构建镜像]-LMLPHP

ADD:添加文件到镜像


可以把本地的文件添加到镜像中,tar 类型文件会自动解压。也可以访问网络资源,但是网络压缩资源不会被解压

格式:

	ADD hom* /mydir/ 	 # 支持使用 * 表示hom开头的都添加
	ADD hom?.txt /mydir/ # hom开头 .txt结尾的都添加
	ADD 宿主主机路径 镜像路径

COPY:复制文件到镜像


功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源

语法:

	COPY 宿主主机路径 镜像路径

提示:

	指令逻辑和 ADD 十分相似,镜像路径可以是一个绝对路径,也可以是相对路径(相对路径的对象是WORKDIR的路径)。

ADDCOPY之间的区别<

	1、ADD 支持解压(tar类型的压缩包),COPY不支持

		ADD 从宿主主机添加到容器目录里面的文件如果是压缩包,ADD添加到容器中会自动解压,COPY则不会自动解压,COPY添加什么就是什么。

	2、ADD支持网络下载(不支持解压),COPY不支持

		COPY 后面第一个参数跟 URL 会直接提示来源不能是一个 URL ,ADD 则可以下载 网络资源,支持网络的下载 ,但是下载是压缩文件也不会自动解压。

	3、ADD和COPY : 当镜像中目录不存在时,需要加/结尾。当镜像中目录存在时,则没有区别。

		如果镜像目录不存在,也没有 / 结尾,宿主主机的文件,会在容器中改成镜像指定目录的名字。如果镜像目录最后 / 结尾,宿主主机的文件则会在容器的镜像指定目录下,也就是说 / 结尾 容器中如果不存在镜像指定目录,会先创建目录,然后再把宿主的文件放在目录下。

Dockerfile 构建镜像案例


FROM centos7   # 基础镜像

MAINTAINER Alvin [email protected] # 备注信息

RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 执行指令

RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 执行指令

RUN yum makecache  # 执行指令

RUN yum update -y  # 执行指令

RUN yum install python3 -y  # 执行指令

RUN pip3 install django  # 执行指令

COPY docker /root/docker  # 复制宿主主机目录 到 镜像

WORKDIR /root/docker  # 设定容器的默认目录

EXPOSE 8080  # 对外开放端口

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8080"] # 设置启动命令

docker build 开始构建镜像


docker build 参数  PATH | URL | -

其中PATH代表含有Dockfile的目录,当然也可以是URL中含有Dockerfile

常用参数:

    -t  --tag list  指定生成镜像标签,格式为name:tag

    	docker bulid -t django:998 .

    -f, --file string  单独指定Dockerfile文件位置

    	docker build -t django:998 -f mysql(构建镜像使用的文件名) .

    --build-arg list  设置构建时的变量

    	docker build --build-args=NAME=liudehua
    	docker build --build-args=STR='python3 httpd-tools'

    --no-cache  构建镜像时候不使用缓存

06-28 07:31