【问题标题】:Permanently change the tomcat port from Dockerfile从 Dockerfile 永久更改 tomcat 端口
【发布时间】:2020-07-24 10:53:47
【问题描述】:

我想在一个 k8s pod 中运行两个容器。

  1. tomcat 导出器(运行在 8080 端口)
  2. tomcat 应用程序(也在 8080 端口上运行)

由于 pod 内的多个运行容器不能共享同一个端口,我期待构建一个具有不同端口的自定义 tomcat 映像(例如 9090(默认 tomcat 端口为:8080))

这就是我使用的 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。暴露的端口并不意味着容器实际上正在监听这些端口。您可以监听未暴露的端口,也可以不监听暴露的端口。 EXPOSE 主要是提供信息。
  • 他们必须是同一个吊舱吗?如果你试图在 Docker 之外的同一主机上运行这两个进程,你会怎么做?
  • 如果你愿意构建一个自定义的 tomcat 镜像,为什么不下载并在 tomcat 中作为 webapp 运行导出器呢?它将消除第二次集装箱和港口碰撞的需要,并有望产生想要的结果
  • @BurakSerdar - 是的 EXPOSE 只是信息,但我上面提到的问题是,即使在更改了 tomcat 的 server.xml 文件后,容器仍然显示 8080 处于活动状态(在实际情况下它应该只显示 9090)。问题是,在创建具有以上 2 个容器的 pod 时,由于端口绑定异常,pod 无法启动。
  • @DavidMaze 这里的问题是我在互联网上找到的 tomcat 导出器是一个战争文件 - 因此默认情况下在端口 8080 上运行 - 正如我所看到的,我们无法更改端口出口商。在不同的服务器上运行它们可能无法让导出器收集指标。我们所能做的就是看看如何让应用使用与导出器不同的端口。

标签: docker tomcat kubernetes dockerfile tomcat9


【解决方案1】:

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

我的 Dockerfile 是

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/ 部分不是必需的,除非您想最初部署一些战争文件。而且我也没有添加EXPOSE 4287,因为如果我这样做了,tomcat服务器没有绑定到4287端口,那么它总是绑定到8080默认端口。

只需构建映像并运行
docker build -f Dockerfile -t test/tomcat-test:1.0 .
docker run -d -p 4287:4287 --name tomcat-test test/tomcat-test:1.0

【讨论】:

    【解决方案2】:

    检查tomcat:9.0.34Dockerfile in Dockerhub,我们可以看到它正在暴露端口8080。当您将此图像用作父图像时会发生什么,即您从该图像继承了此 EXPOSE 指令。

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

    这应该不会导致任何问题,但是如果您想消除它,您可以 fork tomcat Dockerfile,删除 EXPOSE 指令并构建您自己的 tomcat 映像。

    【讨论】:

    • 但由于某种原因,即使在更改原始 Docker 文件中的端口后,tomcat 仍然绑定到相同的旧端口 8080。这是 docker logs 显示的内容 ``````` 12-Apr -2020 14:42:22.850 INFO [main] org.apache.coyote.AbstractProtocol.start 启动 ProtocolHandler ["http-nio-8080"] 12-Apr-2020 14:42:22.893 INFO [main] org.apache.catalina .startup.Catalina.start 服务器在 [284] 毫秒内启动 ```````
    • 我的理解是,最初的问题集中在为什么 8080 端口被 Docker 暴露,而不是为什么 Tomcat 不尊重您配置的端口。即使在sed 8080server.xml 中使用9090 之后,您是否还有关于Tomcat 不使用端口9090 的问题?
    • 是的,这正是我的问题所在。为什么即使在我将所有出现的 8080 更改为 9090 之后,tomcat 也不尊重
    • 是否可以在您的sed 命令之后附加tomcat server.xml
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多