Мой пост очень похож на вот этот. У меня есть контейнер Docker, в котором запущено очень простое приложение node.js / express, прослушивающее порт 3000, работающее на Google Compute Engine с включенными правилами брандмауэра http и https.
Однако по какой-то причине процессы не прослушивают публичные порты (443 и 80). Когда я печатаю sudo netstat -tnlp tcp
Я получил:
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:5355 0.0.0.0:* LISTEN 288/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 296/sshd
tcp6 0 0 :::5355 :::* LISTEN 288/systemd-resolve
tcp6 0 0 :::3000 :::* LISTEN 1216/node
Как хорошо, когда я бегу nmap <EXPOSED_IP>
Я получил:
Not shown: 993 filtered ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp closed http
443/tcp closed https
554/tcp open rtsp
3389/tcp closed ms-wbt-server
7070/tcp open realserver
Я знаю, что на портах 443 и 80 ничего не прослушивается, и я вижу, что мое приложение прослушивает порт 3000, но я не уверен, как это изменить / сопоставить / раскрыть. Я попытался изменить свой docker-compose на:
...
ports:
- "80:3000"
- "443:3000"
- "3000:3000"
...
Но, похоже, это не сработало. Я знаю, что не использую docker-compose в виртуальной машине, так что это не имеет значения. Я читаю Вот Я не должен открывать публичные порты в Dockerfile, чтобы я мог запускать несколько контейнеров на одном экземпляре виртуальной машины, что имеет смысл. Но все еще не уверен, как сопоставить 443 и 80 моему контейнеру. Любые идеи?
Вы можете развернуть только один контейнер для каждого экземпляра виртуальной машины. Рассмотрите Kubernetes Engine, если вам нужно развернуть несколько контейнеров на экземпляр виртуальной машины. Свяжитесь с командой, если в вашем случае использования требуется развернуть несколько контейнеров в экземпляре Compute Engine.
Похоже, мне все равно разрешено запускать только один контейнер на каждую виртуальную машину, поэтому, возможно, я попробую перенаправить порты в моем Dockerfile ...
Я наконец-то понял. 🎉
Оказывается, я пытался управлять портами из Dockerfile, который, очевидно, не контролирует хост.
Я включил ответ из этого поста:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
при создании моего шаблона экземпляра вычислений Google как такового:
--metadata startup-script="sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000"
А затем создал экземпляр на основе этого шаблона. Ура обучению!