Я пытаюсь заставить два контейнера общаться на сервере, как будто он работает на моей машине.
Дело в том, что они не могут общаться (пытаются пропинговать контейнер B из контейнера A)
Сначала я создал Dockerfile, в котором используется образ Python. Обратите внимание, что я использую --сеть=хост
возможность создать этот контейнер (без него я не могу получить пакеты в Интернете)
Далее у меня есть docker-compose
файл, который создает два контейнера, используя ранее созданный образ.
ИДЕНТИФИКАТОР СЕТИ НАЗВАНИЕ ДРАЙВЕР ОБЛАСТЬ ПРИМЕНЕНИЯ
939d3e6af24e мост местный мост
2d455afde6fc dcoflask_default локальный мост
97f17b13840c хост хост локальный
0f40cabe1c02 нет нулевой локальный
Проверив сеть, к которой подключены мои 2 контейнера:
"Контейнеры": {
"2fe15640751ac7f6dd7bfa20e2e646e44cc2c53fbfa25e8f4df25dfbc08adb9f": {
«Имя»: «mssql»,
"EndpointID": "39d1a5429f676d990c52932eed8a66376f76b9cbbff9bcd53b256e1720798bfd",
"MacAddress": "02:42:ac:12:00:02",
"IPv4-адрес": "172.18.0.2/16",
"IPv6-адрес": ""
},
"50fc9a1f4a4743f2a4e9f80cd2d73515bad4fed748360fc4a26f289c06f8b245": {
"Имя": "веб-DCO",
"EndpointID": "7d389570b1c80fa7a1fbb4a633dabbb4f7afd0063acb6cd41f12fc56a290650c",
"MacAddress": "02:42:ac:12:00:03",
"IPv4-адрес": "172.18.0.3/16",
"IPv6-адрес": ""
}
},
Мы можем подтвердить, что они находятся на одном сетевом интерфейсе.
Отправив пинг (из контейнера web-dco), я не могу получить ответ от другого контейнера (mssql)
PING mssql (172.18.0.2) 56 (84) байт данных.
^ С
--- статистика пинга mssql ---
6 пакетов передано, 0 получено, 100% потери пакетов, время 125 мс
Немного понюхав сетевой интерфейс, созданный для контейнерной сети, я вижу запросы, но не вижу ответов:
legrand.g@мой-сервер:~$ sudo tshark -i br-2d455afde6fc
Введите пароль для интерактивной многофакторной идентификации. В противном случае введите пароль, а затем 6-значный код PingID:
Запуск от имени пользователя «root» и группы «root». Это может быть опасно.
Захват на 'br-2d455afde6fc'
1 0.000000000 172.18.0.2 – 143.26.128.29 DNS 85 Стандартный запрос 0x54a6 A vortex.data.microsoft.com
2 4.001179175 172.18.0.2 – 192.44.120.10 DNS 85 Стандартный запрос 0x54a6 A vortex.data.microsoft.com
3 4.088081213 02:42:ac:12:00:02 02:42:40:e2:2c:15 ARP 42 У кого 172.18.0.1? Скажите 172.18.0.2
4 4.088130713 02:42:40:e2:2c:15 02:42:ac:12:00:02 ARP 42 172.18.0.1 находится в 02:42:40:e2:2c:15
5 5.003686924 172.18.0.2 – 143.26.128.29 DNS 85 Стандартный запрос 0x54a6 A vortex.data.microsoft.com
6 9.004492793 172.18.0.2 – 192.44.120.10 DNS 85 Стандартный запрос 0x54a6 A vortex.data.microsoft.com
Пакеты ^C6 захвачены
Наконец, из предыдущих постов о связи контейнеров я не вижу ничего плохого в iptables.
-P ВВОД ПРИНЯТЬ
-P ВПЕРЕД ПРИНЯТЬ
-P ВЫВОД ПРИНЯТЬ
-N ДОКЕР
-N DOCKER-ИЗОЛЯЦИЯ-ЭТАП-1
-N DOCKER-ИЗОЛЯЦИЯ-СТАДИЯ-2
-N DOCKER-ПОЛЬЗОВАТЕЛЬ
-A INPUT -p tcp -m tcp --dport 22 -j ПРИНЯТЬ
-A FORWARD -j DOCKER-USER
-A ВПЕРЕД -j DOCKER-ИЗОЛЯЦИЯ-ЭТАП-1
-A FORWARD -o br-2d455afde6fc -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ
-A ВПЕРЕД -o br-2d455afde6fc -j ДОКЕР
-A ВПЕРЕД -i br-2d455afde6fc ! -o br-2d455afde6fc -j ПРИНЯТЬ
-A ВПЕРЕД -i br-2d455afde6fc -o br-2d455afde6fc -j ПРИНЯТЬ
-A FORWARD -o docker0 -m conntrack --ctstate СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ
-A ВПЕРЕД -o docker0 -j DOCKER
-A ВПЕРЕД -i docker0 ! -o docker0 -j ПРИНЯТЬ
-A ВПЕРЕД -i docker0 -o docker0 -j ПРИНЯТЬ
-A ВЫВОД -p tcp -m tcp --sport 22 -j ПРИНЯТЬ
-A ДОКЕР -d 172.18.0.2/32 ! -i br-2d455afde6fc -o br-2d455afde6fc -p tcp -m tcp --dport 1433 -j ПРИНЯТЬ
-A ДОКЕР -d 172.18.0.3/32 ! -i br-2d455afde6fc -o br-2d455afde6fc -p tcp -m tcp --dport 5000 -j ПРИНЯТЬ
-A DOCKER-ISOLATION-STAGE-1 -i br-2d455afde6fc ! -o br-2d455afde6fc -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j ВОЗВРАТ
-A DOCKER-ISOLATION-STAGE-2 -o br-2d455afde6fc -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j ВОЗВРАТ
-A DOCKER-USER -j ВОЗВРАТ
Единственная разница, которую я вижу между запуском этих контейнеров на моей машине и на сервере, заключается в том, что на моей машине мне не нужно создавать Dockerfile с --сеть=хост
вариант.
Интернет тоже недоступен, но это другая часть проблемы, я хотел бы сначала понять, почему два простых контейнера не могут общаться, даже если они используют одну и ту же сеть.
N.B IP-переадресация включена:
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1