【问题标题】:Tomcat running in Docker container cannot be reached when configured to listen to 127.0.0.1配置为监听 127.0.0.1 时无法访问在 Docker 容器中运行的 Tomcat
【发布时间】:2021-10-26 01:45:58
【问题描述】:

我正在尝试在 Docker 容器中配置 Tomcat 以监听 127.0.0.1:80 而不是 0.0.0.0:80。 catalina 日志显示 Tomcat 服务器正在启动,但似乎无法访问 Tomcat。 catalina 日志和 netstat 都确认 Tomcat 正在监听 127.0.0.1:80。

Wireshark 显示 TCP 握手正在完成。但是浏览器发出的HTTP get请求没有得到响应。

Wireshark Trace

这是 Dockerfile:

FROM debian:stretch

RUN \
    apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y default-jre && \
    apt-get install -y libtcnative-1 && \
    apt-get install -y wget && \
    apt-get install -y curl && \
    apt-get install -y unzip && \
    apt-get install -y gettext-base
ENV JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/jre"

RUN \
    TOMCAT_VER=`curl --silent http://mirror.vorboss.net/apache/tomcat/tomcat-9/ | grep v9 -m 1 | awk '{split($5,c,">v") ; split(c[2],d,"/") ; print d[1]}'` && \
    wget -N http://mirror.vorboss.net/apache/tomcat/tomcat-9/v${TOMCAT_VER}/bin/apache-tomcat-${TOMCAT_VER}.tar.gz &&\
    tar xzf apache-tomcat-${TOMCAT_VER}.tar.gz && \
    rm -f apache-tomcat-${TOMCAT_VER}.tar.gz && \
    mv apache-tomcat-${TOMCAT_VER}/ /opt/tomcat

ENV CATALINA_HOME="/opt/tomcat" \
PATH="$PATH:/opt/tomcat/bin"

RUN rm -fr /opt/tomcat/webapps/*

COPY app.war /opt/tomcat/webapps/ROOT.war

COPY server.xml /opt/tomcat/conf/server.xml

CMD ["catalina.sh", "run"]
EXPOSE 80 443

这是来自 server.xml 的相关连接器:

<Connector port="80" 
           protocol="HTTP/1.1" 
           address="127.0.0.1"
           connectionTimeout="20000" />

对此有更深入了解的人能否解释一下为什么在将 Tomcat 配置为侦听 127.0.0.1 时无法建立与 Tomcat 容器的连接?

【问题讨论】:

  • 您将服务器暴露在 443 端口上。浏览器是否尝试使用 HTTPS?
  • 如果您想从外部访问127.0.0.1,为什么要绑定它?
  • @chrylis-cautiouslyoptimistic- 浏览器尝试使用 HTTP,但是在端口 443 上使用 HTTPS 具有相同的结果
  • @LMC 我有其他进程使用端口 80,因此 Tomcat 在侦听 0.0.0.0:80 时无法启动,因为它会覆盖所有环回。这种方法行不通吗?
  • 从网络角度看,只要其他进程没有在所有接口上绑定端口 80,它可以工作。从功能的角度来看,我相信它不会起作用。解决方案可能是将此进程绑定到端口 81 等。另一种方法是在端口 80 上使用反向代理来处理这两个进程。

标签: java linux docker tomcat networking


【解决方案1】:

在网络方面,您的 dockerized 应用程序 (Tomcat) 运行在与客户端不同的主机上(除非您在同一个容器中运行客户端,这不太可能)。如果您的 Tomcat 仅侦听 127.0.0.1:80,那么任何客户端都无法从容器外部进行连接。

即使您将 Tomcat 修改为监听 0.0.0.0:80,tomcat 也会在容器内正确监听,但 Docker 的默认设置仍然不允许任何流量。你必须expose that port 到外面的世界。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2021-12-10
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多