# Docker — Работа с сетями (Networks)

Эта страница объясняет, как Docker управляет сетями и как контейнеры взаимодействуют друг с другом. Здесь разобраны основные команды для просмотра сетей, диагностики сетевых проблем и проверки портов сервисов. Материал ориентирован на начинающих и помогает понять, **как контейнеры находят друг друга внутри Docker-проекта и как сервисы становятся доступными снаружи**.

---

# Как работают сети в Docker

По умолчанию каждый контейнер подключается к одной или нескольким Docker-сетям.
Сеть позволяет контейнерам:

* общаться друг с другом по имени сервиса
* передавать данные между сервисами
* изолировать проекты друг от друга

Например, в одном проекте могут работать контейнеры:

* `nginx`
* `php`
* `mysql`
* `redis`

Все они находятся в одной сети и могут обращаться друг к другу по имени сервиса:

```
php -> mysql
php -> redis
nginx -> php
```

Пример подключения к базе внутри контейнера:

```
mysql:3306
```

Где `mysql` — имя сервиса из `docker-compose.yml`.

---

# Список Docker-сетей

## Показать все сети

```bash
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

Когда запускается проект через:

```bash
docker compose up -d
```

Docker автоматически создаёт сеть:

```
projectname_default
```

Например:

```
site1_default
```

Все сервисы из `docker-compose.yml` автоматически подключаются к этой сети.

Это позволяет контейнерам обращаться друг к другу **по имени сервиса**.

---

# Проверка сети проекта

## Посмотреть информацию о сети

```bash
docker network inspect <network_name>
```

Пример:

```bash
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-сети**
* **снаружи сервера**

Для доступа извне используются **проброшенные порты**.

---

## Проверить порт сервиса

```bash
docker compose port <service> <port>
```

Пример:

```bash
docker compose port nginx 80
```

Результат:

```
0.0.0.0:8080
```

Это означает, что контейнерный порт `80` доступен на сервере через порт `8080`.

---

# Проверка портов через docker ps

Можно также проверить порты так:

```bash
docker ps
```

Пример вывода:

```
CONTAINER ID   IMAGE      PORTS
ab12cd34       nginx      0.0.0.0:8080->80/tcp
```

Это означает:

```
сервер:8080 -> контейнер:80
```

---

# Подключение контейнера к сети

Иногда контейнер нужно подключить к существующей сети.

## Подключить контейнер

```bash
docker network connect <network> <container>
```

Пример:

```bash
docker network connect site1_default redis_container
```

После этого контейнер сможет взаимодействовать с сервисами сети.

---

# Отключение контейнера от сети

```bash
docker network disconnect <network> <container>
```

Пример:

```bash
docker network disconnect site1_default redis_container
```

Контейнер больше не сможет общаться с сервисами этой сети.

---

# Проверка сетевого доступа внутри контейнера

Если сервисы не могут взаимодействовать, нужно проверить соединение.

## Подключиться к контейнеру

```bash
docker compose exec php sh
```

---

## Проверить доступ к другому сервису

Например, проверить базу данных:

```bash
ping mysql
```

или

```bash
nc -zv mysql 3306
```

Если соединение работает — сеть настроена правильно.

---

# Проверка DNS внутри Docker

Docker автоматически создаёт DNS внутри сети.

Это позволяет обращаться к сервисам **по имени**.

Например:

```
mysql
redis
php
nginx
```

---

## Проверить DNS

Внутри контейнера:

```bash
nslookup mysql
```

или

```bash
ping mysql
```

Если DNS работает, контейнер получит IP.

---

# Типичные сетевые проблемы

## Контейнеры не видят друг друга

Возможные причины:

* контейнеры находятся в разных сетях
* неправильное имя сервиса
* сервис не запущен

Проверить:

```bash
docker network inspect <network>
```

---

## Неверное имя сервиса

В Docker Compose нужно использовать **имя сервиса**, а не имя контейнера.

Пример:

```
mysql
```

а не:

```
project_mysql_1
```

---

## Порт не доступен снаружи

Проверить `docker-compose.yml`.

Пример правильного проброса:

```yaml
ports:
  - "8080:80"
```

Это означает:

```
сервер:8080 -> контейнер:80
```

---

## Контейнер запущен, но сайт не открывается

Проверить:

```bash
docker ps
```

Если порт не указан — он не проброшен наружу.

---

# Типичный сценарий диагностики сети

Если сервис не работает:

### 1 Проверить контейнеры

```bash
docker compose ps
```

---

### 2 Проверить сеть

```bash
docker network ls
```

---

### 3 Проверить подключенные контейнеры

```bash
docker network inspect <network>
```

---

### 4 Проверить DNS внутри контейнера

```bash
docker compose exec php ping mysql
```

---

# Краткая памятка

```bash
docker network ls                       # список сетей
docker network inspect <network>        # информация о сети

docker compose port <service> <port>    # проверить проброс порта

docker network connect <network> <container>     # подключить контейнер
docker network disconnect <network> <container>  # отключить контейнер

docker ps                               # посмотреть проброшенные порты
```