В этом уроке мы погрузимся в сетевые возможности Docker. Понимание сетевых функций Docker важно для создания сложных приложений, состоящих из нескольких контейнеров, которые должны взаимодействовать друг с другом и с внешним миром.
Основы сетей в Docker.
Docker предоставляет несколько сетевых драйверов по умолчанию:
- bridge (мост): Используется по умолчанию. Контейнеры, подключённые к мосту, могут общаться друг с другом на одном хосте.
- host (хост): Контейнер использует сетевой стек хост-машины напрямую.
- none (отсутствие сети): Контейнер изолирован от сети.
Вы также можете создавать пользовательские сети для более гибкого управления.
Мост (Bridge Network).
При запуске контейнера без указания сети Docker подключает его к сети bridge, которая позволяет контейнерам на одном хосте общаться друг с другом.
Просмотр сетей:
docker network ls
Создание bridge:
docker network create mybridge
Запуск контейнера в пользовательской сети:
docker run -d --name db --network mybridge postgres
docker run -d --name web --network mybridge nginx
Теперь контейнеры db и web могут общаться друг с другом по имени контейнера.
Взаимодействие между контейнерами.
Внутри пользовательской сети контейнеры могут обращаться друг к другу по имени.
Пример подключения из контейнера web к контейнеру db:
docker exec -it web ping db
Пример: Запуск приложения с базой данных и веб-сервером.
Предположим, у нас есть приложение, которое состоит из веб-сервера Nginx и базы данных PostgreSQL. Нам нужно, чтобы веб-сервер мог подключаться к базе данных.
Шаг 1: Создаём пользовательскую сеть.
docker network create app-network
Шаг 2: Запускаем базу данных в этой сети.
docker run -d --name mypostgres --network app-network -e POSTGRES_PASSWORD=mysecretpassword postgres
Шаг 3: Запускаем веб-сервер в той же сети.
docker run -d --name mynginx --network app-network nginx
Шаг 4: Настраиваем веб-сервер для подключения к базе данных.
В реальной ситуации вам нужно будет настроить ваше приложение или веб-сервер так, чтобы оно могло подключаться к базе данных по имени контейнера mypostgres.
Сетевые алиасы.
Вы можете назначить контейнеру сетевой алиас для удобства.
docker run -d --name mypostgres --network app-network --network-alias db -e POSTGRES_PASSWORD=mysecretpassword postgres
Теперь к контейнеру mypostgres можно обращаться по имени db.
Домашнее задание.
Задание 1: Создание пользовательской сети и запуск контейнеров.
1. Создайте пользовательскую сеть mynetwork.
2. Запустите контейнеры redis и alpine в этой сети.
3. Из контейнера myalpine попробуйте подключиться к redis с помощью команды redis-cli.
Задание 2: Использование сетевых алиасов.
1. Перезапустите контейнер redis, назначив ему сетевой алиас cache.
2. Из контейнера myalpine подключитесь к redis по имени cache.
Задание 3*: Исследование сетевых драйверов.
1. Создайте сеть с драйвером host.
2. Запустите контейнер в этой сети и проверьте, что он использует сетевой стек хоста.
3. Попробуйте открыть http://localhost в браузере и убедитесь, что Nginx доступен без указания порта.
4. Объясните, какие преимущества и недостатки имеет такой подход.
Что дальше?
В следующем уроке мы познакомимся с Docker Compose. Вы узнаете, как описывать и запускать многоконтейнерные приложения с помощью YAML-файлов, как управлять ими и масштабировать. Это значительно упростит вашу работу с Docker.