目录
Dockerfile文件编写
1.什么是Dockerfile
2. Dockerfile作用
3.dockerfile 的基本结构:
4.dockerfile指令:
FROM 指定基础镜像,dockerfile构建镜像的第一个指令
LABEL 指定镜像维护人信息
ADD/COPY 复制本地文件/目录到镜像中
RUN 指定Linux命令,建议多个命令用 && 或 ; 串起来使用
ENV 设置镜像环境变量
EXPOSE 暴露容器端口
VOLUME 指定容器的匿名数据卷
USER 指定容器运行用户
WORKDIR 指定镜像的工作目录
ARG 指定构建镜像时传入的参数
CMD/ENTRYPOINT 指定容器启动时执行的命令
指令之间的区别:
5.Dockerfile构建过程:
基础知识:
构建镜像和运行容器:
思路:
6.实战练习
7.注意事项
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。dockerfile的原理就是镜像分层。
Dockerfile 用于指示 docker image build 命令自动构建Image的源代码是纯文本文件。
Eg:FROM centos:centos7.9.2009
Eg:LABEL ZhangSan [email protected]
COPY 指令用于将本地文件复制到容器中。可以复制单个文件,也可以复制整个目录。
语法格式:
COPY src dest
COPY ["src", "dest"]
解析:
Eg:COPY test.txt /absoluteDir/
ADD 将宿主机目录下(或远程文件)的文件拷贝进镜像,且会自动处理URL和解压tar压缩包。
语法格式:
ADD URL /dest #将文件下载到容器内部并以dest命名
ADD URL /dest/ #将文件下载到容器内的/dest目录
ADD src /dest/ #将本地文件传到容器/dest目录下,压缩文件会自动解压
解析:
Eg:ADD alertmanager-0.19.0.linux-amd64.tar.gz /usr/local/bin
语法格式:
RUN <命令行命令> ( shell 形式, /bin/sh -c 的方式运行,避免破坏shell字符串)
Eg: RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量;相当于定义(赋值)。
Eg:ENV CATALINA_HOME /usr/local/tomcat
WORKDIR $CATALINA_HOME
EXPOSE指令实际上不会发布端口。 它充当构建映像的人员和运行容器的人员之间的一种文档,即有关打算发布哪些端口的信息。
Eg:EXPOSE 80/tcp
Eg: VOLUME /var/log
作用:把容器的某些文件夹映射到主机外部
解析:
指定该镜像以及构建镜像时的命令以什么样的用户去执行,如果不指定,默认是root。(一般不修改该配置),可搭配COPY使用。
语法格式:
USER
Eg:USER patrick
USER 1000:1000
WORKDIR指令为Dockerfile中跟随它的所有 RUN,CMD,ENTRYPOINT,COPY,ADD 指令设置工作目 录。 如果WORKDIR不存在,即使以后的Dockerfile指令中未使用它也将被创建。
WORKDIR指令可在Dockerfile中多次使用。如果提供了相对路径,则它将相对于上一个WORKDIR指令的路径。
Eg:WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
#结果 /a/b/c
构建时--build-arg 指定参数会覆盖Dockerfile 中指定的同名参数 docker build --build-arg 变量=值
ARG只在构建期有效,运行期无效,且一次只能指定一个参数
Eg:ARG version=3.13.4
FROM alpine:$version
语法格式:
CMD command param1 param2
CMD ["param1","param2"]
ENTRYPOINT ["executable", "param1", "param2"]
Eg:CMD ["1111"]
CMD ["2222"]
ENTRYPOINT ["echo"]
#构建出如上镜像后测试
docker run xxxx:效果 echo 2222
COPY只能复制本地文件/目录到镜像中
ADD不光可以复制本地文件/目录到镜像中,还可以通过URL下载文件复制到镜像中,还能将本地tar压缩包解压后复制到镜像中。(URL下载和tar包解压特性不能一起使用)
CMD 提供容器默认的执行命令,可以被运行容器时传入的命令覆盖。
ENTRYPOINT 配置容器启动时执行的默认可执行文件,可以被运行容器时传入的命令追加到其参数之后。
ENTRYPOINT 指定的容器启动时运行命令优先级更高,如果 ENTRYPOINT 和 CMD 同时存在,CMD 指定内容将作为 ENTRYPOINT 指定的命令的选项或参数去使用
保存好 Dockerfile 后,可以使用以下命令构建镜像。在Docker中,docker build -t my-node-app . 中的小数点代表当前上下文的路径。这个路径是构建过程中 Docker 引擎查找 Dockerfile 和其他构建上下文的文件的位置。
docker build 命令会将指定的路径(这里是小数点 .)作为构建上下文。构建上下文是构建过程中用来查找 Dockerfile 和其他构建文件的目录。在这个例子中,. 表示当前目录,即你运行 docker build 命令的目录。
Eg:docker build -f Dockerfile -t entrytest .
编写Dockerfile文件,构建entrytest镜像,
要求:
基于centos镜像,输出hello world
#编写Dockerfile文件
[root@master Monitor]# vi Dockerfile
FROM centos:centos7.9.2009
ENTRYPOINT ["echo","hello"]
CMD ["world"]
#运行容器,传递参数
[root@master Monitor]# docker build -f Dockerfile -t entrytest .
Sending build context to Docker daemon 360.5MB
Step 1/3 : FROM centos:centos7.9.2009
---> eeb6ee3f44bd
Step 2/3 : ENTRYPOINT ["echo","hello"]
---> Running in 92f02cf3ef33
Removing intermediate container 92f02cf3ef33
---> dd20bc124389
Step 3/3 : CMD ["world"]
---> Running in 3826cda9251a
Removing intermediate container 3826cda9251a
---> 5acc8a29cae8
Successfully built 5acc8a29cae8
Successfully tagged entrytest:latest
[root@master Monitor]# docker run entrytest
hello world
[root@master Monitor]# docker run entrytest yun
hello yun
1.如果不指定Dockerfile文件,Dockerfile的命名必须为Dockerfile。大小写不能变。
2.构建镜像的时候要看好你的文件是不是这个目录,要不然打到一半会报错,说找不到文件,切记要记得放文件,在放文件的目录执行。
3.如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
4. Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。
5. 用 VOLUME 声明了卷,那么以后对于卷内容的修改会被丢弃,即在dockerfile构建的时候无法再修改使用volume挂载出去的目录,所以, 一定在volume声明之前修改内容 ;另外docker commit提交新镜像的的时候也不会继承之前镜像的卷