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