Сети в Docker
Основы
По умолчанию docker имеет 3 сети:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9b3a83f7ee29 bridge bridge local
b0e4b775235f host host local
3421a5ef3f9a none null local
- bridge - это сеть по умолчанию, то есть когда мы при создании контейнера не указываем никакую другую сеть, контейнер создаётся в этой сети. Здесь контейнеры могут пинговать друг друга по ip-адресу, но с хоста контейнеры недоступны. Это самый часто используемый вариант для запуска одиночных контейнеров.
- host - если контейнер находится в этой сети, то он использует сеть хоста. Например, если на хосте запущен nginx, то из контейнера можно выполнить
curl http://localhost. - none - если контейнер находится в этой сети, то он полностью изолирован. У него как бы и нет сети.
Эти сети создаются Docker автоматически и доступны сразу после установки.
Docker позволяет создать пользовательскую сеть - по сути, это как bridge, но с некоторыми преимуществами:
- Контейнеры в одной пользовательской сети могут обращаться друг к другу не только по ip-адресу, но и по имени.
- Разные пользовательские сети изолированы друг от друга и от сети bridge.
На практике пользовательские сети чаще всего используют в Docker Compose и микросервисных приложениях.
Создание пользовательской сети
Создадим пользовательскую сеть:
$ docker network create mynet
Посмотрим список сетей:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9b3a83f7ee29 bridge bridge local
b0e4b775235f host host local
930c0d070d89 mynet bridge local
3421a5ef3f9a none null local
Получим информацию о созданной нами сети:
$ docker network inspect mynet
[
{
"Name": "mynet",
"Id": "930c0d070d89869941fcd096cf2a9cd91e0673b9d51c99a92526f521b791c099",
"Created": "2025-10-23T16:32:10.120275792+03:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.22.0.0/16",
"Gateway": "172.22.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
- Здесь можно увидеть диапазон IP-адресов, шлюз и список подключённых контейнеров.
Запустим два контейнера в одной сети:
$ docker run -d --name my_nginx --network mynet nginx
$ docker run --rm -it --network mynet alpine sh
- Мы подключились сразу ко второму контейнеру.
Из второго контейнера пропингуем первый (по имени) и выйдем:
# ping -c 1 my_nginx
PING my_nginx (172.22.0.2): 56 data bytes
64 bytes from 172.22.0.2: seq=0 ttl=64 time=0.104 ms
--- my_nginx ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.104/0.104/0.104 ms
# exit
Nginx работает внутри пользовательской сети mynet, там же работает alpine. Они могут обращаться друг к другу по имени. Docker сам настраивает DNS внутри пользовательской сети. А с хоста они недоступны, так как не проброшены порты.
Выключим контейнер и удалим его:
$ docker stop my_nginx
$ docker rm my_nginx
Изоляция пользовательских сетей
Каждая пользовательская сеть изолирована от других, но контейнер можно добавлять в разные сети. Изоляция сетей позволяет разделять сервисы и ограничивать их взаимодействие между собой.
Создадим другую сеть:
$ docker network create isolated-net
Запустим контейнер nginx в сети mynet, а контейнер alpine в isolated-net.
$ docker run -d --name my_nginx --network mynet nginx
$ docker run --rm -d --name myalp --network isolated-net alpine sleep 3600
sleep 3600- чтобы контейнер не завершился сразу после старта.
Подключимся к контейнеру myalp и попробуем пропинговать my_nginx:
$ docker exec -it myalp sh
# ping my_nginx
ping: bad address 'my_nginx'
# exit
- Не пингуется.
Добавим этот контейнер в сеть mynet, именно там находится my_nginx:
$ docker network connect mynet myalp
- Контейнер при этом получает дополнительный сетевой интерфейс.
Попробуем пропинговать ещё раз:
$ docker exec -it myalp sh
/ # ping -c 1 my_nginx
PING my_nginx (172.22.0.2): 56 data bytes
64 bytes from 172.22.0.2: seq=0 ttl=64 time=0.079 ms
--- my_nginx ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.079/0.079/0.079 ms
# exit
- Теперь пингуется.
Выключим контейнер и удалим его, чтобы не захламлять систему тестовыми контейнерами:
$ docker stop my_nginx
$ docker rm my_nginx
Полезные команды
Эти команды полезны при отладке сетевых проблем и изучении взаимодействия контейнеров.
docker network create <name>- создать bridge-сетьdocker network ls- посмотреть все сетиdocker network inspect <name>- детали сети (контейнеры, IP, DNS)docker network connect <net> <container>- подключить контейнер к сетиdocker network disconnect <net> <container>- отключитьdocker network rm <name>- удалить сеть (только если пустая)
Если понравилась статья, подпишись на мой канал в VK или Telegram .