#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, отправленный браузером, не получает ответа.
Это файл 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 по-прежнему не будет допускать никакого трафика. Вам придется открыть этот порт для внешнего мира.