Предоставление контейнеру docker маршрутизируемого ip-адреса
я запускаю это на ubuntu 14.04 и установил docker0
к статическому ip, который затем маршрутизируется с общедоступного ip через брандмауэр. Я пытаюсь настроить свой backend API для запуска в контейнере docker и смущен несколькими вещами.
1.) Как бы я карту docker0
ip к 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