dockerfile案例四:自定义镜像tomcat+发布web项目

准备工作

安装tomcat需要jdk,所以需要准备两个安装包:jdk和tomcat

关于jdk和tomcat的版本兼容问题,需要参考https://hub.docker.com/_/tomcat 中的Supported tags,这里使用jdk8和tomcat8.5.63

1.下载这两个安装包

  • apache-tomcat-8.5.63.tar.gz,下载地址:https://tomcat.apache.org/download-80.cgi
  • jdk-8u281-linux-x64.tar.gz,下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

2. 创建宿主机上下文的目录,此目录将会是存放Dockerfile的目录,同时将docker build过程中需要拷贝到镜像的文件也放到此目录:

mkdir -p /nick/mydockerfile/tomcat8

[root@izbp13m488196e5hna361rz tomcat8]# pwd
/nick/mydockerfile/tomcat8
[root@izbp13m488196e5hna361rz tomcat8]# ll
total 150640
-rw-r--r-- 1 root root         7 Feb 24 15:06 aaa.txt
-rw-r--r-- 1 root root  10515248 Feb 24 11:36 apache-tomcat-8.5.63.tar.gz
-rw-r--r-- 1 root root      1057 Feb 24 15:32 Dockerfile
-rw-r--r-- 1 root root 143722924 Feb 24 11:49 jdk-8u281-linux-x64.tar.gz

编写Dockerfile,构建镜像

Dockerfile如下:

FROM centos
MAINTAINER nick
#把宿主机当前上下文的aaa.txt拷贝到容器/usr/local/路径下,并重命名为container.txt
COPY aaa.txt /usr/local/container.txt
#把宿主机当前路径下的jdk和tomcat包拷贝到容器中,并解压
ADD apache-tomcat-8.5.63.tar.gz /usr/local/
ADD jdk-8u281-linux-x64.tar.gz /usr/local/
#安装VIM
RUN yum install vim -y
#设置容器登录后的工作路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
#设置jdk与tomcat的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.63
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.63
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行监听的端口
EXPOSE 8080
#启动容器时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-8.5.63/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-8.5.63/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-8.5.63/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.63/logs/catalina.out

构建镜像nicktomcat8:docker build -t nicktomcat8 . (不加 -f 参数指定dockerfile的文件名时,将默认寻找当前路径下的Dockerfile文件)

[root@izbp13m488196e5hna361rz tomcat8]# docker build -t nicktomcat8 .
Sending build context to Docker daemon  154.2MB
Step 1/15 : FROM centos
 ---> 300e315adb2f
Step 2/15 : MAINTAINER nick
 ---> Running in a95ed3718ac3
Removing intermediate container a95ed3718ac3
 ---> 25b61859dbb8
Step 3/15 : COPY aaa.txt /usr/local/container.txt
 ---> 43b58bbeabc8
Step 4/15 : ADD apache-tomcat-8.5.63.tar.gz /usr/local/
 ---> 29bbbdde1d4b
Step 5/15 : ADD jdk-8u281-linux-x64.tar.gz /usr/local/
 ---> 842dc624aa24
Step 6/15 : RUN yum install vim -y
 ---> Running in 4ebfd7604119
