Введение
В этом лабораторном занятии вы узнаете, как эффективно управлять сетями контейнеров с помощью команды docker network connect. Вы научитесь подключать запущенный контейнер к существующей сети, подключать контейнер к сети при его начальном запуске, задавать статический IP-адрес для контейнера в сети и создавать сетевые псевдонимы для контейнеров, чтобы облегчить взаимодействие между ними.
Путем выполнения практических упражнений вы получите практический опыт по настройке сетевых конфигураций контейнеров, что позволит вам создавать более надежные и взаимосвязанные Docker-приложения.
Подключить работающий контейнер к сети
На этом этапе вы узнаете, как подключить запущенный Docker-контейнер к существующей сети. Это полезно, когда у вас уже запущен контейнер, и вам нужно, чтобы он мог взаимодействовать с другими контейнерами или службами в определенной сети.
Сначала создадим новую сеть, которую будем использовать для этой демонстрации. Создадим мостовую сеть с именем my-network.
docker network create my-network
Вы должны увидеть вывод, похожий на следующий, что означает, что сеть успешно создана:
<network_id>
Теперь запустим простой контейнер, который изначально не подключен к сети my-network. Запустим контейнер на основе образа alpine в фоновом режиме (-d) и назовем его my-container.
docker run -d --name my-container alpine sleep infinity
В качестве вывода будет идентификатор контейнера:
<container_id>
Чтобы убедиться, что контейнер запущен и не подключен к сети my-network, можно проверить настройки сети контейнера.
docker inspect my-container --format '{{json .NetworkSettings.Networks}}'
В выводе будет показана стандартная мостовая сеть, но не my-network:
{
"bridge": {
"IPAMData": null,
"IPAddress": "<ip_address>",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "<mac_address>",
"DriverOpts": null
}
}
Теперь подключим запущенный контейнер my-container к сети my-network с помощью команды docker network connect.
docker network connect my-network my-container
Если команда выполнена успешно, не будет никакого вывода.
Чтобы убедиться, что контейнер теперь подключен к сети my-network, проверим настройки сети контейнера еще раз.
docker inspect my-container --format '{{json .NetworkSettings.Networks}}'
На этот раз в выводе должны быть показаны как стандартная мостовая сеть, так и my-network:
{
"bridge": {
"IPAMData": null,
"IPAddress": "<ip_address>",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "<mac_address>",
"DriverOpts": null
},
"my-network": {
"IPAMData": null,
"IPAddress": "<ip_address>",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "<mac_address>",
"DriverOpts": null
}
}
Наконец, удалим созданный контейнер и сеть.
docker stop my-container
docker rm my-container
docker network rm my-network
Подключить контейнер к сети при запуске
На этом этапе вы узнаете, как подключить Docker-контейнер к определенной сети при его запуске. Это самый распространенный способ обеспечить то, чтобы ваши контейнеры были подключены к правильной сети с самого начала.
Сначала создадим новую сеть с именем app-network, которую будем использовать.
docker network create app-network
Вы должны увидеть вывод, похожий на следующий, что означает, что сеть успешно создана:
<network_id>
Теперь запустим простой контейнер на основе образа nginx и подключим его к сети app-network сразу при запуске. Для этого используем флаг --network, за которым следует имя сети. Также запустим контейнер в фоновом режиме (-d) и назовем его web-server.
docker run -d --name web-server --network app-network nginx
В качестве вывода будет идентификатор контейнера:
<container_id>
Чтобы убедиться, что контейнер подключен к сети app-network, можно проверить настройки сети контейнера.
docker inspect web-server --format '{{json .NetworkSettings.Networks}}'
В выводе должно быть показано, что контейнер подключен к сети app-network:
{
"app-network": {
"IPAMData": null,
"IPAddress": "<ip_address>",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "<mac_address>",
"DriverOpts": null
}
}
Обратите внимание, что на этот раз контейнер подключен только к сети app-network, а не к стандартной мостовой сети, так как мы указали сеть при выполнении команды docker run.
Наконец, удалим созданный контейнер и сеть.
docker stop web-server
docker rm web-server
docker network rm app-network
Указать IP - адрес для контейнера в сети
На этом этапе вы узнаете, как назначить конкретный статический IP-адрес контейнеру при подключении его к сети. По умолчанию Docker назначает IP-адреса динамически из подсети сети. Однако в некоторых случаях вам может потребоваться, чтобы контейнер имел предсказуемый IP-адрес.
Сначала создадим новую сеть с указанной подсетью. Создадим мостовую сеть с именем static-net с подсетью 172.20.0.0/16.
docker network create --subnet 172.20.0.0/16 static-net
Вы должны увидеть вывод, похожий на следующий, что означает, что сеть успешно создана:
<network_id>
Теперь запустим контейнер на основе образа alpine и подключим его к сети static-net, указав статический IP-адрес с помощью флага --ip. Назначим IP-адрес 172.20.0.10. Запустим контейнер в фоновом режиме (-d) и назовем его static-ip-container.
docker run -d --name static-ip-container --network static-net --ip 172.20.0.10 alpine sleep infinity
В качестве вывода будет идентификатор контейнера:
<container_id>
Чтобы убедиться, что контейнер имеет назначенный статический IP-адрес в сети static-net, проверим настройки сети контейнера.
docker inspect static-ip-container --format '{{json .NetworkSettings.Networks}}'
В выводе должно быть показано, что контейнер подключен к сети static-net с указанным IP-адресом:
{
"static-net": {
"IPAMData": null,
"IPAddress": "172.20.0.10",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "<mac_address>",
"DriverOpts": null
}
}
Наконец, удалим созданный контейнер и сеть.
docker stop static-ip-container
docker rm static-ip-container
docker network rm static-net
Создать сетевые псевдонимы для контейнера
На этом этапе вы узнаете, как создавать сетевые псевдонимы для контейнера. Сетевые псевдонимы предоставляют альтернативные имена, которые другие контейнеры в той же сети могут использовать для разрешения и подключения к этому контейнеру. Это полезно для обнаружения служб в Docker-сети.
Сначала создадим новую сеть с именем alias-network.
docker network create alias-network
Вы должны увидеть вывод, похожий на следующий, что означает, что сеть успешно создана:
<network_id>
Теперь запустим контейнер на основе образа nginx и подключим его к сети alias-network, присвоив сетевой псевдоним с помощью флага --network-alias. Присвоим псевдоним web. Запустим контейнер в фоновом режиме (-d) и назовем его alias-container.
docker run -d --name alias-container --network alias-network --network-alias web nginx
В качестве вывода будет идентификатор контейнера:
<container_id>
Чтобы убедиться, что контейнер имеет сетевой псевдоним, проверим настройки сети контейнера.
docker inspect alias-container --format '{{json .NetworkSettings.Networks}}'
В выводе должно быть показано, что контейнер подключен к сети alias-network и перечислен сетевой псевдоним:
{
"alias-network": {
"IPAMData": null,
"IPAddress": "<ip_address>",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "<mac_address>",
"Aliases": ["web", "alias-container"],
"DriverOpts": null
}
}
Обратите внимание на часть "Aliases":["web","alias-container"] в выводе. Docker автоматически также добавляет имя контейнера в качестве псевдонима.
Теперь запустим другой контейнер в той же сети и попробуем отправить ping запросы к контейнеру alias-container с использованием его сетевого псевдонима web. Запустим контейнер на основе образа alpine в интерактивном режиме (-it) в сети alias-network.
docker run -it --rm --network alias-network alpine ping -c 3 web
Вы должны увидеть вывод, показывающий, что ping запросы к контейнеру alias-container с использованием псевдонима web были успешно отправлены:
PING web (<ip_address>): 56 data bytes
64 bytes from <ip_address>: seq=0 ttl=64 time=0.xxx ms
64 bytes from <ip_address>: seq=1 ttl=64 time=0.xxx ms
64 bytes from <ip_address>: seq=2 ttl=64 time=0.xxx ms
--- web ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.xxx/0.xxx/0.xxx/0.xxx ms
Это показывает, что контейнеры в одной и той же сети могут разрешать и взаимодействовать друг с другом с использованием сетевых псевдонимов.
Наконец, удалим созданные контейнеры и сеть.
docker stop alias-container
docker rm alias-container
docker network rm alias-network
Резюме
В этом практическом занятии вы узнали, как управлять сетями Docker-контейнеров с помощью команды docker network connect. Вы попрактиковались в подключении работающего контейнера к существующей сети, показав, как динамически добавлять сетевую связь контейнеру после его запуска.
Кроме того, вы изучили, как подключить контейнер к определенной сети при его создании, указать статический IP-адрес для контейнера в сети и создать сетевые псевдонимы, чтобы предоставить альтернативные имена контейнеру в рамках сети, улучшая возможность обнаружения и взаимодействия между контейнерами.



