⚠ 转载请注明出处:作者:ZobinHuang,更新日期:July 12 2021
目录
有特定需要的内容直接跳转到相关章节查看即可。
DockerFile 是用来构建 docker 镜像的命令参数脚本。DockerFile 是面向软件开发人员的。开发完成后我们要把项目打包成为一个镜像,就必须写 DockerFile。在本小节中,我们将关注如何编写 dockerfile。
首先我们看一下一些约定:
每个保留的关键字 (指令) 都必须是大写字母
指令从上到下顺序执行
# 表示注释
每一个指令都会创建提交一个新的镜像 Layer
下面我们看一下各个 DockerFile 指令:
指令
描述
例子
FROM
来自哪个基础镜像
MAINTAINER
镜像开发者信息 (姓名+邮箱)
1 MAINTAINER zobinHuang<zobin1999@gmail.com>
RUN
镜像构建的时候需要运行的命令
1 RUN yum install -y net-tools
ADD
基于基础镜像,向我们的新镜像中拷贝文件(一般是压缩文件),并且会自动解压
1 ADD centos-8-x86_64.tar.xz
WORKDIR
镜像默认工作目录
VOLUME
容器卷挂载,详情可看 Docker 容器数据卷
1 VOLUME ["/volume_1" , "/volume_2" ]
EXPOSE
用于暴露端口
CMD
指定容器运行的时候要执行的指令,只有最后一个指令会生效,可被替代
ENTRYPOINT
指定容器运行的时候要执行的指令,可以追加参数
ONBUILD
触发指令。当构建一个被继承的 DockerFile 时就会运行 ONBUILD 指令
COPY
类似 ADD,将文件拷贝到容器中
ENV
构建的时候设置环境变量
另外这里我们可以关注 "CMD" 和 "ENTRYPOINT" 的区别:
我们可以使用 CMD 命令来指定一条我们进入容器后会被自动执行的命令:
当我们写了多条 CMD 命令时,只有最后一条 CMD 命令会被执行,这是由于 CMD 命令的替代机制。另外,假设我们基于包含 "CMD ls -a" 的 DockerFile 构建镜像并且启动容器,假设我们想在命令行中追加参数,我们会得到下面的结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 $ docker run -it mycentos:0.2 . .dockerenv dev home lib64 media opt root sbin sys usr .. bin etc lib lost+found mnt proc run srv tmp var $ docker run -it mycentos:0.2 -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec : "-l" : executable file not found in $PATH : unknown. ERRO[0000] error waiting for container: context canceled $ docker run -it mycentos:0.2 ls -al total 0 drwxr-xr-x. 1 root root 6 Jul 12 07:06 . drwxr-xr-x. 1 root root 6 Jul 12 07:06 .. -rwxr-xr-x. 1 root root 0 Jul 12 07:06 .dockerenv lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x. 5 root root 360 Jul 12 07:06 dev drwxr-xr-x. 1 root root 66 Jul 12 07:06 etc drwxr-xr-x. 2 root root 6 Nov 3 2020 home lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------. 2 root root 6 Dec 4 2020 lost+found drwxr-xr-x. 2 root root 6 Nov 3 2020 media drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt drwxr-xr-x. 2 root root 6 Nov 3 2020 opt dr-xr-xr-x. 421 root root 0 Jul 12 07:06 proc dr-xr-x---. 2 root root 162 Dec 4 2020 root drwxr-xr-x. 11 root root 163 Dec 4 2020 run lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Nov 3 2020 srv dr-xr-xr-x. 13 root root 0 Jun 10 06:14 sys drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp drwxr-xr-x. 12 root root 144 Dec 4 2020 usr drwxr-xr-x. 20 root root 262 Dec 4 2020 var
现在我们改写为 ENTRYPOINT 的形式,首先修改 DockerFile 文件并且构建镜像:
1 2 FROM centosENTRYPOINT ["ls" , "-a" ]
我们运行这个镜像,注意和 CMD 的情况进行对比:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 $ docker run -it mycentos:0.3 . .dockerenv dev home lib64 media opt root sbin sys usr .. bin etc lib lost+found mnt proc run srv tmp var $ docker run -it mycentos:0.3 -l total 0 drwxr-xr-x. 1 root root 6 Jul 12 07:16 . drwxr-xr-x. 1 root root 6 Jul 12 07:16 .. -rwxr-xr-x. 1 root root 0 Jul 12 07:16 .dockerenv lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x. 5 root root 360 Jul 12 07:16 dev drwxr-xr-x. 1 root root 66 Jul 12 07:16 etc drwxr-xr-x. 2 root root 6 Nov 3 2020 home lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------. 2 root root 6 Dec 4 2020 lost+found drwxr-xr-x. 2 root root 6 Nov 3 2020 media drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt drwxr-xr-x. 2 root root 6 Nov 3 2020 opt dr-xr-xr-x. 455 root root 0 Jul 12 07:16 proc dr-xr-x---. 2 root root 162 Dec 4 2020 root drwxr-xr-x. 11 root root 163 Dec 4 2020 run lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Nov 3 2020 srv dr-xr-xr-x. 13 root root 0 Jun 10 06:14 sys drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp drwxr-xr-x. 12 root root 144 Dec 4 2020 usr drwxr-xr-x. 20 root root 262 Dec 4 2020 var $ docker run -it mycentos:0.3 ls -al ls : cannot access 'ls' : No such file or directory
下面我们尝试基于现有的 centos 镜像构建我们的新镜像。首先编写一个 DockerFile 文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 FROM centosMAINTAINER zobinHuang<zobin1999@gmail.com>ENV MYPATH /usr/localWORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "-----end-----" CMD /bin/bash
下面我们通过运行 docker build 命令来根据我们在上一小节中写的 dockerfile 文件,构建出我们的自定义 centos 镜像:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 $ docker build -f mydockerfile -t mycentos:0.1 . Sending build context to Docker daemon 2.048kB Step 1/10 : FROM centos ---> 300e315adb2f Step 2/10 : MAINTAINER zobinHuang<zobin1999@gmail.com> ---> Running in 9d0317f73816 Removing intermediate container 9d0317f73816 ---> a579f8eb098d Step 3/10 : ENV MYPATH /usr/local ---> Running in 15a1d23a3c96 Removing intermediate container 15a1d23a3c96 ---> d98e0af00e56 Step 4/10 : WORKDIR $MYPATH ---> Running in 5432f1e8604e Removing intermediate container 5432f1e8604e ---> 0ce65f0b522c Step 5/10 : RUN yum -y install vim ---> Running in 169c675ed9f4 CentOS Linux 8 - AppStream 5.3 MB/s | 8.1 MB 00:01 CentOS Linux 8 - BaseOS 465 kB/s | 3.6 MB 00:07 CentOS Linux 8 - Extras 16 kB/s | 9.8 kB 00:00 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 kTransaction 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 34 kB/s | 39 kB 00:01 (2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 795 kB/s | 48 kB 00:00 (3/5): which-2.21-12.el8.x86_64.rpm 298 kB/s | 49 kB 00:00 (4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 758 kB/s | 1.4 MB 00:01 (5/5): vim-common-8.0.1763-15.el8.x86_64.rpm 2.4 MB/s | 6.3 MB 00:02 -------------------------------------------------------------------------------- Total 906 kB/s | 7.8 MB 00:08 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 169c675ed9f4 ---> 6ccedf5de6fd Step 6/10 : RUN yum -y install net-tools ---> Running in b10d6ba94a8e Last metadata expiration check: 0:00:16 ago on Mon Jul 12 06:27:31 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: net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 955 kB/s | 322 kB 00:00 -------------------------------------------------------------------------------- Total 411 kB/s | 322 kB 00:00 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 b10d6ba94a8e ---> 502d91d3d7a4 Step 7/10 : EXPOSE 80 ---> Running in e0b0f8b70713 Removing intermediate container e0b0f8b70713 ---> c8c0857ae36c Step 8/10 : CMD echo $MYPATH ---> Running in 28e24c189b3d Removing intermediate container 28e24c189b3d ---> 00fd34ae930e Step 9/10 : CMD echo "-----end-----" ---> Running in b31ece01c408 Removing intermediate container b31ece01c408 ---> 922f57a2c33c Step 10/10 : CMD /bin/bash ---> Running in f49b27f0fd20 Removing intermediate container f49b27f0fd20 ---> a2fbe914cbd0 Successfully built a2fbe914cbd0 Successfully tagged mycentos:0.1
在完成镜像构建后,我们就拿到了我们自己制作的镜像,可以尝试运行了。
首先基于我们上一小节的操作,确认我们的镜像构建成功了:
1 2 3 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 0.1 a2fbe914cbd0 7 minutes ago 299MB
我们可以使用 docker history 命令来查看这个镜像的构建历史:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $ docker history a2fbe914cbd0 IMAGE CREATED CREATED BY SIZE COMMENT a2fbe914cbd0 16 minutes ago /bin/sh -c 922f57a2c33c 16 minutes ago /bin/sh -c 00fd34ae930e 16 minutes ago /bin/sh -c c8c0857ae36c 16 minutes ago /bin/sh -c 502d91d3d7a4 16 minutes ago /bin/sh -c yum -y install net-tools 26.6MB 6ccedf5de6fd 16 minutes ago /bin/sh -c yum -y install vim 63.4MB 0ce65f0b522c 16 minutes ago /bin/sh -c d98e0af00e56 16 minutes ago /bin/sh -c a579f8eb098d 16 minutes ago /bin/sh -c 300e315adb2f 7 months ago /bin/sh -c <missing> 7 months ago /bin/sh -c <missing> 7 months ago /bin/sh -c
我们使用 docker run 启动容器并且进入容器观察一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [root@ks dockerfile_example]$ docker run -it mycentos:0.1 [root@8c7bc0c111c6 local ]$ pwd /usr/local [root@8c7bc0c111c6 local ]$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 25 bytes 2915 (2.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在本小节,我们将尝试自己从头开始制作 Tomcat 镜像。首先我们需要准备 tomcat 的压缩包和 jdk 的压缩包 (i.e. 分别前往官网获取下载链接:Apache Tomcat 和 Oracle Java SE Development Kit 8 Downloads ),Oracle JDK 由于存在 SSO 登录下载机制,所以只能够下载到本地再上传到服务器,Tomcat 压缩包则可以直接命令行下载:
1 2 wget https://mirrors.ocf.berkeley.edu/apache/tomcat/tomcat-10/v10.0.8/bin/apache-tomcat-10.0.8.tar.gz
这样子我们现在目录下准备好两个压缩包:
1 2 $ ls apache-tomcat-10.0.8.tar.gz jdk-8u291-linux-aarch64.tar.gz
然后我们编写一个较为复杂的 DockerFile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 FROM centosMAINTAINER zobinHuang<zobin1999@gmail.com>ADD jdk-8u291-linux-x64.tar.gz /usr/local ADD apache-tomcat-10.0.8.tar.gz /usr/local RUN yum -y install vim ENV MYPATH /usr/localWORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0 _291ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-10.0 .8 ENV CATALINA_BASH /usr/local/apache-tomcat-10.0 .8 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080 CMD /usr/local/apache-tomcat-10.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.8/bin/logs/catalina.out
然后我们使用 docker build 来构建我们的镜像:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 $ docker build -t mytomcat . Sending build context to Docker daemon 156.8MB Step 1/14 : FROM centos ---> 300e315adb2f Step 2/14 : MAINTAINER zobinHuang<zobin1999@gmail.com> ---> Using cache ---> a579f8eb098d Step 3/14 : ADD jdk-8u291-linux-x64.tar.gz /usr/local ---> 2a1e0dd51de7 Step 4/14 : ADD apache-tomcat-10.0.8.tar.gz /usr/local ---> c135a9661417 Step 5/14 : RUN yum -y install vim ---> Running in e34ffe9ad2b4 CentOS Linux 8 - AppStream 2.1 MB/s | 8.1 MB 00:03 CentOS Linux 8 - BaseOS 1.6 MB/s | 3.6 MB 00:02 CentOS Linux 8 - Extras 1.1 kB/s | 9.8 kB 00:08 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 kTransaction 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 109 kB/s | 39 kB 00:00 (2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 769 kB/s | 48 kB 00:00 (3/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 1.3 MB/s | 1.4 MB 00:01 (4/5): vim-common-8.0.1763-15.el8.x86_64.rpm 3.1 MB/s | 6.3 MB 00:02 (5/5): which-2.21-12.el8.x86_64.rpm 9.4 kB/s | 49 kB 00:05 -------------------------------------------------------------------------------- Total 1.1 MB/s | 7.8 MB 00:06 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 e34ffe9ad2b4 ---> d3ad66e5405a Step 6/14 : ENV MYPATH /usr/local ---> Running in deddbfd1b257 Removing intermediate container deddbfd1b257 ---> f082e35c0001 Step 7/14 : WORKDIR $MYPATH ---> Running in 4ed9b14663b1 Removing intermediate container 4ed9b14663b1 ---> 8873fb923d98 Step 8/14 : ENV JAVA_HOME /usr/local/jdk1.8.0_291 ---> Running in 41827bbc1688 Removing intermediate container 41827bbc1688 ---> 06f1739afc02 Step 9/14 : ENV CLASSPATH $JAVA_HOME /lib/dt.jar:$JAVA_HOME /lib/tools.jar ---> Running in 08ed38dcf477 Removing intermediate container 08ed38dcf477 ---> 33c9924c05bc Step 10/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.8 ---> Running in 08a8436bd05e Removing intermediate container 08a8436bd05e ---> 988e9af753c8 Step 11/14 : ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.8 ---> Running in b1ab57eae67b Removing intermediate container b1ab57eae67b ---> 552e962ef7bb Step 12/14 : ENV PATH $PATH :$JAVA_HOME /bin:$CATALINA_HOME /lib:$CATALINA_HOME /bin ---> Running in dfa06ae91fed Removing intermediate container dfa06ae91fed ---> 9aef46472ddf Step 13/14 : EXPOSE 8080 ---> Running in c9395f889af4 Removing intermediate container c9395f889af4 ---> ee6b906badb7 Step 14/14 : CMD /usr/local/apache-tomcat-10.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.8/bin/logs/catalina.out ---> Running in 42f0f2629b35 Removing intermediate container 42f0f2629b35 ---> 3a678aa6d0fc Successfully built 3a678aa6d0fc Successfully tagged mytomcat:latest
然后我们将这个容器运行起来,并且附上数据卷挂载的内容:
1 2 $ docker run -d -p 9090:8080 --name mytomcat01 -v /home/tomcat_example/build/test:/usr/local/apache-tomcat-10.0.8/webapps/test -v /home/tomcat_example/build/tomcatlogs/:/usr/local/apache-tomcat-10.0.8/logs mytomcat 5c87c810084900fe545659108fbb744b12a61a7019f8a702eaee27a325eaba05
启动之后,我们可以访问我们的 Tomcat,发现访问成功:
由于我们做了卷挂载,所以我们现在直接在本地就能实现网页发布。我们在本地挂载的目录下创建这样的结构:
1 2 3 4 5 6 7 8 9 10 $ pwd /home/tomcat_example/build/test $ tree . . ├── index.jsp └── WEB-INF └── web.xml 1 directory, 2 files
我们在 index.html 中写下下面的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 <!DOCTYPE html> <html> <head> <meta charset="utf-8" > <title>zobin!</title> </head> <body> <% System.out.println("log test" ); %> <h1>Diy our Tomcat!</h1> </body> </html>
我们在 ./WEB-INF/web.xml 下写下下面的内容:
1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app > <servlet > <servlet-name > Test</servlet-name > <servlet-class > moreservlets.TestServlet</servlet-class > </servlet > </web-app >
我们尝试访问我们 web-root-path/test 这个 root,其中 web-root-path 是 "ip:绑定的端口号",我们可以发现已经发布成功:
我们此时查看我们的日志,也可以发现日志内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ pwd /home/tomcat_example/build/tomcatlogs $ ls catalina.2021-07-12.log catalina.out localhost.2021-07-12.log localhost_access_log.2021-07-12.txt $ cat catalina.out ...省略 log test log test log test log test log test log test log test log test log test