tomcat镜像使用-dockfile构建和官方镜像-自定配置文件

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博客 

Are you trying to mount a directory onto a file or vice-versa 解决方法_are you trying to mount a directory onto a file (o-CSDN博客

如果对运维课程感兴趣,可以在b站上搜索我的账号: 运维实战课程,可以关注我,学习更多运维实战技术视频!

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维实战课程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值