Как открыть IP-адрес и порт Docker-контейнера для внешнего хоста Docker без сопоставления портов?
Когда я запустил два док-контейнера для одного веб-образа на одном хосте докера.
- два док-контейнера прослушивают один и тот же порт
5000
- порт
5000
из двух контейнеров были сопоставлены с различными портами узла докера:49155
,49156
- Чтобы получить доступ к двум контейнерам из-за пределов хоста Docker, необходимо получить доступ к IP-адресу и порту док-хоста
49155
или же49156
Есть ли решение для доступа к Docker-контейнеру с внешнего Docker-хоста по его IP-адресу и порту, x.x.x.x:5000
, без сопоставления портов?
Все док-контейнеры на разных док-хостах могут напрямую обращаться друг к другу.
2 ответа
Вы можете сделать это с помощью псевдонимов IP на хосте.
Сначала добавьте виртуальный интерфейс на хосте, который имеет IP-адрес, отличный от основного интерфейса. Мы назовем основной интерфейс eth0
с IP 10.0.0.10
и виртуальный интерфейс eth0:1
с IP-адресом 10.0.0.11
,
ifconfig eth0:1 10.0.0.11 netmask 255.255.255.0 up
Теперь запустите контейнеры и сопоставьте порт 5000 с соответствующим интерфейсом. Например:
docker run -p 10.0.0.10:5000:5000 -name container1 <someimage> <somecommand>
docker run -p 10.0.0.11:5000:5000 -name container2 <someimage> <somecommand>
Теперь вы можете получить доступ к каждому контейнеру через порт 5000, используя разные IP-адреса извне.
При создании виртуальной машины убедитесь, что в сети выбрано следующее
Attached to: Bridged NetworkManager
Adapter Type: PCnet-Fast III (Am 79C973)
Promiscious Mode Allow All
RHEL 6.5 / Fedora 20
Install docker, libvrt
Убедитесь, что с помощью root сделано следующее
# chkconfig NetworkManager off
# chkconfig network on
# service NetworkManager stop
# service network start
Создайте файл ifcfg-xxxxx в / etc / sysconfig / network-scripts
DEVICE=xxxxx
TYPE=Bridge
BOOTPROTO=dhcp
ONBOOT=yes
DELAY=0
и добавить к ifcfg-p2p1
/ ifcfg-eth0
в конце файла BRIDGE=xxxx
Перезагрузите ВМ
бежать
brctl show
чтобы убедиться, что подключенный мост имеет адаптер либо p2p1
или же eth0
например
# brctl show
bridge name bridge id STP enabled interfaces
gsbr01 8000.080027595649 no eth0
virbr0 8000.5254004c1564 yes virbr0-nic
Теперь перед запуском докера мы должны использовать наш мост, а не docker0
Для этого запустите Docker как docker -d -b=gsbr01
$ echo 'DOCKER_OPTS="-b=gsbr01"' >> /etc/sysconfig/docker
$ sudo service docker start
Проверьте результат:
# brctl show
bridge name bridge id STP enabled interfaces
gsbr01 8000.080027595649 no eth0
veth5806f27
vethb3e33da
virbr0 8000.5254004c1564 yes virbr0-nic
docker -d -b=gsbr01