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。