У меня есть док-контейнер с Caddy и еще один веб-сервер.
В моем Dockerfile
у меня есть
EXPOSE 80 10240 # 10240 is the port of the other webserver.
И я запускаю докер вот так (не спрашивайте меня, зачем вам нужны EXPOSE
и -p
).
docker run -p 80:80 -p 10240:1024 -it <hash>
Это запускает два сервера. На моем хост-компьютере (кстати, это Mac) я могу подключиться к localhost:10240
в порядке. Однако, если я подключаюсь к localhost:80
, я получаю пустой ответ (разорванное соединение).
Netstat в док-контейнере показывает:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:10240 0.0.0.0:* LISTEN 19/node
tcp6 0 0 :::80 :::* LISTEN 9/caddy
Вот где это начинает становиться странным. Если я curl -L localhost
внутри док-контейнера, он работает нормально — я получаю веб-страницу с сервера 10240.
Если я curl -L 127.0.0.1
из док-контейнера, он возвращает 404 Site 127.0.0.1 is not served on this interface
. Хорошо.
Если я curl -L 127.0.0.1
из вне контейнера, он также возвращает 404 Site 127.0.0.1 is not served on this interface
. Каким-то образом мои запросы проходят, но Caddy отбрасывает localhost
запросов снаружи контейнера, а не изнутри. У меня включено ведение журнала, но оно ничего не печатает.
Кто-нибудь может сказать мне, что, черт возьми, происходит? Вся эта переадресация портов докеров смешна.
Вот мой Caddyfile (и я пробовал около миллиарда других комбинаций localhost
, 127.0.0.1
и т. д.):
localhost:80
bind 0.0.0.0
proxy / 127.0.0.1:10240