Как проверить взаимодействие между контейнерами в одной пользовательской сети Docker

DockerBeginner
Практиковаться сейчас

Введение

Docker — это мощная платформа для создания, развертывания и запуска приложений в контейнерной среде. Понимание того, как управлять и тестировать взаимодействие между контейнерами Docker, имеет решающее значение для создания надёжных и масштабируемых приложений. Этот учебник проведет вас через процесс создания пользовательской сети Docker и тестирования взаимодействия между контейнерами в одной сети.

Понимание сетей Docker

Docker предоставляет встроенную систему сетей, которая позволяет контейнерам взаимодействовать друг с другом и с внешним миром. Docker поддерживает несколько типов сетей, включая:

Мостовая сеть (Bridge Network)

По умолчанию в Docker используется мостовая сеть. При запуске нового контейнера он автоматически подключается к стандартной мостовой сети, если не указана другая сеть. Контейнеры в одной мостовой сети могут взаимодействовать друг с другом, используя имена контейнеров или IP-адреса.

graph LR
  A[Хост] -- Мостовая сеть --> B[Контейнер 1]
  A[Хост] -- Мостовая сеть --> C[Контейнер 2]
  B[Контейнер 1] -- Мостовая сеть --> C[Контейнер 2]

Сеть хоста (Host Network)

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

Надстройка сети (Overlay Network)

Надстройка сети используется для подключения нескольких демонов Docker, что позволяет службам Swarm взаимодействовать друг с другом. Надстройки сетей обычно используются в среде Docker Swarm.

Пользовательская сеть (Custom Network)

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

graph LR
  A[Хост] -- Пользовательская сеть --> B[Контейнер 1]
  A[Хост] -- Пользовательская сеть --> C[Контейнер 2]
  B[Контейнер 1] -- Пользовательская сеть --> C[Контейнер 2]

Понимание возможностей сетей Docker имеет решающее значение для создания и управления контейнерными приложениями. В следующей секции мы рассмотрим, как создать пользовательскую сеть и протестировать взаимодействие между контейнерами в этой сети.

Создание пользовательской сети

Для создания пользовательской сети в Docker можно использовать команду docker network create. Эта команда позволяет указать драйвер сети, подсеть и другие параметры конфигурации.

Создание пользовательской мостовой сети

Давайте создадим пользовательскую мостовую сеть с именем my-network:

docker network create my-network

Вы можете проверить создание сети, используя команду docker network ls:

NETWORK ID     NAME         DRIVER    SCOPE
a1b2c3d4e5f6   my-network   bridge    local

Подключение контейнеров к пользовательской сети

Теперь давайте запустим два контейнера и подключим их к пользовательской сети my-network:

## Запуск контейнера 1
docker run -d --name container1 --network my-network ubuntu:22.04 sleep infinity

## Запуск контейнера 2
docker run -d --name container2 --network my-network ubuntu:22.04 sleep infinity

Вы можете просмотреть сеть и увидеть подключенные контейнеры, используя команду docker network inspect:

[
  {
    "Name": "my-network",
    "Id": "a1b2c3d4e5f6",
    "Created": "2023-04-18T12:34:56.789Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "172.18.0.0/16"
        }
      ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
      "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
      "container1_id": {
        "Name": "container1",
        "EndpointID": "container1_endpoint_id",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
      },
      "container2_id": {
        "Name": "container2",
        "EndpointID": "container2_endpoint_id",
        "MacAddress": "02:42:ac:12:00:03",
        "IPv4Address": "172.18.0.3/16",
        "IPv6Address": ""
      }
    },
    "Options": {},
    "Labels": {}
  }
]

Теперь, когда мы создали пользовательскую сеть и подключили к ней контейнеры, мы можем протестировать взаимодействие между контейнерами в следующей секции.

Тестирование взаимодействия контейнеров

Теперь, когда мы создали пользовательскую сеть и подключили к ней контейнеры, мы можем протестировать взаимодействие между ними.

Пинг между контейнерами

Начнем с пинга одного контейнера из другого:

## Входим в первый контейнер
docker exec -it container1 bash

## Пингуем второй контейнер по имени
ping -c 4 container2

Вывод должен показать, что контейнеры могут взаимодействовать друг с другом, используя имена контейнеров:

PING container2 (172.18.0.3) 56(84) байт данных.
64 байта от container2.my-network (172.18.0.3): icmp_seq=1 ttl=64 time=0.065 мс
64 байта от container2.my-network (172.18.0.3): icmp_seq=2 ttl=64 time=0.057 мс
64 байта от container2.my-network (172.18.0.3): icmp_seq=3 ttl=64 time=0.057 мс
64 байта от container2.my-network (172.18.0.3): icmp_seq=4 ttl=64 time=0.057 мс

--- container2 ping statistics ---
4 пакета отправлено, 4 получено, 0% потерь, время 3 мс
мин/сред/макс/откл = 0.057/0.059/0.065/0.003 мс

Тестирование TCP-взаимодействия

Также можно протестировать TCP-взаимодействие между контейнерами. Например, можно запустить простой HTTP-сервер в одном контейнере и получить доступ к нему из другого контейнера:

## Запускаем простой HTTP-сервер в контейнере container1
docker exec -it container1 bash
python3 -m http.server 8000

## В другом терминале, получаем доступ к HTTP-серверу из контейнера container2
docker exec -it container2 bash
curl http://container1:8000

Вывод во втором терминале должен отобразить содержимое HTTP-сервера, запущенного в первом контейнере.

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

Резюме

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