Предоставление контейнеру docker маршрутизируемого ip-адреса

я запускаю это на ubuntu 14.04 и установил docker0 к статическому ip, который затем маршрутизируется с общедоступного ip через брандмауэр. Я пытаюсь настроить свой backend API для запуска в контейнере docker и смущен несколькими вещами.

1.) Как бы я карту docker0ip к ip контейнера такой, что docker0 будет знать, чтобы отправить входящие пакеты в контейнер (динамически, если это возможно).

2.) Если еще не сделано таким образом, как я мог бы сделать так, чтобы мне не нужно было настраивать это каждый раз, когда я делаю новый запуск этого контейнера docker?

спасибо заранее!

2 ответов


Я предполагаю, что вы хотите иметь IP, назначенный вашему контейнеру docker за пределами docker.

сначала создайте новый IP и назначьте его интерфейсу вашего хоста (мы предполагаем, что ваш интерфейс называется eth0.

$> ip addr add 10.0.0.99/8 dev eth0

теперь, когда вы запускаете контейнер, укажите этот адрес и свяжите его с контейнером docker:

$> docker run -i -t --rm -p 10.0.0.99:80:8080 base

аргумент-p заставит docker создать правило iptables NAT, которое будет nat весь трафик, соответствующий назначению 10.0.0.99:80 для ваш контейнер docker на порту 8080.

Если вам нужно автоматизировать процесс и масштабировать его, обратитесь к этому ресурсу:https://github.com/jpetazzo/pipework

документация docker-хороший старт:https://docker.github.io/engine/userguide/networking/


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

  • запустите мой контейнер "service", который я хочу быть доступным на общедоступном IP
  • создайте новый "сетевой" контейнер, который связан с контейнером службы и выполняет маршрутизацию к портам, предоставляемым контейнером службы. Этот контейнер будет иметь дополнительный сетевой интерфейс, соединенный с хостом, чтобы он мог получить IP-адрес от DHCP.
  • создать сеть мост от хоста Докера к контейнеру с помощью трубопровода jpetazzo (https://github.com/jpetazzo/pipework)
  • сетевой контейнер получает адрес от DHCP.

С этого момента сетевой контейнер доступен в сети и направляет порты в сервисный контейнер. Основное преимущество заключается в том, что контейнер "service" не должен знать об общедоступном IP, DHCP и т. д. Таким образом, каждый работающий контейнер может быть опубликован на сеть.

для удобства, я создал скрипт, который делает все это сразу. Сделать работающий контейнер доступным на общедоступном IP-адресе так же просто, как:

create-network-container.sh webserver ens32

в этом случае вам понадобится работающий контейнер под названием "webserver" и сетевой интерфейс на хосте "ens32". Интерфейс необходим для того, чтобы создать мост в сетевой контейнер.

сценарий, более подробная информация и примеры доступны на: https://github.com/jeroenpeeters/docker-network-containers