2

『现学现忘』Docker基础 — 39、实战:自定义Tomcat9镜像 - 繁华似锦Fighting

 1 year ago
source link: https://www.cnblogs.com/liuyuelinfighting/p/16415468.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

『现学现忘』Docker基础 — 39、实战:自定义Tomcat9镜像

  • 以ContOS镜像为基础镜像,自定义一个tomcat9的镜像。
  • 镜像可以正常运行,外界可以访问。
  • 与宿主机与tomcat9之间配置挂载。
  • 部署一个简单的WEB项目,外界可以访问。

准备tomcat压缩包,因为tomcat的运行需要JDK,所以也需要JDK8的压缩包。

  • apache-tomcat-9.0.44.tar.gz
  • jdk-8u11-linux-x64.tar.gz

都上传到服务器的/home/mydockerfile/tomcat9目录中。

shell
/home/mydockerfile/tomcat9
[root@192 tomcat9]# ll
总用量 166516
-rw-r--r--. 1 root root  11487016 3月  21 00:18 apache-tomcat-9.0.44.tar.gz
-rw-r--r--. 1 root root 159019376 3月  21 00:18 jdk-8u11-linux-x64.tar.gz

创建一个readme.txt文件,用于之后的宿主机与容器之间的拷贝。

创建一个Dockerfile文件,就命名为Dockerfile

shell
[root@192 tomcat9]# touch readme.txt
[root@192 tomcat9]# touch Dockerfile
[root@192 tomcat9]# ll
总用量 166516
-rw-r--r--. 1 root root  11487016 3月  21 00:18 apache-tomcat-9.0.44.tar.gz
-rw-r--r--. 1 root root         0 3月  21 00:39 Dockerfile
-rw-r--r--. 1 root root 159019376 3月  21 00:18 jdk-8u11-linux-x64.tar.gz
-rw-r--r--. 1 root root         0 3月  21 00:39 readme.txt

提示:Dockerfile文件,官方推荐命名为Dockerfile,在使用docker build命令的时候,会自动去寻找这个Dockerfile文件,就不需要在用-f参数指定Dockerfile文件的位置了。

3、编写Dockerfile文件

Dockerfile文件配置内容如下:

dockerfile
FROM centos
MAINTAINER wukong<[email protected]>

# 把宿主机当前上下文的readme.txt拷贝到容器/usr/local/路径下
# 并把readme.txt文件重命名cincontainer.txt文件
COPY readme.txt /usr/local/cincontainer.txt

# 把宿主机当前上下文的(也就是当前目录)java与tomcat安装包添加到容器中
ADD apache-tomcat-9.0.44.tar.gz /usr/local/
ADD jdk-8u11-linux-x64.tar.gz /usr/local/

# 安装vim编辑器
RUN yum -y install vim

# 设置工作访问时候的MORKDIR路径,登录DE 落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH

# 配置java与tomcat环境变量
# 配置java环境
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # 通过冒号隔开
# 配置tomcat环境
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.44
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.44
# 把上面配置的环境放入到PATH环境变量中
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 容器运行时监听的端口(暴露端口)
EXPOSE 8080

# 启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.44/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.44/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.44/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.44/bin/logs/catalina.out
# && 表示拼接下一条命令,可以无线的拼接。

4、构建镜像

执行命令:docker build -t diytomcat9 .

shell
# 因为我的Dockerfile文件的名字为Dockerfile,所以不用-f指定。
[root@192 tomcat9]# docker build -t diytomcat9 .
Sending build context to Docker daemon  170.5MB
Step 1/15 : FROM centos
 ---> 300e315adb2f
Step 2/15 : MAINTAINER wukong<[email protected]>
 ---> Running in 221cc10c9504
Removing intermediate container 221cc10c9504
 ---> 797f5aef897a
Step 3/15 : COPY readme.txt /usr/local/cincontainer.txt
 ---> 6797005a229e
