Docker — Работа с сетями (Networks)
Эта страница объясняет, как Docker управляет сетями и как контейнеры взаимодействуют друг с другом. Здесь разобраны основные команды для просмотра сетей, диагностики сетевых проблем и проверки портов сервисов. Материал ориентирован на начинающих и помогает понять, как контейнеры находят друг друга внутри Docker-проекта и как сервисы становятся доступными снаружи.
Как работают сети в Docker
По умолчанию каждый контейнер подключается к одной или нескольким Docker-сетям. Сеть позволяет контейнерам:
- общаться друг с другом по имени сервиса
- передавать данные между сервисами
- изолировать проекты друг от друга
Например, в одном проекте могут работать контейнеры:
nginxphpmysqlredis
Все они находятся в одной сети и могут обращаться друг к другу по имени сервиса:
php -> mysql
php -> redis
nginx -> php
Пример подключения к базе внутри контейнера:
mysql:3306
Где mysql — имя сервиса из docker-compose.yml.
Список Docker-сетей
Показать все сети
docker network ls
Пример вывода:
NETWORK ID NAME DRIVER
9a8b7c6d5e bridge bridge
8f7e6d5c4b host host
7e6d5c4b3a project_default bridge
Что означает каждая сеть
| Сеть | Назначение |
|---|---|
| bridge | стандартная сеть Docker |
| host | контейнер использует сеть хоста |
| project_default | сеть Docker Compose проекта |
Сеть Docker Compose
Когда запускается проект через:
docker compose up -d
Docker автоматически создаёт сеть:
projectname_default
Например:
site1_default
Все сервисы из docker-compose.yml автоматически подключаются к этой сети.
Это позволяет контейнерам обращаться друг к другу по имени сервиса.
Проверка сети проекта
Посмотреть информацию о сети
docker network inspect <network_name>
Пример:
docker network inspect site1_default
Эта команда показывает:
- подключенные контейнеры
- IP-адреса контейнеров
- настройки сети
Пример вывода
Внутри результата можно увидеть блок:
"Containers": {
"php_container": {
"Name": "site1_php",
"IPv4Address": "172.20.0.3"
},
"mysql_container": {
"Name": "site1_mysql",
"IPv4Address": "172.20.0.4"
}
}
Это означает, что контейнеры подключены к сети и могут взаимодействовать.
Проверка портов сервисов
Контейнер может быть доступен:
- внутри Docker-сети
- снаружи сервера
Для доступа извне используются проброшенные порты.
Проверить порт сервиса
docker compose port <service> <port>
Пример:
docker compose port nginx 80
Результат:
0.0.0.0:8080
Это означает, что контейнерный порт 80 доступен на сервере через порт 8080.
Проверка портов через docker ps
Можно также проверить порты так:
docker ps
Пример вывода:
CONTAINER ID IMAGE PORTS
ab12cd34 nginx 0.0.0.0:8080->80/tcp
Это означает:
сервер:8080 -> контейнер:80
Подключение контейнера к сети
Иногда контейнер нужно подключить к существующей сети.
Подключить контейнер
docker network connect <network> <container>
Пример:
docker network connect site1_default redis_container
После этого контейнер сможет взаимодействовать с сервисами сети.
Отключение контейнера от сети
docker network disconnect <network> <container>
Пример:
docker network disconnect site1_default redis_container
Контейнер больше не сможет общаться с сервисами этой сети.
Проверка сетевого доступа внутри контейнера
Если сервисы не могут взаимодействовать, нужно проверить соединение.
Подключиться к контейнеру
docker compose exec php sh
Проверить доступ к другому сервису
Например, проверить базу данных:
ping mysql
или
nc -zv mysql 3306
Если соединение работает — сеть настроена правильно.
Проверка DNS внутри Docker
Docker автоматически создаёт DNS внутри сети.
Это позволяет обращаться к сервисам по имени.
Например:
mysql
redis
php
nginx
Проверить DNS
Внутри контейнера:
nslookup mysql
или
ping mysql
Если DNS работает, контейнер получит IP.
Типичные сетевые проблемы
Контейнеры не видят друг друга
Возможные причины:
- контейнеры находятся в разных сетях
- неправильное имя сервиса
- сервис не запущен
Проверить:
docker network inspect <network>
Неверное имя сервиса
В Docker Compose нужно использовать имя сервиса, а не имя контейнера.
Пример:
mysql
а не:
project_mysql_1
Порт не доступен снаружи
Проверить docker-compose.yml.
Пример правильного проброса:
ports:
- "8080:80"
Это означает:
сервер:8080 -> контейнер:80
Контейнер запущен, но сайт не открывается
Проверить:
docker ps
Если порт не указан — он не проброшен наружу.
Типичный сценарий диагностики сети
Если сервис не работает:
1 Проверить контейнеры
docker compose ps
2 Проверить сеть
docker network ls
3 Проверить подключенные контейнеры
docker network inspect <network>
4 Проверить DNS внутри контейнера
docker compose exec php ping mysql
Краткая памятка
docker network ls # список сетей
docker network inspect <network> # информация о сети
docker compose port <service> <port> # проверить проброс порта
docker network connect <network> <container> # подключить контейнер
docker network disconnect <network> <container> # отключить контейнер
docker ps # посмотреть проброшенные порты
No comments to display
No comments to display