『现学现忘』Docker基础 — 39、实战:自定义Tomcat9镜像 - 繁华似锦Fighting
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
目录中。
/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
。
[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文件配置内容如下:
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 .
# 因为我的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
镜像。
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
参数即可。
# 查看本地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
查看宿主机的挂载是否配置成功。
[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 # 这里
说明数据卷挂载成功。
接下来我们查看宿主机上传的文件是否存在,还有容器的中的运行环境。
# 查看/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的欢迎界面。
7、向容器中部署WEB项目,同时验证数据卷挂载
我们通过容器启动命令,先来说明一下tomcat9
镜像部署项目的原理。
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
。
他们之间的目录结构如下:
web.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
文件内容如下:
<%@ 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
重启一下容器。
访问成功。
我们也可以在宿主机中查看tomcat
容器的tomcat
服务日志。
# 查看当前工作目录 [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__
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK