JavaRush /Курсы /Модуль 2: Fullstack /Связь между контейнерами

Связь между контейнерами

Модуль 2: Fullstack
15 уровень , 2 лекция
Открыта

3.1 Основы bridge-сети

Сеть bridge является сетевым драйвером по умолчанию в Docker и используется для создания изолированной сети, в которой контейнеры могут взаимодействовать друг с другом. Эта сеть позволяет контейнерам общаться по IP-адресам и именам хостов, обеспечивая удобный способ организации взаимодействия между различными компонентами многоконтейнерных приложений.

Сеть bridge создает частную внутреннюю сеть на уровне хоста, которая изолирована от внешней сети хоста. Контейнеры, подключенные к этой сети, могут взаимодействовать друг с другом, но не могут быть напрямую доступны извне без настройки проброса портов.

Автоматическое создание bridge-сети

По умолчанию Docker создает сеть bridge при установке, и контейнеры, запускаемые без указания конкретной сети, автоматически подключаются к этой сети.

Пример создания и использования контейнеров в bridge-сети

1. Запуск контейнеров в сети bridge:

В этом примере мы запускаем два контейнера: container1 с Nginx и container2 с Busybox. Оба контейнера подключены к сети bridge по умолчанию.

Terminal

docker run -d --name container1 nginx
docker run -d --name container2 busybox sleep 1000

2. Проверка IP-адресов контейнеров:

Чтобы проверить IP-адреса контейнеров, используйте команду docker inspect.

Эти команды выведут IP-адреса контейнеров, которые можно использовать для связи между ними.

Terminal

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container1
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container2

3. Связь между контейнерами по IP-адресу:

Для проверки связи между контейнерами используйте команду ping из контейнера container2 для пинга container1.

Если контейнеры правильно подключены к сети bridge, команда ping будет успешной.

Terminal

docker exec container2 ping -c 4 <IP_ADDRESS_OF_CONTAINER1>

Пояснение: Сеть bridge предоставляет простое решение для локальных приложений, где контейнеры должны взаимодействовать друг с другом, оставаясь изолированными от внешней сети. Пинг по IP-адресу является базовым способом проверки сетевого соединения, однако для более сложных приложений может потребоваться настройка DNS или дополнительных сетевых драйверов.

3.2 Использование имен хостов

Использование имен хостов для связи между контейнерами

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

Пример связи по имени хоста

1. Запуск контейнеров с указанием сети bridge:

Terminal

docker run -d --name webserver --network bridge nginx
docker run -d --name appserver --network bridge busybox sleep 1000
    

2. Проверка связи по имени хоста:

Используйте команду ping из контейнера appserver для пинга webserver:

Terminal

docker exec appserver ping -c 4 webserver 
    

Создание пользовательской bridge-сети

Вместо использования сети bridge по умолчанию вы можете создать пользовательскую bridge сеть, чтобы лучше контролировать взаимодействие между контейнерами.

Пример создания пользовательской сети

1. Создание пользовательской сети:

Terminal

docker network create --driver bridge my_bridge_network 
    

2. Запуск контейнеров в пользовательской сети:

Terminal

docker run -d --name webserver --network my_bridge_network nginx
docker run -d --name appserver --network my_bridge_network busybox sleep 1000 
    

3. Проверка связи по имени хоста:

Terminal

docker exec appserver ping -c 4 webserver 
    

3.3 Примеры нескольких хостов

Примеры практического использования

Пример 1: Веб-сервер и база данных

Создайте файл docker-compose.yml для веб-сервера и базы данных:

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    networks:
      - my_bridge_network
        
  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    networks:
      - my_bridge_network
        
networks:
  my_bridge_network:
    driver: bridge

Запустите Docker Compose:

Terminal


docker compose up -d 

Проверьте связь между контейнерами:

Terminal


docker compose exec web ping -c 4 db 

Пример 2: Микросервисная архитектура

Создайте файл docker-compose.yml для микросервисного приложения:

Yaml

version: '3.8'

services:
  frontend:
    image: nginx:latest
    networks:
      - my_bridge_network
        
  backend:
    image: mybackend:latest
    networks:
      - my_bridge_network
        
  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    networks:
      - my_bridge_network
        
networks:
  my_bridge_network:
    driver: bridge

Запустите Docker Compose:

Terminal

        
docker compose up -d 

Проверьте связь между контейнерами:

Terminal

docker compose exec backend ping -c 4 db

docker compose exec frontend ping -c 4 backend 
3
Задача
Модуль 2: Fullstack, 15 уровень, 2 лекция
Недоступна
Проверка связи между контейнерами по IP
Проверка связи между контейнерами по IP
3
Задача
Модуль 2: Fullstack, 15 уровень, 2 лекция
Недоступна
Проверка связи по имени хоста
Проверка связи по имени хоста
3
Задача
Модуль 2: Fullstack, 15 уровень, 2 лекция
Недоступна
Создание пользовательской сети
Создание пользовательской сети
3
Задача
Модуль 2: Fullstack, 15 уровень, 2 лекция
Недоступна
Использование Docker Compose для связи между контейнерами
Использование Docker Compose для связи между контейнерами
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 64
9 октября 2025
первые две задачи одинаковые...
Dmitry Panfilov Уровень 21
9 апреля 2025
только после установки пакета в web пинг заработал apt-get install iputils-ping
Dmitry Panfilov Уровень 21
9 апреля 2025
docker compose exec web ping -c 4 db OCI runtime exec failed: exec failed: unable to start container process: exec: "ping": executable file not found in $PATH: unknown docker compose exec -it web /bin/bash root@16b80e491ca9:/# ping -c 1 db bash: ping: command not found