DockerFile

⚠ 转载请注明出处:作者:ZobinHuang,更新日期:July 12 2021


知识共享许可协议

    本作品ZobinHuang 采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,在进行使用或分享前请查看权限要求。若发现侵权行为,会采取法律手段维护作者正当合法权益,谢谢配合。


目录

有特定需要的内容直接跳转到相关章节查看即可。

    Section 1. 编写 DockerFile:xxx

    Section 2. docker build 构建镜像:xxx

    Section 3. docker run 运行镜像:xxx

    Section 4. 实例:从头开始制作 Tomcat 镜像:xxx

1. 编写 DockerFile

    DockerFile 是用来构建 docker 镜像的命令参数脚本。DockerFile 是面向软件开发人员的。开发完成后我们要把项目打包成为一个镜像,就必须写 DockerFile。在本小节中,我们将关注如何编写 dockerfile。

    首先我们看一下一些约定:

  • 每个保留的关键字 (指令) 都必须是大写字母
  • 指令从上到下顺序执行
  • # 表示注释
  • 每一个指令都会创建提交一个新的镜像 Layer

    下面我们看一下各个 DockerFile 指令:

指令 描述 例子
FROM 来自哪个基础镜像
1
FROM centos
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 镜像默认工作目录
1
WORKDIR /usr/lib
VOLUME 容器卷挂载,详情可看 Docker 容器数据卷
1
VOLUME ["/volume_1", "/volume_2"]
EXPOSE 用于暴露端口
1
EXPOSE 80
CMD 指定容器运行的时候要执行的指令,只有最后一个指令会生效,可被替代
1
CMD ["ls", "-a"]
ENTRYPOINT 指定容器运行的时候要执行的指令,可以追加参数
1
ENTRYPOINT ["ls", "-a"]
ONBUILD 触发指令。当构建一个被继承的 DockerFile 时就会运行 ONBUILD 指令
COPY 类似 ADD,将文件拷贝到容器中
ENV 构建的时候设置环境变量
1
ENV MYPATH /usr/lib

    另外这里我们可以关注 "CMD" 和 "ENTRYPOINT" 的区别:

    我们可以使用 CMD 命令来指定一条我们进入容器后会被自动执行的命令:

1
CMD ["ls", "-a"]

    当我们写了多条 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
# 先尝试正常运行,不添加任何参数,会发现就直接执行了 ls -a 命令
$ 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

# 追加参数 -l,会发现报错了,这是因为 -l 直接把整个 ls -a 替代了,而 -l 并不是一个命令
$ 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

# 使用完整的命令 ls -al,就能运行成功
$ 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 centos
ENTRYPOINT ["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
# 先尝试正常运行,不添加任何参数,会发现就直接执行了 ls -a 命令
$ 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

# 追加参数 -l,会发现追加成功
$ 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

# 尝试使用完整的命令 ls -al,发现运行失败,因为 ENTRYPOINT 是追加参数而不是替换命令
$ 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 centos

# 开发人员信息
MAINTAINER zobinHuang<zobin1999@gmail.com>

# 设置环境变量 MYPATH
ENV MYPATH /usr/local

# 设置工作目录,此处即为 MYPATH 指向的目录
WORKDIR $MYPATH

# 执行一些指令 (此处为使用 yum 安装 vim 和 net-tools)
RUN yum -y install vim
RUN yum -y install net-tools

# 暴露 80 端口
EXPOSE 80

# 最后是运行容器的时候要运行的命令
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash

2. docker build 构建镜像

    下面我们通过运行 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 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 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

    在完成镜像构建后,我们就拿到了我们自己制作的镜像,可以尝试运行了。

3. docker run 运行镜像

    首先基于我们上一小节的操作,确认我们的镜像构建成功了:

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 #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
922f57a2c33c 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
00fd34ae930e 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
c8c0857ae36c 16 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
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 #(nop) WORKDIR /usr/local 0B
d98e0af00e56 16 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
a579f8eb098d 16 minutes ago /bin/sh -c #(nop) MAINTAINER zobinHuang<zob… 0B
300e315adb2f 7 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 7 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 7 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB

    我们使用 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

# 首先我们发现,我们进入容器后的目录是我们使用 WORKDIR 设置的目录
[root@8c7bc0c111c6 local]$ pwd
/usr/local

# 测试 ifconfig 命令,发现也生效了 (原生的 centos 镜像是没有 net-tools 的)
[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

4. 实例:从头开始制作 Tomcat 镜像

    在本小节,我们将尝试自己从头开始制作 Tomcat 镜像。首先我们需要准备 tomcat 的压缩包和 jdk 的压缩包 (i.e. 分别前往官网获取下载链接:Apache TomcatOracle Java SE Development Kit 8 Downloads),Oracle JDK 由于存在 SSO 登录下载机制,所以只能够下载到本地再上传到服务器,Tomcat 压缩包则可以直接命令行下载:

1
2
# 下载 tomcat.tar.gz
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 centos

MAINTAINER 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/local
WORKDIR $MYPATH

# JAVA 环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_291
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# TOMCAT 环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.8
ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.8

# 配置 PATH
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 暴露端口
EXPOSE 8080

# 启动 Tomcat
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 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 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