Контейнер Docker - как настроить, чтобы он получал жизнеспособный IP-адрес при работе в бродяге?

Докер (www.docker.io) выглядит потрясающе. Однако после установки VirtualBox, Vagrant ... и, наконец, Docker на Mac, мне не удается получить доступ к службе, запущенной в контейнере Docker, с другого компьютера (или из сеанса терминала на Mac). Служба, к которой я пытаюсь обратиться, - это Redis.

Проблема заключается в том, что нет маршрута к IP-адресу, назначенному контейнеру Docker. В этом случае IP-адрес контейнера составляет 172.16.42.2, в то время как Mac-IP - 196.168.0.3.

Несколько примечаний:

  • Доступ к нему возможен, но только из сеанса VirtualBox. Это можно сделать, используя redis-cli -h 172.16.42.2 -p 6379.
  • Я добавил "config.vm.network: bridged" в VagrantFile в попытке получить, но это не решило проблему.

Ответ 1

VM, созданная бродягой, действительно изолирована, чтобы получить доступ к ней с вашего хоста, вы можете выделить для нее частную сеть. Вместо config.vm.network :bridged, попробуйте config.vm.network :private_network, ip: "192.168.50.4", он должен сделать трюк

Однако это позволит вам получить доступ к самой виртуальной машине, а не к контейнерам.
Для этого при запуске контейнера вы можете добавить опцию -p

ex: docker run -d -p 8989 base nc -lkp 8989

Это приведет к тому, что netcat прослушивает 8989 в контейнере и публикует порт публично. Поскольку он также запускается с -d, контейнер будет находиться в отключенном режиме, и единственным выходом будет идентификатор контейнера

Чтобы открыть порт, Docker выполняет простой NAT. Чтобы узнать реальный порт, вы можете

do docker port <ID of the container> 8989

Netcat будет доступен с Mac по адресу 192.168.50.4:<result>

Ответ 2

Я только что написал учебное пособие о том, как использовать сеть только для хоста и маршрутизацию TCP, чтобы сделать это довольно легко. Таким образом, вам не нужно отображать каждый конкретный порт.

http://ispyker.blogspot.com/2014/04/accessing-docker-container-private.html

Важные моменты...

1) Добавить сеть только для хоста в Virtual Box 2) Скажите виртуальной машине boot2docker, чтобы иметь адаптер в сети только для хоста 3) Добавьте IP-адрес для нового сетевого адаптера сетевой загрузки boot2docker VM 4) Маршрутизировать весь трафик Mac OS X для подсети контейнера докера для этого узла загрузочного узла WTA для хоста IP

Фактические шаги в блоге с выходом, чтобы вы могли сравнить с тем, что вы видите, следуя им.

Ответ 3

Я установил tomcat из моего файла Docker и перенаправил его на 6060, используя переадресацию порта вагонта. Это шаги, которые мне помогли:

vagrant provision
vagrant up
vagrant ssh
box_name$ docker run  -i -t -p 8080:8080 bsb_tomcat6 /bin/bash

Возможность увидеть tomcat на локальном хосте: 6060, поскольку я выполнил переадресацию порта на 6060 в моем Vagrantfile

Ответ 4

вы также можете определить переменные среды PRIVATE_NETWORK и FORWARD_DOCKER_PORTS для доступа к вашим службам, работающим в контейнерах докеров:

$ vagrant halt
$ export PRIVATE_NETWORK=192.168.50.4
$ export FORWARD_DOCKER_PORTS=1
$ vagrant up

В моем случае я могу получить доступ к postgres из Mac с помощью

$ telnet 192.168.50.4 49154

чтобы узнать фактический порт приложения, который вы можете использовать

$ sudo docker port 1854499c6547 5432
0.0.0.0:49154