tomcat镜像使用-dockerfile构建和官方镜像-都使用自定义配置文件
以下宿主机IP都是: 192.168.224.130
一、Dockfile使用centos基础镜像自定义构建tomcat8+jdk1.8镜像——自定义配置文件和修改配置文件
1.自定义tomcat配置文件构建tomcat8镜像
[root@localhost ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.09.3
[root@localhost ~]# ls
apache-tomcat-8.0.32.tar.gz jdk-8u65-linux-x64.gz
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost ~]# ls
apache-tomcat-8.0.32.tar.gz c.txt Dockerfile jdk-8u65-linux-x64.gz
[root@localhost ~]# cat c.txt
ccc
[root@localhost ~]# cat Dockerfile #创建Dockerfile文件
#Dockerfile文件构建新镜像
#Base centos 基础镜像 (他妈妈是谁)
FROM centos
#Maintainer 维护者信息(他爸爸是谁)
MAINTAINER shi 1441107787@qq.com
#把宿主机当前目录的c.txt文件拷贝到容器的/usr/local/路径下,并重命名为cc.txt,也可不重命名
COPY c.txt /usr/local/cc.txt
#RUN,在容器里运行命令
RUN useradd -s /sbin/nologin -M tomcat
#安装vim
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,即默认登录容器的落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#ADD在构建容器肚子里添加什么文件,添加的文件需和Dockerfile文件同一目录,tar.gz的会自动解压,下面将文件添加到容器/usr/local/下
ADD jdk-8u65-linux-x64.gz /usr/local/
ADD apache-tomcat-8.0.32.tar.gz /usr/local/
#下面配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_65
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.32
ENV CATALINA_BASE /usr/local/apache-tomcat-8.0.32
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#下面为对外一个8080端口
EXPOSE 8080
#下面为执行启动tomcat的命令,下面4条命令都可以启动tomcat,加tail的,交互创建容器后即可能查看启动日志,若catalina.sh执行的,不加tail,交互时也可自动查看日志
CMD ["/usr/local/apache-tomcat-8.0.32/bin/catalina.sh","run"]
#CMD /usr/local/apache-tomcat-8.0.32/bin/catalina.sh run
#CMD /usr/local/apache-tomcat-8.0.32/bin/catalina.sh run && tail -F /usr/local/apache-tomcat-8.0.32/logs/catalina.out
#CMD /usr/local/apache-tomcat-8.0.32/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.32/logs/catalina.out
#CMD /usr/local/apache-tomcat-8.0.32/bin/startup.sh #单独该条不行,若加上tail -F ...则可以,上面的就可以
[root@localhost ~]# docker build -t mycangku/mytomcat:8-v1 /root/ #根据Dockerfile文件使用基础镜像构建新镜像,/root也可写成点.
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycangku/mytomcat 8-v1 8b44ca849052 About a minute ago 719MB
centos latest 1e1148e4cc2c 3 months ago 202MB
#使用新镜像运行tomcat容器
[root@localhost ~]# docker run -d -p 8080:8080 --name tomcat1 -v /media/tomcat8/test:/usr/local/apache-tomcat-8.0.32/webapps/test -v /media/tomcat8/tomcat8logs:/usr/local/apache-tomcat-8.0.32/logs mycangku/mytomcat:8-v1
#注意:映射的宿主机目录:/media/tomcat8/test可以事先没有,会自动创建。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09a300c63cf8 mycangku/mytomcat:8-v1 "/usr/local/apache-t…" 7 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp tomcat1
[root@localhost ~]# tree /media/
/media/
└── tomcat8
├── test
└── tomcat8logs
├── catalina.2019-03-20.log
├── host-manager.2019-03-20.log
├── localhost.2019-03-20.log
├── localhost_access_log.2019-03-20.txt
└── manager.2019-03-20.log
[root@localhost ~]# docker exec -it tomcat1 cat /usr/local/apache-tomcat-8.0.32/conf/server.xml
………
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
………
<Host name="localhost" appBase="webapps" #默认容器站点目录
unpackWARs="true" autoDeploy="true">
………
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/apache-tomcat-8.0.32/webapps
ROOT docs examples host-manager manager test
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/apache-tomcat-8.0.32/webapps/ROOT
RELEASE-NOTES.txt bg-button.png bg-upper.png tomcat-power.gif tomcat.svg
WEB-INF bg-middle.png build.xml tomcat.css
asf-logo-wide.gif bg-nav-item.png favicon.ico tomcat.gif
asf-logo.png bg-nav.png index.jsp tomcat.png
#客户端访问默认的tomcat页面(虽然映射了站点目录,但是因配置文件配置的站点目录和容器内默认站点目录都是默认状态)
[root@localhost ~]# curl localhost:8080
能访问tomcat默认页面,外网也能访问。
[root@localhost ~]# curl 192.168.224.130:8080
能访问tomcat默认页面,外网也能访问。
创建自定义tomcat的配置文件,修改站点目录位置,默认容器站点目录是webapps,修改成:/tmp: #创建自定义tomcat配置文件
[root@localhost ~]# ls
apache-tomcat-8.0.32.tar.gz c.txt Dockerfile jdk-8u65-linux-x64.gz server.xml
[root@localhost ~]# cat server.xml
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="/tmp"
unpackWARs="true" autoDeploy="true">
<!-- 容器内默认站点目录是:webapps,现在修改为自定义位置为:/tmp -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
将自定义的tomcat的配置文件cp到容器中,替换容器的配置文件:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09a300c63cf8 mycangku/mytomcat:8-v1 "/usr/local/apache-t…" 17 minutes ago Up 17 minutes 0.0.0.0:8080->8080/tcp tomcat1
[root@localhost ~]# docker cp server.xml tomcat1:/usr/local/apache-tomcat-8.0.32/conf/server.xml
[root@localhost ~]# docker restart tomcat1 #重启容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09a300c63cf8 mycangku/mytomcat:8-v1 "/usr/local/apache-t…" 19 minutes ago Up 3 seconds 0.0.0.0:8080->8080/tcp tomcat1
站点目录修改后,访问不到服务:
[root@localhost ~]# curl localhost:8080
不能访问tomcat默认页面,因为站点目录位置已更改
[root@localhost ~]# curl 192.168.224.130:8080
不能访问tomcat默认页面,因为站点目录位置已更改
重新发布代码到新站点目录后,能访问到服务:
[root@localhost ~]# docker exec -it tomcat1 cat /usr/local/apache-tomcat-8.0.32/conf/server.xml
……
</Realm>
<Host name="localhost" appBase="/tmp"
unpackWARs="true" autoDeploy="true">
<!-- 容器内默认站点目录是:webapps,现在修改为自定义位置为:/tmp -->
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
……
[root@localhost ~]# docker exec -it tomcat1 mkdir /tmp/ROOT #不进入容器,但在容器新站点目录下创建ROOT文件夹
[root@localhost ~]# echo 666 > index.html
[root@localhost ~]# ls
apache-tomcat-8.0.32.tar.gz c.txt Dockerfile index.html jdk-8u65-linux-x64.gz server.xml
[root@localhost ~]# docker cp index.html tomcat1:/tmp/ROOT #重新发布代码到新的站点目录下
[root@localhost ~]# docker exec -it tomcat1 ls /tmp/ROOT
index.html
[root@localhost ~]# docker exec -it tomcat1 cat /tmp/ROOT/index.html
666
重新发布代码到新站点目录后,能访问tomcat服务:
[root@localhost ~]# curl localhost:8080
666 能访问tomcat网站,且外网也能访问
[root@localhost ~]# curl 192.168.224.130:8080
666 能访问tomcat网站,且外网也能访问
注意:查看容器服务日志:两种方法
[root@localhost ~]# docker logs tomcat1 #方法1,可查看容器日志
[root@localhost ~]# ls /media/tomcat8/tomcat8logs/ #方法2,到映射目录中查看日志
catalina.2019-03-20.log host-manager.2019-03-20.log localhost.2019-03-20.log localhost_access_log.2019-03-20.txt manager.2019-03-20.log
二、使用tomcat镜像仓库中镜像,tomcat:latest(最新版)版本,但用自定义的配置文件替换默认配置文件
[root@localhost ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.09.3
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker search tomcat #搜索tomcat镜像
1)先运行一个容器,分析一下容器的配置文件位置和日志目录位置: 这样才能根据用自定义的配置文件覆盖或追加到容器里
[root@localhost ~]# docker run -d --name tomcat1 -v /tmp:/tmp -p 8081:8080 tomcat:latest #运行容器并映射宿主机目录作为以后站点目录
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f1aa4c5fc38 tomcat:latest "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:8081->8080/tcp tomcat1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest dd6ff929584a 2 weeks ago 463MB
[root@localhost ~]# curl localhost:8081
能访问tomcat, 同时外网浏览器也能访问
[root@localhost ~]# curl 192.168.224.130:8081
能访问tomcat, 同时外网浏览器也能访问
#下面是分析容器内的tomcat配置文件的位置:——不进入容器查看容器内配置文件:
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/
bin etc games include lib man sbin share src tomcat
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/tomcat
BUILDING.txt NOTICE RUNNING.txt include native-jni-lib work
CONTRIBUTING.md README.md bin lib temp
LICENSE RELEASE-NOTES conf logs webapps
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/tomcat/logs
catalina.2019-03-21.log localhost_access_log.2019-03-21.txt
host-manager.2019-03-21.log manager.2019-03-21.log
localhost.2019-03-21.log
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/tomcat/conf
Catalina context.xml logging.properties tomcat-users.xsd
catalina.policy jaspic-providers.xml server.xml web.xml
catalina.properties jaspic-providers.xsd tomcat-users.xml
[root@localhost ~]# docker exec -it tomcat1 cat /usr/local/tomcat/conf/server.xml
……
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
……
<Host name="localhost" appBase="webapps" #容器内默认站点目录
unpackWARs="true" autoDeploy="true">
……
容器内配置文件和日志目录分析结果:
容器内默认配置文件位置:/usr/local/tomcat/conf/server.xml
容器内默认日志文件位置:/usr/local/tomcat/logs
2)分析好tomcat容器配置文件位置后,先删除测试的容器,运行新的全面目录映射的容器(配置文件和日志文件目录和站点目录映射)
[root@localhost ~]# docker rm -f tomcat1
[root@localhost ~]# docker rmi tomcat
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost ~]# docker run -d -p 8081:8080 --name tomcat1 \
> -v /media/tomcat8/test:/usr/local/tomcat/webapps \
> -v /media/tomcat8/tomcat8logs:/usr/local/tomcat/logs \
> tomcat:latest #回车即可
#注意:映射的宿主机目录:/media/tomcat8/test可以事先没有,会自动创建。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
387344daf016 tomcat:latest "catalina.sh run" 9 seconds ago Up 8 seconds 0.0.0.0:8081->8080/tcp tomcat1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest dd6ff929584a 2 weeks ago 463MB
3)查看宿主机和容器目录映射
……
"Source": "/media/tomcat8/tomcat8logs",
"Destination": "/usr/local/tomcat/logs",
……
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/tomcat/logs
catalina.2019-03-21.log localhost_access_log.2019-03-21.txt
host-manager.2019-03-21.log manager.2019-03-21.log
localhost.2019-03-21.log
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/tomcat/conf
Catalina context.xml logging.properties tomcat-users.xsd
catalina.policy jaspic-providers.xml server.xml web.xml
catalina.properties jaspic-providers.xsd tomcat-users.xml
[root@localhost ~]# tree /media/
/media/
└── tomcat8
├── test
└── tomcat8logs
├── catalina.2019-03-21.log
├── host-manager.2019-03-21.log
├── localhost.2019-03-21.log
├── localhost_access_log.2019-03-21.txt
└── manager.2019-03-21.log
4)模拟发布代码,发布到映射的宿主机目录,即可对应容器站点目录
[root@localhost ~]# mkdir /media/tomcat8/test/ROOT
[root@localhost ~]# echo 111 > /media/tomcat8/test/ROOT/index.html
[root@localhost ~]# ls /media/tomcat8/test/ROOT/
index.html
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/tomcat/webapps
ROOT
[root@localhost ~]# docker exec -it tomcat1 ls /usr/local/tomcat/webapps/ROOT
index.html
[root@localhost ~]# curl localhost:8081
111
[root@localhost ~]# curl 192.168.224.130:8081
111
5)自定义自己修改的tomcat配置文件,如:修改站点目录位置为/tmp:
[root@localhost ~]# docker cp tomcat1:/usr/local/tomcat/conf/server.xml server.xml
[root@localhost ~]# ls server.xml
server.xml
[root@localhost ~]# vim server.xml
……
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
……
<Host name="localhost" appBase="/tmp" #修改成自定义的配置文件,修改站点目录位置为/tmp,其他不变
unpackWARs="true" autoDeploy="true">
……
6)将自定义修改的tomcat配置文件cp到容器内并覆盖容器的默认配置文件
[root@localhost ~]# docker cp server.xml tomcat1:/usr/local/tomcat/conf/server.xml
[root@localhost ~]# docker exec -it tomcat1 cat /usr/local/tomcat/conf/server.xml
……
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
……
<Host name="localhost" appBase="/tmp" #tomcat容器内站点目录位置已修改
unpackWARs="true" autoDeploy="true">
……
7)重启容器
[root@localhost ~]# docker restart tomcat1
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
387344daf016 tomcat:latest "catalina.sh run" 15 minutes ago Up 11 seconds 0.0.0.0:8081->8080/tcp tomcat1
[root@localhost ~]# curl localhost:8081
不能访问tomcat,因为站点目录已经修改
[root@localhost ~]# curl 192.168.224.130:8081
不能访问tomcat,因为站点目录已经修改
8)模拟发布代码到容器新站点目录,——注意,新站点目录和宿主机没有映射关系,所以需要想办法将代码弄到容器内新站点目录才行(各种方法)
[root@localhost ~]# docker exec -it tomcat1 mkdir /tmp/ROOT #不进入容器,在容器/tmp站点目录创建根目录ROOT
[root@localhost ~]# echo 222 > index.html
[root@localhost ~]# cat index.html
222
[root@localhost ~]# docker cp index.html tomcat1:/tmp/ROOT
[root@localhost ~]# docker exec -it tomcat1 ls /tmp/ROOT #不进容器查看容器内站点目录代码
index.html
[root@localhost ~]# docker exec -it tomcat1 cat /tmp/ROOT/index.html
222
[root@localhost ~]# curl localhost:8081
222 同时外网浏览器也能访问
[root@localhost ~]# curl 192.168.224.130:8081
222 同时外网浏览器也能访问
注意1:
运行tomcat容器时候不一定就映射容器内端口的8080,也可修改端口如:80,但是容器里配置文件里的端口也修改成80端口,重启容器即可,重启容器映射的端口不消失。
步骤1:docker run -d --name tomcat1 -v /tmp:/tmp -p 8081:80 tomcat:latest
步骤2:然后修改容器里配置文件为80端口,或者在容器外先修改server.xml的端口为80,然后再docker cp …到容器里去,重启容器也可。
注意2:查看容器服务日志:两种方法
[root@localhost ~]# docker logs tomcat1 #方法1,可查看容器日志
[root@localhost ~]# ls /media/tomcat8/tomcat8logs/ #方法2,到映射目录中查看日志
catalina.2019-03-20.log host-manager.2019-03-20.log localhost.2019-03-20.log localhost_access_log.2019-03-20.txt manager.2019-03-20.log
举一反三:
1)上面两个例子,如论是自定构建镜像,还是使用tomcat的官方镜像,都是使用了自定义的配置文件。
2)无论构建镜像时引用自定义配置文件,还是创建容器后,使用docker cp 命令将容器内配置文件替换成自定义配置文件,都可以做到应用自己定义的配置文件,替换好自己的配置文件后,重启容器即可应用自己的配置。
附加注意:——非常重要,生产环境使用映射最全参数(docker容器和宿主机的2种目录映射和1种配置文件映射)
docker容器和宿主机也可实现配置文件的映射,这样可以方便在宿主机路径修改配置文件,就可间接修改容器的配置文件。但是前提是首先准备好自定义的配置文件,然后使用参数-v做映射,即:宿主机需要事先存在自定义的配置文件和路径,这样才能映射,若宿主机不存在该配置文件路径,v映射时候会把宿主机的配置文件路径当成目录映射给容器,这样容器的所有配置文件的目录就会被覆盖,使得容器运行不起来,并且报错如下:
失败例子:/usr/local/docker/tomcat8/conf/server.xml文件必须宿主机事先存在,否则会报如下错误:
[root@node1 ~]# docker run -d -p 8085:8085 --name tomcat8 \
> -v /usr/local/docker/tomcat8/conf/server.xml:/usr/local/tomcat/conf/server.xml \
> -v /usr/local/docker/tomcat8/webapps:/usr/local/tomcat/webapps/web \
> -v /usr/local/docker/tomcat8/logs:/usr/local/tomcat/logs \
> tomcat:latest
303ef636430254737edc14af4f39c84a35a55afd30ecfec51042908ab095c729
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/usr/local/docker/tomcat8/conf/server.xml\\\" to rootfs \\\"/var/lib/docker/overlay2/4c0ae63dbc134ec9b508a0a67e7be9d3c284b0719ca3ea27e0399bf19d3d9e76/merged\\\" at \\\"/var/lib/docker/overlay2/4c0ae63dbc134ec9b508a0a67e7be9d3c284b0719ca3ea27e0399bf19d3d9e76/merged/usr/local/tomcat/conf/server.xml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
成功例子:
[root@node1 ~]# docker pull tomcat
[root@node1 ~]# mkdir -p /usr/local/docker/tomcat8/conf
[root@node1 ~]# mkdir -p /usr/local/docker/tomcat8/webapps
[root@node1 ~]# mkdir -p /usr/local/docker/tomcat8/logs
[root@node1 ~]# cat server.xml #自定义配置文件,仅修改站点目录
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- Note: A "Server" is not itself a "Container", so you may not
define subcomponents such as "Valves" at this level.
Documentation at /docs/config/server.html
-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!-- A "Service" is a collection of one or more "Connectors" that share
a single "Container" Note: A "Service" is not itself a "Container",
so you may not define subcomponents such as "Valves" at this level.
Documentation at /docs/config/service.html
-->
<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
This connector uses the NIO implementation. The default
SSLImplementation will depend on the presence of the APR/native
library and the useOpenSSL attribute of the
AprLifecycleListener.
Either JSSE or OpenSSL style configuration may be used regardless of
the SSLImplementation selected. JSSE style configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
This connector uses the APR/native implementation which always uses
OpenSSL for TLS.
Either JSSE or OpenSSL style configuration may be used. OpenSSL style
configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
certificateFile="conf/localhost-rsa-cert.pem"
certificateChainFile="conf/localhost-rsa-chain.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host).
Documentation at /docs/config/engine.html -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine name="Catalina" defaultHost="localhost">
<!--For clustering, please take a look at documentation at:
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps/web" #修改站点目录
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
[root@node1 ~]# cp server.xml /usr/local/docker/tomcat8/conf/ #将自定义的配置文件,事先放到将要映射的相应路径
[root@node1 ~]# ls /usr/local/docker/tomcat8/conf/
server.xml
[root@node1 ~]# docker run -d -p 8085:8080 --name tomcat8 \
-v /usr/local/docker/tomcat8/conf/server.xml:/usr/local/tomcat/conf/server.xml \
-v /usr/local/docker/tomcat8/webapps:/usr/local/tomcat/webapps/web \
-v /usr/local/docker/tomcat8/logs:/usr/local/tomcat/logs \
tomcat:latest
27bba0de1a5d8e11e9caa744711d0f662e5cbec4160c89ca8b903250fb42fcd7
[root@node1 ~]# docker ps |grep tomcat8
27bba0de1a5d tomcat:latest "catalina.sh run" 26 seconds ago Up 25 seconds 0.0.0.0:8085->8080/tcp tomcat8
[root@node1 ~]# curl localhost:8085
访问不到,是404,因为配置文件修改了站点目录位置, 访问不到,表示自定义配置文件生效。
[root@node1 ~]# mkdir /usr/local/docker/tomcat8/webapps/ROOT
[root@node1 ~]# echo 1111 > /usr/local/docker/tomcat8/webapps/ROOT/index.html #模拟从宿主机发布代码,和容器站点目录映射
[root@node1 ~]# cat /usr/local/docker/tomcat8/webapps/ROOT/index.html
1111
[root@node1 ~]# curl localhost:8085
1111
查看宿主机和容器目录映射关系:
[root@node1 ~]# docker exec -it tomcat8 ls /usr/local/tomcat/webapps
ROOT docs examples host-manager manager web
[root@node1 ~]# docker exec -it tomcat8 ls /usr/local/tomcat/webapps/web
ROOT
[root@node1 ~]# docker exec -it tomcat8 ls /usr/local/tomcat/webapps/web/ROOT
index.html
[root@node1 ~]# docker exec -it tomcat8 cat /usr/local/tomcat/webapps/web/ROOT/index.html
1111
[root@node1 ~]# docker exec -it tomcat8 cat /usr/local/tomcat/conf/server.xml
......
<Host name="localhost" appBase="webapps/web"
unpackWARs="true" autoDeploy="true">
参考文档:Docker 容器配置之Tomcat_tomcat 添加上下文 docker-CSDN博客
如果对运维课程感兴趣,可以在b站上搜索我的账号: 运维实战课程,可以关注我,学习更多运维实战技术视频!