从Dockerfile永久更改tomcat端口

从Dockerfile永久更改tomcat端口,docker,tomcat,kubernetes,dockerfile,tomcat9,Docker,Tomcat,Kubernetes,Dockerfile,Tomcat9,我想在k8s吊舱内运行两个集装箱 tomcat导出器(在端口8080上运行) tomcat应用程序(也在端口8080上运行) 由于pod中的多个运行容器不能共享同一个端口,因此我期待使用不同的端口(比如9090(默认tomcat端口为8080))构建一个自定义tomcat映像 这就是我使用的Dockerfile cat Dockerfile FROM tomcat:9.0.34 RUN sed -i 's/8080/9090/' /usr/local/tomcat/conf/server.xm

我想在k8s吊舱内运行两个集装箱

  • tomcat导出器(在端口8080上运行)
  • tomcat应用程序(也在端口8080上运行)
  • 由于pod中的多个运行容器不能共享同一个端口,因此我期待使用不同的端口(比如9090(默认tomcat端口为8080))构建一个自定义tomcat映像

    这就是我使用的Dockerfile

    cat Dockerfile 
    FROM tomcat:9.0.34
    RUN sed -i 's/8080/9090/' /usr/local/tomcat/conf/server.xml
    EXPOSE 9090
    
    在构建了该映像并运行了一个容器之后,我看到已经分配了9090个端口,但我也看到8080仍然存在

    CONTAINER ID        IMAGE                             COMMAND             CREATED             STATUS              PORTS                              NAMES
    b66e1e9c3db8        chakilams3/tomcatchangedport:v1   "catalina.sh run"   3 seconds ago       Up 2 seconds        8080/tcp, 0.0.0.0:9090->9090/tcp   test
    
    我想知道这个8080/tcp端口从何而来,即使在我将server.xml文件中的所有引用8080更改为9090之后


    任何想法都很感激

    检查
    tomcat:9.0.34
    ,我们可以看到它正在暴露端口
    8080
    。当您将此图像用作父图像时,将从该图像继承此
    EXPOSE
    指令

    通过搜索,Dockerfile中似乎不存在撤消父映像的
    EXPOSE 8080
    指令的“unexpose”指令


    这不会引起任何问题,但是如果您想消除它,您可以分叉tomcat Dockerfile,删除
    EXPOSE
    指令并构建您自己的tomcat映像。

    经过大量努力,我找到了更改tomcat内部端口的解决方案 容器

    我的文件是

    FROM tomcat:7.0.107
    RUN sed -i 's/port="8080"/port="4287"/' ${CATALINA_HOME}/conf/server.xml
    ADD ./tomcat-cas/war/ ${CATALINA_HOME}/webapps/
    CMD ["catalina.sh", "run"]
    
    这里
    ADD./tomcat cas/war/${CATALINA_HOME}/webapps/
    part不是必需的,除非您希望最初部署一些war文件。而且我也没有添加EXPOSE 4287,因为如果我这样做了,tomcat服务器不会绑定到端口4287,那么它总是绑定到8080默认端口

    只需构建映像并运行
    docker构建-f Dockerfile-t测试/tomcat测试:1.0。


    docker-run-d-p 4287:4287——命名为tomcat-test/tomcat-test:1.0

    可能来自您的基本图像,tomcat:9.0.34。暴露的端口并不意味着容器实际上正在侦听这些端口。您可以侦听未暴露的端口,也可以不侦听暴露的端口。暴露主要是信息。它们必须是同一个吊舱吗?如果您试图在Docker之外的同一台主机上运行这两个进程,您会怎么做?如果您愿意构建自定义tomcat映像,为什么不在tomcat内部下载并以webapp的形式运行exporter?这将消除第二次集装箱和港口碰撞的需要,并有望产生想要的结果result@BurakSerdar-是的,EXPOSE只是信息,但我上面提到的问题是,即使更改了tomcat的server.xml文件,容器仍然显示8080为活动(在实际情况下,它应该只显示9090)。问题是,当使用2个以上的容器创建一个pod时,由于端口绑定异常,pod无法启动。@DavidMaze的问题是,我在internet上找到的tomcat导出器是一个war文件,因此默认情况下在端口8080上运行。在我看来,我们无法更改导出器的端口。在不同的服务器上运行这两种方法可能不会使导出器具备收集指标的能力。我们所能做的就是看看如何让应用程序使用与导出程序不同的端口。但出于某种原因,即使在更改原始Docker文件中的端口后,tomcat仍然绑定到相同的旧端口8080。以下是docker日志显示的内容:```````````12-Apr-2020 14:42:22.850 INFO[main]org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler[“http-nio-8080”]12-Apr-2020 14:42:22.893 INFO[main]org.apache.catalina.startup.catalina.start服务器在[284]中启动毫秒,`````我的理解是,最初的问题集中在Docker为何公开8080端口,而不是Tomcat为何不尊重您配置的端口。您的问题是Tomcat即使在
    server.xml中使用
    9090
    sed
    8080
    后也不使用端口9090吗?是的,这正是我的问题所在。为什么tomcat即使在我将所有出现的8080更改为9090之后也不尊重您的
    sed
    命令,是否可以将tomcat
    server.xml
    附加到您的
    sed
    命令之后?