Насколько я понял, docker запускает контейнеры со своими IP-адресами и полностью открытыми портами на интерфейсе моста docker0.
Допустим, я запускаю контейнер, и у него есть собственный IP-адрес: 172.17.0.11, и у меня есть виртуальный интерфейс Ethernet, eth0.1, с общедоступным IP-адресом 93.x.x.x
Как перенаправить eth0.1 в контейнер докера, чтобы я мог получить доступ к контейнеру через IP-адрес eth0.1?
Могу ли я пробросить сразу все порты? (возможно со сценарием)
Как отключить поведение докеров по умолчанию, чтобы каждый контейнер получал IP-адрес только на интерфейсе docker0, а я вручную настраивал пересылку?
@Xavierlucas
Я связал это, потому что думал, что там это объяснено лучше. Если вы проверите конфигурацию debian, я добавлю в файл / etc / net / interfaces следующее:
post-up /sbin/ifconfig eth0:X IP.OF.FAIL.OVER netmask 255.255.255.255 broadcast IP.OF.FAIL.OVER
post-down /sbin/ifconfig eth0:X down
Таким образом, у меня есть виртуальный интерфейс (eth0: 0) с общедоступным IP-адресом, перенаправленным моим провайдером. Я думаю, что маршрутизация выполняется провайдером, так как на моем сервере нет дополнительных маршрутов или конфигов
Примечание:
Есть дополнительный вопрос
Во-первых, вы не хотели бы перенаправлять все порты сразу, так как тогда у вас не обязательно будет доступ к хосту. Это определенно должен быть ручной процесс.
Я ожидаю, что у вас есть веб-служба, запущенная в вашем контейнере Docker, поэтому, если вы хотите перенаправить, например, порт 80 с вашего IP-адреса eth0.1 на IP-адрес контейнера Docker, вы можете использовать следующие iptables
правило;
iptables -A PREROUTING -t nat -i eth0.1 -p tcp --dport 80 -j DNAT --to 172.17.0.11:80
iptables -A FORWARD -p tcp -d 172.17.0.11 --dport 80 -j ACCEPT
Затем эти правила можно изменить для любых других контейнеров портов / докеров по мере необходимости.
Хорошо, поэтому я собираюсь дать здесь альтернативный ответ, поскольку теперь я понимаю, что вы имеете в виду не виртуальные интерфейсы, а псевдоним IP.
Во-первых, если вам не нужно перенаправлять все порты, а просто использовать один (очевидно, вам нужно открыть порт в своем файле докеров):
docker run -d -p 93.x.x.x:hostPort:containerPort registry/image
В другом случае, если вы не используете этот псевдоним IP ни для чего другого, кроме связи в / из вашего контейнера с остальной частью вашей сети, вы можете взглянуть на мой скромный проект: докер-флатип и напрямую назначить этот IP-адрес виртуальному каналу Ethernet, подключенному от контейнера ко второму мосту, выделенному для плоских контейнеров.
Я написал его, когда столкнулся с довольно специфическим вариантом использования. Имейте в виду, что это находится на границе того, что такое контейнеры докеров, и лучше найти решение, если вы можете, чтобы не привязывать определенный IP-адрес к контейнеру для целей оркестрации и масштабируемости.
Суть в том, чтобы иметь доступ к контейнеру, как к любому другому хосту в вашей сети, с более простой настройкой правил iptables. В моем случае было необходимо развернуть группу агентов генерации нагрузки из коммерческого решения с определенными правилами iptables, где каждому требовался общедоступный IP-адрес и его нельзя было автоматически обнаружить. Он действует как оболочка после запуска / перед остановкой ваших контейнеров, поэтому правила iptables добавляются / удаляются с легкостью.
С помощью этого небольшого инструмента вы в конечном итоге запустите свой контейнер вот так (если вы действительно конечно, вы хотите перенаправить все порты, не рекомендуется вообще):
cid=$(docker run -d registry/image)
Или
docker start $cid
Затем :
docker-flatip add $cid 93.x.x.x/32 -i tcp:all,udp:all
И остановив это так:
docker-flatip del $cid
docker stop $cid