[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指令
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
CMD:设置一个启动命令
构建的镜像 run 后调用,也就是在容器启动时才进行调用
格式:
CMD command(执行的命令)
注:
CMD 不同于 RUN,CMD 用于指定在容器启动时所要执行的 命令,而RUN 用于镜像指定构建时所要执行的命令。
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才能指定端口
VOLUME : 指定存储卷
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data", "/var/log", "/mnt"]
注:
还是需要 -v 映射挂载才可以使用,VOLUME 指定的是容器的路径,有个提示的作用,告诉我们需要挂载到容器内哪些目录来使用这个镜像。
查看挂载点
df -h
ARG : 指定运行时变量
用于指定构建镜像中运行的变量
格式:
ARG 变量名=默认的变量值(可以不写)
示例:
ARG NAME
ARG username=liudehua
使用场景:
定义一个构建镜像的模板,不知道以后要装什么东西,可以先在构建镜像的Dockerfile文件里面定义变量名,构建镜像的时候传入参数(自己想要安装的rmp包名),比较方便。
ONBUILD : 触发器
当当前的镜像作为基础镜像时执行
格式:
ONBUILD 指令(ADD、RUN之类的)
示例:
ONBUILD ADD . /app/src
ONBUILD RUN rm -rf /
注:
构建自己的镜像的时候,在构建镜像的文件中加入ONBUILD 指令,这样你构建的镜像被人当作基础镜像时候的时候,就会触发你设置的ONBUILD 指令。如果不想别人使用你的镜像,便可以这样操作。
ADD:添加文件到镜像
可以把本地的文件添加到镜像中,tar 类型文件会自动解压。也可以访问网络资源,但是网络压缩资源不会被解压
格式:
ADD hom* /mydir/ # 支持使用 * 表示hom开头的都添加
ADD hom?.txt /mydir/ # hom开头 .txt结尾的都添加
ADD 宿主主机路径 镜像路径
COPY:复制文件到镜像
功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源
语法:
COPY 宿主主机路径 镜像路径
提示:
指令逻辑和 ADD 十分相似,镜像路径可以是一个绝对路径,也可以是相对路径(相对路径的对象是WORKDIR的路径)。
ADD和COPY之间的区别<
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 构建镜像时候不使用缓存