CentOS Linux 8 - AppStream                      3.5 MB/s | 6.3 MB     00:01    
CentOS Linux 8 - BaseOS                         685 kB/s | 2.3 MB     00:03    
CentOS Linux 8 - Extras                          11 kB/s | 9.0 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-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        116 kB/s |  39 kB     00:00    
(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 610 kB/s |  48 kB     00:00    
(3/5): which-2.21-12.el8.x86_64.rpm             616 kB/s |  49 kB     00:00    
(4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm  1.8 MB/s | 1.4 MB     00:00    
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm    3.3 MB/s | 6.3 MB     00:01    
--------------------------------------------------------------------------------

。。。。。。。

使用nicktomcat8镜像启动容器,并测试

docker run -it -p 8888:8080 nicktomcat8

[root@izbp13m488196e5hna361rz tomcat8]# docker run -it -p 8888:8080 nicktomcat8
Using CATALINA_BASE:   /usr/local/apache-tomcat-8.5.63
Using CATALINA_HOME:   /usr/local/apache-tomcat-8.5.63
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.5.63/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_281
Using CLASSPATH:       /usr/local/apache-tomcat-8.5.63/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.63/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
24-Feb-2021 07:54:27.669 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/8.5.63
24-Feb-2021 07:54:27.671 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Jan 29 2021 11:21:49 UTC

。。。。。。

24-Feb-2021 07:56:35.055 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
24-Feb-2021 07:56:35.069 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 126987 ms

浏览器测试,访问 xxx.xxx.xxx.xxx:8888

tomcat版本正确,测试成功。

再查看容器内文件:

[root@izbp13m488196e5hna361rz tomcat8]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS       PORTS                    NAMES
20edd1660381   nicktomcat8   "/bin/sh -c '/usr/lo…"   2 hours ago   Up 2 hours   0.0.0.0:8888->8080/tcp   inspiring_lumiere
[root@izbp13m488196e5hna361rz tomcat8]# docker exec 20edd1660381 ls
aegis
apache-tomcat-8.5.63
bin
container.txt
etc
games
include
jdk1.8.0_281
lib
lib64
libexec
sbin
share
src
[root@izbp13m488196e5hna361rz tomcat8]# docker exec 20edd1660381 pwd
/usr/local

登录后的工作目录为/usr/local,宿主机上下文中的nick.txt已拷贝至容器并重命名,两个安装包已拷贝至容器并解压。

实际工作中启动tomcat容器

docker run -d \
-p 8888:8080 \
--name mytomcat8 \
-v /nick/mydockerfile/tomcat8/test:/usr/local/apache-tomcat-8.5.63/webapps/test \
-v /nick/mydockerfile/tomcat8/tomcat8logs/:/usr/local/apache-tomcat-8.5.63/logs \
--privileged=true  \
nicktomcat8

说明:

第一个容器卷是对应tomcat容器中的web项目文件夹,方便发布。

第二个容器卷是对应tomcat容器中的日志文件夹,方便跟踪日志。

--privileged=true,使用该参数,container内的root拥有真正的root权限,为了避免在容器内操作时遇到各种permission denied。

启动后宿主机的上下文目录下就多了test和tomcat8logs两个文件夹:

[root@izbp13m488196e5hna361rz tomcat8]# ll
total 150648
-rw-r--r-- 1 root root         7 Feb 24 15:06 aaa.txt
-rw-r--r-- 1 root root  10515248 Feb 24 11:36 apache-tomcat-8.5.63.tar.gz
-rw-r--r-- 1 root root      1057 Feb 24 15:32 Dockerfile
-rw-r--r-- 1 root root 143722924 Feb 24 11:49 jdk-8u281-linux-x64.tar.gz
drwxr-xr-x 2 root root      4096 Feb 24 18:19 test
drwxr-xr-x 2 root root      4096 Feb 24 18:19 tomcat8logs

模拟发布web项目

如上启动容器的时候添加了两个容器卷,其中第一个容器卷对应关联的是tomcat容器webapps下的test工程。

所以只需把代码文件直接放在宿主机的test文件夹中,自动同步至容器内,然后重启容器即可完成发布(这里tomcat可以不重启)。

编写一个abc.jsp和WEB-INF/web.xml放入宿主机的test路径下:

[root@izbp13m488196e5hna361rz test]# pwd
/nick/mydockerfile/tomcat8/test
[root@izbp13m488196e5hna361rz test]# tree
.
├── abc.jsp
└── WEB-INF
    └── web.xml

1 directory, 2 files

abc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    -----------welcome------------
    <%="i am in docker tomcat self "%>
    <br>
    <br>
    <% System.out.println("=============docker tomcat self");%>
  </body>
</html>

WEB-INF/web.xml

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

查看容器,验证jsp和xml页面是否已同步

[root@izbp13m488196e5hna361rz test]# docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED        STATUS        PORTS                    NAMES
9a7a3a08e39b   nicktomcat8   "/bin/sh -c '/usr/lo…"   22 hours ago   Up 22 hours   0.0.0.0:8888->8080/tcp   mytomcat8
[root@izbp13m488196e5hna361rz test]# docker exec 9a ls /usr/local/apache-tomcat-8.5.63/webapps/test
WEB-INF
abc.jsp

在浏览器验证:

 

修改宿主机下的abc.jsp,将welcome改为hello,刷新浏览器页面:

同样,第二个容器卷对应关联的是tomcat容器logs下的日志文件,需要查看日志的话,可以直接在宿主机中查询:

[root@izbp13m488196e5hna361rz tomcat8logs]# pwd
/nick/mydockerfile/tomcat8/tomcat8logs
[root@izbp13m488196e5hna361rz tomcat8logs]# ll
total 36
-rw-r----- 1 root root 8042 Feb 24 20:31 catalina.2021-02-24.log
-rw-r----- 1 root root 526 Feb 25 15:53 catalina.2021-02-25.log
-rw-r----- 1 root root 8632 Feb 25 16:04 catalina.out
-rw-r----- 1 root root 0 Feb 24 18:19 host-manager.2021-02-24.log
-rw-r----- 1 root root 459 Feb 24 18:26 localhost.2021-02-24.log
-rw-r----- 1 root root 1517 Feb 25 04:41 localhost_access_log.2021-02-24.txt
-rw-r----- 1 root root 480 Feb 25 16:04 localhost_access_log.2021-02-25.txt
-rw-r----- 1 root root 0 Feb 24 18:19 manager.2021-02-24.log
[root@izbp13m488196e5hna361rz tomcat8logs]# tail -5f catalina.out
25-Feb-2021 07:53:24.627 INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.reload Reloading context [/test]
25-Feb-2021 07:53:24.627 INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.core.StandardContext.reload Reloading Context with name [/test] has started
25-Feb-2021 07:53:24.676 INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.core.StandardContext.reload Reloading Context with name [/test] is completed
=============docker tomcat self
=============docker tomcat self

访问了两次abc.jsp,所以日志中打印了两次=============docker tomcat self。

 

posted @ 2021-02-25 16:18  酒红色  阅读(246)  评论(0编辑  收藏  举报