Назад | Перейти на главную страницу

Перенаправить один IP-адрес в контейнер докеров

Насколько я понял, 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