DockerFile
dockerfile
是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
DockerFile
构建过程解析
Dockerfile
内容基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker
执行Dockerfile
的大致流程
docker
从基础镜像运行一个容器- 执行一条指令并对容器做出修改
- 执行类似
docker commit
的操作提交一个新的镜像层 docker
再基于刚提交的镜像运行一个新容器- 执行
dockerfile
中的下一条指令直到所有指令都执行完成
从应用软件的角度来看,Dockerfile
、Docker镜像
和Docker容器
分别代表软件的三个不同阶段。
Dockerfile
是软件的原材料Docker镜像
是软件的交付品Docker容器
则可以认为是软件的运行态。
Dockerfile
面向开发、Docker镜像
成为交付标准、Docker容器
则涉及部署和运维,三者缺一不可,合力充当Docker体系的基石。
Dockerfile文件
:Dockerfile
定义了进程需要的一切东西,Dockerfile
涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等。
Docker镜像
:在用Dickerfile
定义一个文件之后,通过docker build
命令会产生一个Docker
镜像,当运行Docker
镜像时,会真正开始提供服务。
Docker容器
:容器是直接提供服务的。
Dockerfile
体系结构
FROM
:说明当前镜像时基于哪个镜像
MAINTAINER
:镜像维护者的姓名和邮箱地址
RUN
:容器构建时需要运行的命令
EXPOSE
:当前容器对外暴露的端口
WORKDIR
:指定在创建容器后,终端默认登陆进来的工作目录
ENV
:用来在构建镜像过程中设置环境变量
ADD
:将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包
COPY
:类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中(源路径)的目录/文件复制到新的一层的镜像内的(目标路径)位置
VOLUME
:容器数据卷,用于数据保存和持久化工作
CMD
:指定一个容器启动时要运行的命令,Dockerfile
中可以有多个CMD
指令,但只有最后一个生效,CMD
会被docker run命令
后面的参数替换
ENTRYPOINT
:指定一个容器启动时要运行的命令,ENTRYPOINT
的目的和CMD
一样,都是在指定容器启动程序的参数
ONBUILD
:当构建一个继承的Dockerfile
时运行命令,父镜像在被子继承后,父镜像的onbuild
被触发,类似构建一个触发器。
Dockerfile案例
Base镜像(scratch)
:Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。
自定义镜像mycentos
-
Docker Hub默认的centos镜像
-
centos目的使我们自己的镜像具备如下:
-
登陆后的默认路径
/usr/local
-
具有vim编辑器
-
能够查看网络配置
ifconfig
支持
-
编写Dockerfile文件
#自定义Centos
#进入容器时落脚点为/usr/local
#具有vim编辑器
#能够通过ifconfig查看ip
#指定自定义镜像的基础镜像
FROM centos
#指定落脚点
ENV path /usr/local
WORKDIR $path
#下载vim编辑器
RUN yum -y install vim
RUN yum -y install net-tools
#容器启动时要运行的命令,但是当存在多个CMD指令时候,只有最后一个会生效
CMD echo $path
CMD echo 镜像制作成功 yyds !!!
CMD /bin/bash
构建镜像
docker build -t 新镜像名称:TAG
[root@centos7 mydocker]# docker build -t mycentos:0.0.1 .
Sending build context to Docker daemon 27.65kB
Step 1/8 : FROM centos
---> 5d0da3dc9764
Step 2/8 : ENV path /usr/local
---> Running in db1f97744d8b
Removing intermediate container db1f97744d8b
---> 5d794b479c05
Step 3/8 : WORKDIR $path
---> Running in 937c50aea15d
Removing intermediate container 937c50aea15d
---> 9338fb574845
Step 4/8 : RUN yum -y install vim
---> Running in 594c6c54534b
CentOS Linux 8 - AppStream 96 kB/s | 9.6 MB 01:42
CentOS Linux 8 - BaseOS 537 kB/s | 8.5 MB 00:16
CentOS Linux 8 - Extras 16 kB/s | 10 kB 00:00
Last metadata expiration check: 0:00:01 ago on Sat Nov 6 13:27:56 2021.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-15.el8 appstream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-17.el8 appstream 39 k
vim-common x86_64 2:8.0.1763-15.el8 appstream 6.3 M
vim-filesystem noarch 2:8.0.1763-15.el8 appstream 48 k
which x86_64 2.21-12.el8 baseos 49 k
Transaction Summary
================================================================================
Install 5 Packages
Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 79 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 55 kB/s | 48 kB 00:00
[MIRROR] which-2.21-12.el8.x86_64.rpm: Status code: 403 for http://mirrors.tuna.tsinghua.edu.cn/centos/8.4.2105/BaseOS/x86_64/os/Packages/which-2.21-12.el8.x86_64.rpm (IP: 101.6.15.130)
(3/5): which-2.21-12.el8.x86_64.rpm 47 kB/s | 49 kB 00:01
(4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 82 kB/s | 1.4 MB 00:16
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm 124 kB/s | 6.3 MB 00:52
--------------------------------------------------------------------------------
Total 146 kB/s | 7.8 MB 00:54
warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-12.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-15.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-15.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-15.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-15.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-15.el8.noarch 4/5
Verifying : which-2.21-12.el8.x86_64 5/5
Installed:
gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-15.el8.x86_64
vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch
which-2.21-12.el8.x86_64
Complete!
Removing intermediate container 594c6c54534b
---> cf4c0605041d
Step 5/8 : RUN yum -y install net-tools
---> Running in 91a6b1162d17
Last metadata expiration check: 0:01:07 ago on Sat Nov 6 13:27:56 2021.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.52.20160912git.el8 baseos 322 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 322 k
Installed size: 942 k
Downloading Packages:
[MIRROR] net-tools-2.0-0.52.20160912git.el8.x86_64.rpm: Status code: 403 for http://mirrors.tuna.tsinghua.edu.cn/centos/8.4.2105/BaseOS/x86_64/os/Packages/net-tools-2.0-0.52.20160912git.el8.x86_64.rpm (IP: 101.6.15.130)
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 366 kB/s | 322 kB 00:00
--------------------------------------------------------------------------------
Total 224 kB/s | 322 kB 00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Installed:
net-tools-2.0-0.52.20160912git.el8.x86_64
Complete!
Removing intermediate container 91a6b1162d17
---> b49a35025e97
Step 6/8 : CMD echo $path
---> Running in c99bf8478bc8
Removing intermediate container c99bf8478bc8
---> 33fb317c3266
Step 7/8 : CMD echo 镜像制作成功 yyds !!!
---> Running in d88c0566b61f
Removing intermediate container d88c0566b61f
---> 1fb74b9f4b8a
Step 8/8 : CMD /bin/bash
---> Running in 3f7becd95978
Removing intermediate container 3f7becd95978
---> fc4973078f26
Successfully built fc4973078f26
Successfully tagged mycentos:0.0.1
运行容器
列出镜像的变更历史
CMD/ENTRYPOINT 镜像案例
CMD指令
-
正常情况下,启动tomcat
在Tomcat的dockerfile中,最后的CMD命令是CMD ["catalina.sh" "run"]
-
当在命令
docker run -it -p 8080:8080 tomcat
后面添加ls -l
后打印信息如下:
查看tomcat
的Dockerfile
文件内容,由WORKDIR /usr/local/tomcat
命令知tomcat
的落脚点为/usr/local/tomcat
,当在docker run -it -p 8080:8080 tomcat
后面添加ls -l
后,由CMD指令的特性:当Dockerfile中存在多个CMD指令的命令时,之后最后一个生效,且cmd指令的命令也可被docker run之后的参数替换,得当执行docker run -it -p 8080:8080 tomcat ls -l
时,tomcat中的CMD ["catalina.sh" "run"]
被替换为CMD ls -l
,而且tomcat
的落脚点为/usr/local/tomcat
,所以ls -l
执行后,是遍历了落脚点下的文件目录。
ENTRYPOINT
- CMD的Shell模式(没有中括号的形式):命令command默认在默认的shell终端执行
CMD给出的是一个容器的默认的可执行体。即容器启动后,默认的执行命令。这表示:如果docker run没有指定任何执行命令或dockerfile里面没有ENTRYPOINT,那么,就会使用CMD指定的默认的执行命令执行。
# CMD命令测试
#基础镜像
FROM centos
CMD echo "hello cmd!!!"
# CMD命令测试
#基础镜像
FROM centos
CMD echo "hello cmd!!!"
CMD echo "娃哈哈"
- CMD命令行模式(中括号的形式):第一个参数必须是命令的全路径
# CMD命令测试
#基础镜像
FROM centos
CMD echo "hello cmd!!!"
CMD echo "娃哈哈"
CMD ["/bin/bash","-c","echo 爽歪歪"]
- ENTRYPOINT命令行模式(中括号形式):docker run命令后面有额外参数,那么后面的参数都会作为ENTRYPOINT的参数,如果后面没有额外的参数,但是dockerfile中有CMD,那么CMD的全部内容会被作为ENTRYPOINT的参数。
# CMD命令测试
#基础镜像
FROM centos
ENTRYPOINT ["echo"]
CMD "哈哈哈"
- ENTRYPOINT的shell模式(没有中括号的模式):这种模式下,任何docker run和CMD的参数都无法被传入到ENTRYPOINT中。
# CMD命令测试
#基础镜像
FROM centos
ENTRYPOINT "echo"
CMD "哈哈哈"
总结:通常情况下,使用ENTRYPOIN的命令行模式作为docker容器启动以后的默认执行命令,里面放的是不变的部分,可变部分,例如命令参数,可以通过docker run方式提供,也可通过CMD指令提供。使用默认参数直接docker run即可,使用其他参数可以在docker run 后面进行参数传递。
ONBUILD指令
#验证onbuild的父镜像的dockerfile
FROM centos
ONBUILD RUN echo "我是用来验证onbuild的父镜像"
#验证onbuild的子镜像的dockerfile
FROM father_image
CMD echo "娃哈哈"
COPY指令和ADD指令
-
dockerfile文件内容
FROM centos MAINTAINER liang #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下 COPY redme.txt /usr/local/redme.txt ##把java与tomcat添加到容器中 ADD jdk-8u161-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.54.tar.gz /usr/local/ ##设置工作访问时候的WORKDIR路径,登录落脚点 ENV MYPATH /usr/local WORKDIR $MYPATH ##配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_161 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.54 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin ##容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat ## ENTRYPOINT ["/usr/local/apache-tomcat-9.0.54/bin/startup.sh" ] ## CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"] CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out
-
构建镜像
[root@centos7 mytomcattest]# docker build -f dockerfile -t mytomcattest .
Sending build context to Docker daemon 201.3MB
Step 1/14 : FROM centos
---> 5d0da3dc9764
Step 2/14 : MAINTAINER liang
---> Running in d7a5335f48e4
Removing intermediate container d7a5335f48e4
---> 3943e9f060e0
Step 3/14 : COPY redme.txt /usr/local/redme.txt
---> 96f5fbba39c1
Step 4/14 : ADD jdk-8u161-linux-x64.tar.gz /usr/local/
---> 0db0cffa851b
Step 5/14 : ADD apache-tomcat-9.0.54.tar.gz /usr/local/
---> 4f5c4e9e9ad1
Step 6/14 : ENV MYPATH /usr/local
---> Running in 7cf581688f4f
Removing intermediate container 7cf581688f4f
---> 80b03b44643d
Step 7/14 : WORKDIR $MYPATH
---> Running in 52e42e5ad29a
Removing intermediate container 52e42e5ad29a
---> e78e3811ee4f
Step 8/14 : ENV JAVA_HOME /usr/local/jdk1.8.0_161
---> Running in ab538350850d
Removing intermediate container ab538350850d
---> fefc40e6413a
Step 9/14 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
---> Running in 380bfbdace4e
Removing intermediate container 380bfbdace4e
---> 7a8d3f740ca8
Step 10/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54
---> Running in 6e8efb91a7ee
Removing intermediate container 6e8efb91a7ee
---> 9c1feba42f8a
Step 11/14 : ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.54
---> Running in 944baa381c46
Removing intermediate container 944baa381c46
---> 864d657d3224
Step 12/14 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
---> Running in 4b7ffa75a27a
Removing intermediate container 4b7ffa75a27a
---> 8566147c47ab
Step 13/14 : EXPOSE 8080
---> Running in c6999fd590a3
Removing intermediate container c6999fd590a3
---> 780fa1e60a37
Step 14/14 : CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out
---> Running in 096718aea21f
Removing intermediate container 096718aea21f
---> 7570653e34a5
Successfully built 7570653e34a5
Successfully tagged mytomcattest:latest
docker run -d -p 9080:8080 --name mytomcattest -v /mytomcattest/tomcat/test:/usr/local/apache-tomcat-9.0.54/webapps/test -v /mytomcattest/tomcat/logs/:/usr/local/apache-tomcat-9.0.54/logs --privileged=true mytomcattest
** 欢迎大家关注我的微信公众号。谢谢!**