Step 4/15 : ADD apache-tomcat-9.0.44.tar.gz /usr/local/
 ---> f4d05cb84de6
Step 5/15 : ADD jdk-8u11-linux-x64.tar.gz /usr/local/
 ---> 2c18597493ed
Step 6/15 : RUN yum -y install vim
 ---> Running in 7cb17ddf6345
CentOS Linux 8 - AppStream                      2.1 MB/s | 6.3 MB     00:02
CentOS Linux 8 - BaseOS                         1.9 MB/s | 2.3 MB     00:01
CentOS Linux 8 - Extras                         9.0 kB/s | 9.2 kB     00:01
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-15.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-15.el8.x86_64.rpm        224 kB/s |  39 kB     00:00
(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 328 kB/s |  48 kB     00:00
(3/5): which-2.21-12.el8.x86_64.rpm             342 kB/s |  49 kB     00:00
(4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm  2.5 MB/s | 1.4 MB     00:00
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm    6.0 MB/s | 6.3 MB     00:01
--------------------------------------------------------------------------------
Total                                           3.7 MB/s | 7.8 MB     00:02
warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS Linux 8 - AppStream                      232 kB/s | 1.6 kB     00:00
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <[email protected]>"
 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-15.el8.x86_64                          4/5
  Running scriptlet: gpm-libs-1.20.7-15.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-15.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-15.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 7cb17ddf6345
 ---> 1dee8c82dc2c
Step 7/15 : ENV MYPATH /usr/local
 ---> Running in 1d5abe930a75
Removing intermediate container 1d5abe930a75
 ---> 970df33afcc8
Step 8/15 : WORKDIR $MYPATH
 ---> Running in 0580d08c8588
Removing intermediate container 0580d08c8588
 ---> 2e3126bbb258
Step 9/15 : ENV JAVA_HOME /usr/local/jdk1.8.0_11
 ---> Running in 440abce7bbf6
Removing intermediate container 440abce7bbf6
 ---> 075a1599971e
Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ---> Running in d85b8a9112bb
Removing intermediate container d85b8a9112bb
 ---> 3eb9c75d976f
Step 11/15 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.44
 ---> Running in 8de5817880b1
Removing intermediate container 8de5817880b1
 ---> 7be89ad718f3
Step 12/15 : ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.44
 ---> Running in 2ef1b3c43df0
Removing intermediate container 2ef1b3c43df0
 ---> b1f2bb8b9971
Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 ---> Running in c088d27cac3b
Removing intermediate container c088d27cac3b
 ---> e86039cdf1c9
Step 14/15 : EXPOSE 8080
 ---> Running in f541217004bc
Removing intermediate container f541217004bc
 ---> 253c3aa2bbfa
Step 15/15 : CMD /usr/local/apache-tomcat-9.0.44/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.44/bin/logs/catalina.out
 ---> Running in b5ba1a9c9c7f
Removing intermediate container b5ba1a9c9c7f
 ---> 12988584a30e
Successfully built 12988584a30e
Successfully tagged diytomcat9:latest


[root@192 tomcat9]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
diytomcat9   latest    12988584a30e   3 minutes ago   607MB
centos       latest    300e315adb2f   3 months ago    209MB

此时我的diytomcat9镜像就再宿主机生成,该diytomcat9镜像自身带有tomcat9的运行时环境。当我们启动容器后,该容器就对外提供tomcat服务。

5、启动镜像

执行如下命令,启动diytomcat9镜像。

shell
docker run -p 9090:8080 \
--name wukongtomcat \
-v /home/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.44/webapps/test \
-v /home/mydockerfile/tomcat9/tomcatlogs:/usr/local/apache-tomcat-9.0.44/logs \
--privileged=true \
-d diytomcat9

Docker挂载主机目录的时候,如果Docker访问出现cannot open directory.:Permission denied问题。

解决办法:在挂载目录后多加一个--privileged=true参数即可。

shell
# 查看本地Docker镜像
[root@192 tomcat9]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
diytomcat9   latest    12988584a30e   3 minutes ago   607MB
centos       latest    300e315adb2f   3 months ago    209MB

# 启动容器(以后工作中启动容器的命令要比这还多)
[root@192 tomcat9]# docker run -p 9090:8080 \
> --name wukongtomcat \
> -v /home/mydockerfile/tomcat9/test:/url/local/apache-tomcat-9.0.44/webapps/test \
> -v /home/mydockerfile/tomcat9/tomcatlogs:/url/local/apache-tomcat-9.0.44/logs \
> --privileged=true \
> -d diytomcat9
9d23344e364d80e773a55cf9c507b75a034a1900fdf0c98e27266d99ceb5b06d

# 查看当前正在运行的容器
[root@192 tomcat9]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS         PORTS                    NAMES
9d23344e364d   diytomcat9   "/bin/sh -c '/usr/lo…"   11 seconds ago   Up 9 seconds   0.0.0.0:9090->8080/tcp   wukongtomcat

查看宿主机的挂载是否配置成功。

shell
[root@192 tomcat9]# pwd
/home/mydockerfile/tomcat9
[root@192 tomcat9]# ll
总用量 166520
-rw-r--r--. 1 root root  11487016 3月  21 00:18 apache-tomcat-9.0.44.tar.gz
-rw-r--r--. 1 root root       643 3月  21 01:46 Dockerfile
-rw-r--r--. 1 root root 159019376 3月  21 00:18 jdk-8u11-linux-x64.tar.gz
-rw-r--r--. 1 root root         0 3月  21 00:39 readme.txt
drwxr-xr-x. 2 root root         6 3月  21 01:58 test # 这里
drwxr-xr-x. 2 root root         6 3月  21 01:58 tomcatlogs # 这里

说明数据卷挂载成功。

接下来我们查看宿主机上传的文件是否存在,还有容器的中的运行环境。

shell
# 查看/usr/local/目录中的内容
# 发现我们上传的cincontainer.txt和tomcat、jdk都有,没有问题。
[root@192 tomcat9]# docker exec wukongtomcat ls -l
total 0
drwxr-xr-x. 1 root root  45 Mar 20 17:47 apache-tomcat-9.0.44
drwxr-xr-x. 2 root root   6 Nov  3 15:22 bin
-rw-r--r--. 1 root root   0 Mar 20 16:39 cincontainer.txt
drwxr-xr-x. 2 root root   6 Nov  3 15:22 etc
drwxr-xr-x. 2 root root   6 Nov  3 15:22 games
drwxr-xr-x. 2 root root   6 Nov  3 15:22 include
drwxr-xr-x. 8   10  143 255 Jun 17  2014 jdk1.8.0_11
drwxr-xr-x. 2 root root   6 Nov  3 15:22 lib
drwxr-xr-x. 3 root root  17 Dec  4 17:37 lib64
drwxr-xr-x. 2 root root   6 Nov  3 15:22 libexec
drwxr-xr-x. 2 root root   6 Nov  3 15:22 sbin
drwxr-xr-x. 5 root root  49 Dec  4 17:37 share
drwxr-xr-x. 2 root root   6 Nov  3 15:22 src

# 接下来我们查看一下java的版本
# 说明java的运行时环境是配置正常的。
[root@192 tomcat9]# docker exec wukongtomcat java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

# 如果还想进行其他的验证,可以自己去执行。

6、验证容器是否能够访问

我们可以使用curl命令进行本地访问。

也可以使用外部浏览器进行访问。

我们在浏览器中输入:http://192.168.134.129:9090/,看是否能够查看到Tomcat的欢迎界面。

909968-20220627105443335-1306290860.png

7、向容器中部署WEB项目,同时验证数据卷挂载

我们通过容器启动命令,先来说明一下tomcat9镜像部署项目的原理。

shell
docker run -p 9090:8080 \
--name wukongtomcat \
-v /home/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.44/webapps/test \
-v /home/mydockerfile/tomcat9/tomcatlogs:/usr/local/apache-tomcat-9.0.44/logs \
--privileged=true \
-d diytomcat9
  • 宿主机的/home/mydockerfile/tomcat9/test目录和容器中/usr/local/apache-tomcat-9.0.44/webapps/test目录是挂载的,也就是这两个目录中的内容是同步的。
  • 我们知道在Tomcat中webapps目录是发布项目工程的目录,所以test目录相当于一个项目工程。我在宿主机中把项目文件放入test目录中,会自动同步到容器中webapps目录的test目录中。这样我们就可以在宿主机本地,发布一个项目到容器中了。
  • 同理宿主机的/home/mydockerfile/tomcat9/tomcatlogs目录和容器中/usr/local/apache-tomcat-9.0.44/logs目录是挂载的,所以容器中Tomcat服务产生的日志,我们在宿主机上都可以查看到,并且持久化到了宿主机。

(1)准备一个简单的WEB项目

我们创建两个文件和一个文件夹放入宿主机的/home/mydockerfile/tomcat9/test

他们之间的目录结构如下:

909968-20220627105459372-402584033.png

web.xml文件内容如下:

xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

</web-app>

index.jsp文件内容如下:

jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>hello wukong ,hello docker</title>
  </head>
  <body>
    Hello World!hello docker!
    <br />
    <% System.out.println("-----Congratulations--hello-docker----"); %>
  </body>
</html>

(2)访问验证

我们在宿主机/home/mydockerfile/tomcat9/test目录中创建的文件,会自动同步到容器中/usr/local/apache-tomcat-9.0.44/webapps/test目录里。

这时我们可以直接在浏览器中访问http://192.168.134.129:9090/test,查看一下是否能够访问成功。

提示:可以docker restart重启一下容器。

909968-20220627105518717-2071299335.png

访问成功。

我们也可以在宿主机中查看tomcat容器的tomcat服务日志。

shell
# 查看当前工作目录
[root@192 tomcatlogs]# pwd
/home/mydockerfile/tomcat9/tomcatlogs

# 查看当前目录文件
[root@192 tomcatlogs]# ll
总用量 48
-rw-r-----. 1 root root  6286 3月  21 03:47 catalina.2021-03-20.log
-rw-r-----. 1 root root  6289 3月  21 12:23 catalina.2021-03-21.log
-rw-r-----. 1 root root 12631 3月  21 12:48 catalina.out
-rw-r-----. 1 root root     0 3月  21 03:47 host-manager.2021-03-20.log
-rw-r-----. 1 root root     0 3月  21 12:23 host-manager.2021-03-21.log
-rw-r-----. 1 root root   408 3月  21 03:47 localhost.2021-03-20.log
-rw-r-----. 1 root root   408 3月  21 12:23 localhost.2021-03-21.log
-rw-r-----. 1 root root   225 3月  21 03:48 localhost_access_log.2021-03-20.txt
-rw-r-----. 1 root root   225 3月  21 12:48 localhost_access_log.2021-03-21.txt
-rw-r-----. 1 root root     0 3月  21 03:47 manager.2021-03-20.log
-rw-r-----. 1 root root     0 3月  21 12:23 manager.2021-03-21.log

# 查看tomcat日志
[root@192 tomcatlogs]# cat catalina.out
... #省略
-----Congratulations--hello-docker----
-----Congratulations--hello-docker----
-----Congratulations--hello-docker----
-----Congratulations--hello-docker----
[root@192 tomcatlogs]#

容器是正常运行的,相关文件都可以查看到,证明我们的tomcat9镜像配置没有问题。

我们以后开发的步骤:需要掌握Dokcerfile的编写,之后的一切都是使用Docker镜像来发布运行!

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK