Dockerfile
文章目录
概述
Dockerfile
是用来构建Docker
镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X8byTmnG-1661863078456)(C:\Users\yz\Desktop\image-20220826105611886.png)]
官网:https://docs.docker.com/engine/reference/builder/
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单。
步骤:开发、部署、上线运维
Dockerfile:构建文件,定义了一切的步骤,源代码
Dockerimage:通过Dockerfile构建生成的镜像,最终发布和运行的产品
Docker容器:镜像运行起来提供服务
构建步骤:
- 编写Dockerfile文件
- docker build命令构建镜像
- docker run 依镜像运行容器实例
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile构建过程
- 每条保留字指令都必须是大写字母且后面要跟随至少一个参数。
- 指令从上到小顺序执行
- # 表示注释内容
- 每条指令都会创建一个新的镜像层并对镜像进行提交
Dockerfile镜像原理
Dockerfile概念及作用
Dockerfile关键字
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
执行Dockerfile的大致流程
docker
从基础镜像运行一个容器- 执行一条指令并对容器作出修改
- 执行类似
docker commit
的操作提交一个新的镜像层 docker
在基于刚提交的镜像运行一个新的容器- 执行
dockerfile
中的下一条指令直到所有指令都执行完成。
所有指令执行完成。
扩展
从应用软件的角度来看,Dockerfile
、Docker
镜像与Docker
容器分别代表软件的三个不同阶段,
Dockerfile
是软件的原材料Docker
镜像是软件的交付品Docker
容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例Dockerfile
面向开发,Docker
镜像成为交付标准,Docker
容器则涉及部署与运维,三者缺一不可,合力充当Docker
体系的基石。
Dockerfile
,需要定义一个Dockerfile
,Dockerfile
定义了进程需要的一切东西。Dockerfile
涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace
的权限控制)等等;Docker
镜像,在用Dockerfile
定义一个文件之后,docker build
时会产生一个Docker
镜像,当运行Docker
镜像时会真正开始提供服务;Docker
容器,容器是直接提供服务的。
Dockerfile指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建时需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包;添加内容
WORKDIR #镜像工作目录
VOLUME #挂载的目录
EXPOSE #暴露端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY #类似ADD,将我们的文件拷贝至镜像中
ENV #构建的时候设置环境变量
FROM
FROM :定制的镜像都是基于 FROM 的镜像(FROM必须是Docker非空开头的第一行)
语法:
FROM <基础镜像>
LABEL MAINTAINER
LABEL MAINTAINER :添加镜像的作者
语法:
LABEL MAINTAINER [作者] [邮箱]
ENV
ENV :设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
语法:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ARG
ARG :构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
语法:
ARG <参数名>[=<默认值>]
RUN
RUN:用于执行后面跟着的命令行命令。有以下俩种格式:
-
shell 格式:
语法: RUN <命令行的命令> # <命令行的命令> 等同于,在终端操作的 shell 命令。
-
exec 格式:
语法: RUN ["可执行文件", "参数1", "参数2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
- 作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
语法:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPONT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
语法:
ENTRYPOINT <shell 命令>
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
WORKDIR
WORKDIR : 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
WORKDIR <工作目录路径>
COPY
COPY :复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
语法:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
ADD
ADD :ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>;并且源文件目录可以是URL
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
语法:
ADD <src> <dest>
VOLUME
VOLUME :定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
- 避免重要的数据,因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
语法:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
EXPOSE
EXPOSE:仅仅只是声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
语法:
EXPOSE <端口1> [<端口2>...]
USER
USER :用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
语法:
USER <用户名>[:<用户组>]
ONBUILD
ONBUILD :用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
语法:
ONBUILD <其它指令>
docker build
docker build 命令用于使用 Dockerfile 创建镜像。
语法
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
- –build-arg=[] :设置镜像创建时的变量;
- –cpu-shares :设置 cpu 使用权重;
- –cpu-period :限制 CPU CFS周期;
- –cpu-quota :限制 CPU CFS配额;
- –cpuset-cpus :指定使用的CPU id;
- –cpuset-mems :指定使用的内存 id;
- –disable-content-trust :忽略校验,默认开启;
- -f :指定要使用的Dockerfile路径;
- –force-rm :设置镜像过程中删除中间容器;
- –isolation :使用容器隔离技术;
- –label=[] :设置镜像使用的元数据;
- -m :设置内存最大值;
- –memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
- –no-cache :创建镜像的过程不使用缓存;
- –pull :尝试去更新镜像的新版本;
- –quiet, -q :安静模式,成功后只输出镜像 ID;
- –rm :设置镜像成功后删除中间容器;
- –shm-size :设置/dev/shm的大小,默认值是64M;
- –ulimit :Ulimit配置。
- –tag, -t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- –network: 默认 default。在构建期间设置RUN指令的网络模式
使用Dockerfile做apache镜像
FROM centos
LABEL MANTAINER "yqz 1494696995@qq.com"
ENV PATH /usr/local/apache/bin:$PATH
ADD files/apr-1.7.0.tar.gz /usr/src
ADD files/apr-util-1.6.1.tar.gz /usr/src
ADD files/httpd-2.4.54.tar.gz /usr/src
ADD files/entrypoint.sh /
RUN useradd -r -M -s /sbin/nologin apache && \
cd /etc/yum.repos.d && rm -rf * && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo && \
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && \
yum clean all && yum makecache && \
yum -y install gcc gcc-c++ make openssl-devel pcre-devel expat-devel libtool && \
cd /usr/src/apr-1.7.0 && \
sed -i '/$RM "$cfgfile"/d' configure && \
./configure --prefix=/usr/local/apr && \
make && make install && \
cd ../apr-util-1.6.1 && \
./configure --prefix=/usr/local/apr-util --with- apr=/usr/local/apr && \
make && make install && \
cd ../httpd-2.4.54 && \
./configure --prefix=/usr/local/apache \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork && \
make && make install
EXPOSE 80
WORKDIR /usr/local/apache
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
ENTRYPOINT ["/bin/bash","/entrypoint.sh"]