Введение
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, гарантируя, что ваши приложения могут беспрепятственно взаимодействовать друг с другом в рамках одной пользовательской сети.



