Как использовать команду docker network connect для управления сетями контейнеров

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы узнаете, как эффективно управлять сетями контейнеров с помощью команды docker network connect. Вы научитесь подключать запущенный контейнер к существующей сети, подключать контейнер к сети при его начальном запуске, задавать статический IP-адрес для контейнера в сети и создавать сетевые псевдонимы для контейнеров, чтобы облегчить взаимодействие между ними.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-555173{{"Как использовать команду docker network connect для управления сетями контейнеров"}} docker/ps -.-> lab-555173{{"Как использовать команду docker network connect для управления сетями контейнеров"}} docker/rm -.-> lab-555173{{"Как использовать команду docker network connect для управления сетями контейнеров"}} docker/network -.-> lab-555173{{"Как использовать команду docker network connect для управления сетями контейнеров"}} end

Подключение запущенного контейнера к сети

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