Пошук уроків, статей та іншого контенту
Навчіться створювати Docker-мережі й підключати до них контейнери для ізольованої взаємодії.
Docker-мережа визначає, як контейнери можуть обмінюватися даними між собою та із зовнішнім світом.
Контейнери, підключені до однієї мережі, можуть:
знаходити один одного за іменем контейнера;
надсилати HTTP-запити та інші мережеві запити;
обмінюватися даними через відкриті порти контейнерів.
Власна мережа також ізолює контейнери від контейнерів, які підключені до інших мереж.
Найчастіше для локальної розробки використовують мережі з драйвером bridge.
Створити мережу можна командою:
docker network create app-netТут:
docker network create — створення нової мережі;
app-net — ім’я мережі.
Перевірити список мереж:
docker network lsПриклад результату:
NETWORK ID NAME DRIVER SCOPE
abc123def456 bridge bridge local
def456abc123 host host local
789ghi012jkl app-net bridge localDocker також створює стандартні мережі bridge, host і none. Для власної взаємодії контейнерів краще створювати окрему мережу.
Контейнер можна одразу підключити до потрібної мережі за допомогою параметра --network:
docker run -d \
--name web \
--network app-net \
nginx:alpineПісля виконання команди:
Docker запустить контейнер у фоновому режимі;
контейнер отримає ім’я web;
контейнер буде підключений до мережі app-net;
усередині контейнера запрацює вебсервер Nginx.
Перевірити стан контейнера:
docker psСтворимо інший контейнер у тій самій мережі:
docker run --rm \
--network app-net \
busybox \
wget -qO- http://webКонтейнер busybox надсилає HTTP-запит до адреси http://web.
Ім’я web — це ім’я контейнера, який працює в мережі app-net. Docker автоматично розв’язує це ім’я в IP-адресу контейнера.
У результаті команда виведе HTML-код стандартної сторінки Nginx:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...Для взаємодії контейнерам не потрібно знати IP-адреси одне одного. Використовуйте імена контейнерів як імена хостів.
Наведений приклад можна виконати послідовно в терміналі:
# Створюємо окрему мережу для застосунку
docker network create app-net
# Запускаємо вебсервер у цій мережі
docker run -d \
--name web \
--network app-net \
nginx:alpine
# Запускаємо тимчасовий клієнт у тій самій мережі
# Контейнер видалиться після завершення команди
docker run --rm \
--network app-net \
busybox \
wget -qO- http://web
# Видаляємо контейнер і мережу після завершення прикладу
docker rm -f web
docker network rm app-netІноді контейнер запускають без мережі або в іншій мережі, а потім підключають до додаткової мережі.
Створимо контейнер, який працює тривалий час:
docker run -d \
--name toolbox \
busybox \
sleep 3600Створимо мережу:
docker network create app-netПідключимо запущений контейнер до цієї мережі:
docker network connect app-net toolboxТепер контейнер toolbox підключений до мережі app-net.
Перевірити мережеві підключення контейнера можна так:
docker inspect toolboxУ виведенні знайдіть розділ NetworkSettings.Networks. Там буде інформація про мережі, до яких підключений контейнер.
Також можна перевірити саму мережу:
docker network inspect app-netУ результаті буде видно список підключених контейнерів.
Щоб відключити контейнер від мережі, використовуйте:
docker network disconnect app-net toolboxПісля цього контейнер toolbox більше не буде підключений до app-net.
Контейнер має залишатися підключеним щонайменше до однієї мережі, якщо він повинен продовжувати мережеву роботу.
Контейнери в одній Docker-мережі можуть взаємодіяти через внутрішні порти без параметра -p.
Наприклад, Nginx слухає порт 80 усередині контейнера. Інший контейнер у цій самій мережі звертається до нього так:
http://web:80або скорочено:
http://webПараметр -p потрібен, коли до контейнера має звертатися хостова система або зовнішній клієнт:
docker run -d \
--name web \
--network app-net \
-p 8080:80 \
nginx:alpineУ цьому прикладі:
80 — порт Nginx усередині контейнера;
8080 — порт на хостовій системі;
запит до localhost:8080 на хості буде передано до порту 80 контейнера.
Для запиту з іншого контейнера в app-net параметр -p не потрібен. Такий контейнер використовує адресу http://web:80.
Контейнер, підключений до app-net, не повинен автоматично взаємодіяти з контейнером, який підключений до іншої окремої мережі.
Наприклад, створимо дві мережі:
docker network create frontend-net
docker network create backend-netЗапустимо контейнери в різних мережах:
docker run -d \
--name frontend \
--network frontend-net \
nginx:alpine
docker run -d \
--name backend \
--network backend-net \
nginx:alpinefrontend зможе знаходити контейнери у frontend-net, а backend — у backend-net. Самого підключення до різних мереж достатньо, щоб розділити ці групи контейнерів.
Один контейнер можна підключити до кількох мереж. Наприклад, щоб frontend міг взаємодіяти і з власною мережею, і з мережею бекенду:
docker network connect backend-net frontendТепер frontend підключений до обох мереж.
Після завершення прикладу видаліть ресурси:
docker rm -f frontend backend
docker network rm frontend-net backend-netОсновні команди для роботи з мережами:
# Показати всі мережі
docker network ls
# Створити мережу
docker network create app-net
# Показати інформацію про мережу
docker network inspect app-net
# Підключити контейнер до мережі
docker network connect app-net container-name
# Відключити контейнер від мережі
docker network disconnect app-net container-name
# Видалити мережу
docker network rm app-netМережу не можна видалити, якщо до неї все ще підключені контейнери. Спочатку потрібно відключити або видалити ці контейнери.
У запиті потрібно використовувати ім’я контейнера, вказане через --name:
docker run -d --name web --network app-net nginx:alpineУ цьому випадку правильна адреса:
http://webІм’я образу nginx:alpine не є іменем контейнера.
Якщо два контейнери знаходяться в різних мережах, вони можуть не бачити один одного за іменами. Перевірте підключення:
docker network inspect app-netlocalhost для іншого контейнераУсередині контейнера localhost посилається на цей самий контейнер, а не на хост і не на інший контейнер.
Неправильно:
http://localhost:80Якщо вебсервер працює в контейнері web, використовуйте:
http://web:80Перед видаленням мережі перевірте її підключення:
docker network inspect app-netПісля цього відключіть контейнери:
docker network disconnect app-net webАбо видаліть контейнери:
docker rm -f webDocker-мережа об’єднує контейнери для мережевої взаємодії.
Власну мережу створюють командою docker network create.
Новий контейнер підключають через --network.
Уже запущений контейнер підключають через docker network connect.
Контейнери в одній користувацькій мережі можуть звертатися один до одного за іменами.
-p потрібен для доступу з хоста, але не для взаємодії контейнерів в одній мережі.
Окремі мережі допомагають ізолювати групи контейнерів.
Інформацію про підключення можна переглянути за допомогою docker network inspect.