Рейтинг:1

Невозможно заставить два контейнера докеров общаться

флаг us

Я пытаюсь заставить два контейнера общаться на сервере, как будто он работает на моей машине.

Дело в том, что они не могут общаться (пытаются пропинговать контейнер 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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.