Соедините порт контейнера docker с портом хоста

#docker

#docker

Вопрос:

Я запускаю контейнер docker с помощью следующей команды:

 docker run -d --name frontend_service -net host --publish=3001:3000 frontend_service
  

Насколько я понимаю, это сопоставляет локальный порт 3001 с портом контейнера 3000.
Я уже подключился по ssh к контейнеру и проверил локон localhost: 3000. Работает. Но снаружи, на хосте, я не могу свернуть localhost: 3001.

Я проверил nmap. Порт открыт:

 nmap -v -sT localhost

Starting Nmap 6.47 ( http://nmap.org ) at 2016-10-19 01:24 UTC
Initiating Connect Scan at 01:24
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 25/tcp on 127.0.0.1
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 5051/tcp on 127.0.0.1
Discovered open port 3001/tcp on 127.0.0.1
Completed Connect Scan at 01:24, 0.06s elapsed (1000 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0011s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 996 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
3001/tcp open  nessus
5051/tcp open  ida-agent
  

Как я могу подключить порт контейнера к моему порту хоста?

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

1. Внутри контейнера, по какому адресу, если ваша служба прослушивает? Может быть, он привязан только к адресу локального хоста (например, 127.0.0.1)? Это предотвратило бы любые внешние подключения, независимо от того, что вы делаете с docker.

2. Спасибо, @larks. Это была одна проблема.

Ответ №1:

При указании --net=host вы полностью отключаете шаги настройки сети Docker. Контейнер не получит своего собственного сетевого пространства имен, не получит своих собственных интерфейсов, и системе публикации портов не к чему будет направлять.

Если вы хотите, чтобы ваш -p 3001:3000 работал, не используйте --net=host .

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

1. Для дополнения вы не отключаете настройку сети docker при использовании net = host, но обратите внимание, что демон docker инициирует сетевую среду контейнера (не пространство имен) с необходимыми объектами на хосте. Например, имя хоста/hosts/resolv.conf… Таким образом, контейнер будет хорошо работать в зависимости от среды хоста. Конечно, поскольку они используют одно и то же сетевое пространство имен, любой флаг -p будет проигнорирован. Порт 3001 на хосте вообще не существует.