Как сделать контейнер Docker доступным для других сетевых машин через IP?

Мне нужно создать несколько контейнеров докеров, к которым должны быть доступны другие компьютеры в той же сети.

Проблема в том, что когда я создаю контейнер, Docker получает IP-адреса, действительные только на хост-компьютере.

Я уже просмотрел документацию Docker (Сеть), но ничего не сработало.

Если я запускаю ifconfig на своей машине, мой IP-адрес будет 172.21.46.149. Когда я захожу внутрь контейнера (Ubuntu) и запускаю ifconfig, IP-адрес равен 172.17.0.2. Мне нужен Docker, чтобы получить, например, 172.21.46.150.

Как мне это сделать?


person Lucas Rezende    schedule 29.02.2016    source источник
comment
Было бы нормально, если бы ваш контейнер напрямую связывал хост-порт для связи?   -  person Auzias    schedule 29.02.2016


Ответы (3)


Вы должны создать мост на своем хосте и назначить этот мост контейнеру. Это может вам помочь: https://jpetazzo.github.io/2013/10/16/configure-docker-bridge-network/

person Harald Weber    schedule 29.02.2016

Доступ с несколькими хостами включает оверлейную сеть с обнаружением служб.
См. докер/сеть:

Для оверлейной сети требуется хранилище пар "ключ-значение". Хранилище хранит информацию о состоянии сети, включая обнаружение, сети, конечные точки, IP-адреса и многое другое.
В настоящее время Docker Engine поддерживает Consul, etcd, ZooKeeper (распределенное хранилище) и BoltDB (локальное хранилище) хранилище ключей и значений. store.
В этом примере используется Consul.

https://github.com/docker/dceu_tutorials/raw/master/images/tut6-step1.png

Если ваши узлы (другие компьютеры в той же сети) запускают свой демон Docker со ссылкой на это хранилище ключей и значений, они смогут взаимодействовать с контейнерами из других узлов.

DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=consul://<NODE-0-PRIVATE-IP>:8500/network --cluster-advertise=eth0:2375"

Вам просто нужно создать оверлейную сеть:

 docker network create -d overlay --subnet=10.10.10.0/24 RED

(он будет доступен на всех компьютерах из-за хранилища ключ-значение)

И запустите свои контейнеры в этой сети:

docker run -itd --name container1 --net RED busybox
person VonC    schedule 01.03.2016

Контейнеры Docker могут быть легко доступны другим сетевым узлам, когда контейнер:порт публикуется через хост:порт.

Это делается с помощью опции -p docker-run. Вот итог справочной страницы ($man docker-run дает более подробную информацию и пример, который я не буду копировать/вставлять):

   -p, --publish=[]
      Publish a container's port, or range of ports, to the host.

См. документ в Интернете. Этот вопрос/ответ тоже может быть интересно прочитать.

В принципе:

docker run -it --rm -p 8085:8080 my_netcat nc -l -p 8080

Позволит узлам локальной сети подключаться к docker-host-ip:8085 и обсуждать с командой netcat.

person Auzias    schedule 29.02.2016
comment
Проблема с этим решением заключается в том, что когда я расширяю свою среду, я думаю, что до тех пор, пока у меня будет много контейнеров... - person Lucas Rezende; 29.02.2016
comment
Ну... Возможно, вы захотите отредактировать свой вопрос, чтобы сделать его более понятным. Вам действительно нужны все контейнеры в той же локальной сети, что и основная локальная сеть? Я понимаю причину многих контейнеров, но я сомневаюсь, что хост будет запускать более 65 тыс. контейнеров (создавая отсутствие сокета для привязки). Помните, что передовой практикой Docker является Caas и в соответствии с CaaS контейнеру (предполагаемому для запуска одной службы) должен быть нужен только один порт, два или три в исключительных случаях с несколькими портами. - person Auzias; 01.03.2016