У нас есть проблема в том, что наш сервер, на котором размещены наши контейнеры, не может получить к ним доступ по своему IP-адресу, в то время как другие компьютеры в сети могут. У нас есть следующая настройка нашей локальной сети:
Итак, наша сеть выглядит так, очень просто:
|---------| |---------| |---------|
| Docker |-----------| Router |-----------| Other computers/
| Host |-----------| | | NAS/etc |
|---------| |---------| |---------|
Чтобы сделать наши контейнеры доступными для нашей сети, мы последовали этому ответу: https://stackoverflow.com/a/35799206
Т.е. мы использовали следующие команды:
docker network create \
--subnet 192.168.0.0/16 \
--aux-address "DefaultGatewayIPv4=192.168.0.1" \
--gateway=192.168.1.1 \
-o com.docker.network.bridge.name=br-internal_lan internal_lan
sudo brctl addif br-internal_lan eno1
sudo ip a del 192.168.1.1/16 dev br-internal_lan
Все идет нормально. Наш сервер имеет IP 192.168.0.3 на eno3
, чего мы и хотим. eno1
подключается отдельным кабелем к роутеру и используется для моста. Мост получает IP 192.168.0.83. Если мы запустим наш контейнер с:
docker run --net=internal_lan -d --ip 192.168.1.0 serverimage:latest
Получаем следующий сценарий:
docker exec container01 /bin/bash
получить доступ к контейнерамВот несколько примеров настроек с нашего сервера:
ifconfig
br-internal_lan: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.83 netmask 255.255.0.0 broadcast 192.168.255.255
inet6 fe80::42:8cff:fe30:3b4a prefixlen 64 scopeid 0x20<link>
ether 02:42:8c:30:3b:4a txqueuelen 0 (Ethernet)
RX packets 430214 bytes 62591783 (59.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4244 bytes 546612 (533.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::225:90ff:fe5d:6b80 prefixlen 64 scopeid 0x20<link>
ether 00:25:90:5d:6b:80 txqueuelen 1000 (Ethernet)
RX packets 829691 bytes 296523943 (282.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 78684 bytes 87560787 (83.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xdf400000-df47ffff
eno3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.3 netmask 255.255.0.0 broadcast 192.168.255.255
inet6 fe80::225:90ff:fe5d:6b82 prefixlen 64 scopeid 0x20<link>
ether 00:25:90:5d:6b:82 txqueuelen 1000 (Ethernet)
RX packets 1744808 bytes 1583970565 (1.4 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1019186 bytes 1085667196 (1.0 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xdf200000-df27ffff
<other interfaces omitted>
маршрут
default router.asus.com 0.0.0.0 UG 1024 0 0 eno3
default router.asus.com 0.0.0.0 UG 1024 0 0 br-internal_lan
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0
192.168.0.0 * 255.255.0.0 U 0 0 0 eno3
192.168.0.0 * 255.255.0.0 U 0 0 0 br-internal_lan
router.asus.com * 255.255.255.255 UH 1024 0 0 eno3
router.asus.com * 255.255.255.255 UH 1024 0 0 br-internal_lan
Мы пробовали изменить /proc/sys/net/ipv4/[eno1,eno3,br-internal_lan]/rp_filter
на 2, но это ничего не изменило (не знаю, должно ли). /proc/sys/net/ipv4/ip_forward
установлен на 1.
Что может быть не так с нашей настройкой? Как мы можем получить доступ к нашим контейнерам по IP? Любая помощь приветствуется, если мне нужно предоставить дополнительную информацию, сообщите нам об этом.
(Обратите внимание, что в настоящее время мы используем Docker 1.10.3 (который является последней версией Docker при использовании стабильной версии CoreOS), поэтому macvlan не подходит для нас.)