До Tomcat, работающего в контейнере Docker, невозможно добраться, если он настроен на прослушивание 127.0.0.1

#java #linux #docker #tomcat #networking

Вопрос:

Я пытаюсь настроить Tomcat в контейнере Docker для прослушивания 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

Это файл Dockerfile :

 FROM debian:stretch

RUN 
    apt-get update amp;amp; 
    apt-get upgrade -y amp;amp; 
    apt-get install -y default-jre amp;amp; 
    apt-get install -y libtcnative-1 amp;amp; 
    apt-get install -y wget amp;amp; 
    apt-get install -y curl amp;amp; 
    apt-get install -y unzip amp;amp; 
    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]}'` amp;amp; 
    wget -N http://mirror.vorboss.net/apache/tomcat/tomcat-9/v${TOMCAT_VER}/bin/apache-tomcat-${TOMCAT_VER}.tar.gz amp;amp;
    tar xzf apache-tomcat-${TOMCAT_VER}.tar.gz amp;amp; 
    rm -f apache-tomcat-${TOMCAT_VER}.tar.gz amp;amp; 
    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 не может быть установлено, когда Tomcat настроен на прослушивание 127.0.0.1?

Комментарии:

1. Вы предоставляете доступ к серверу через порт 443. Пытается ли браузер использовать HTTPS?

2. Зачем привязываться 127.0.0.1 , если вы хотите сделать его доступным извне?

3. @chrylis-осторожно оптимистично — браузер пытается использовать HTTP, однако использование HTTPS на порту 443 дает те же результаты

4. @LMC У меня есть другие процессы, использующие порт 80, поэтому Tomcat не может запуститься при прослушивании 0.0.0.0:80, поскольку он переопределяет все циклы. Не сработает ли этот подход?

5. С точки зрения сети это может работать до тех пор, пока другой процесс не привязывает порт 80 ко всем интерфейсам. С функциональной точки зрения это, я думаю, не сработает. Решением может быть привязка этого процесса к порту 81 или что-то подобное. Альтернативой является использование обратного прокси-сервера на порту 80 для обработки обоих процессов.

Ответ №1:

С точки зрения сети ваше докеризованное приложение (Tomcat) работает на другом хосте, чем ваш клиент (если только вы не запускаете клиент в том же контейнере, что маловероятно). Если ваш кот прослушивает только 127.0.0.1:80, то ни один клиент никогда не сможет подключиться извне контейнера.

Даже если вы измените Tomcat на прослушивание 0.0.0.0:80, tomcat будет правильно прослушивать содержимое контейнера, но по умолчанию Docker по-прежнему не будет допускать никакого трафика. Вам придется открыть этот порт для внешнего мира.