Подтвердить что ты не робот

Предоставление контейнера докеров маршрутизируемым IP-адресом

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

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

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

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

4b9b3361

Ответ 1

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

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

$> ip addr add 10.0.0.99/8 dev eth0

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

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

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

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

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

Ответ 2

В последнее время у меня была та же проблема и она была решена с помощью Network Containers:

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

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

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

create-network-container.sh webserver ens32

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

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