Docker tarmog'i — bridge, host, none

~12 daq · Docker · Tarmoq

Muammodan boshlaylik

Ikki konteyner: api (Node.js) va baza (MySQL). API bazaga ulanishi kerak. Kodda:

mysql.createConnection({ host: 'localhost', port: 3306 });
Error: connect ECONNREFUSED 127.0.0.1:3306

API konteyneri ichidagi localhost — API ning o'zi (9-dars). Unda MySQL yo'q. Konteynerlar bir-birini qanday topadi?


Konteyner tarmog'i

Har bir konteyner o'z tarmoq muhitiga ega: o'z IP manzili, o'z localhost i, o'z portlari. Docker ularni virtual tarmoqlar orqali bog'laydi.

docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
a1b2c3d4e5f6   bridge    bridge    local
f6e5d4c3b2a1   host      host      local
1a2b3c4d5e6f   none      null      local

Uchta standart tarmoq — uchta driver.


bridge — standart

--network berilmasa, konteyner standart bridge tarmog'iga ulanadi:

     Kompyuter (host)
┌──────────────────────────────────────────┐
│   docker0 (bridge) — 172.17.0.1           │
│      ├── api   — 172.17.0.2               │
│      └── baza  — 172.17.0.3               │
└──────────────────────────────────────────┘

Konteynerlar bir-birini IP manzil orqali ko'radi:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' baza
# 172.17.0.3

Lekin IP — har qayta ishga tushishda o'zgarishi mumkin. Kodga 172.17.0.3 yozish — yomon fikr.

[!WARNING] Standart bridge tarmog'ida konteynerlar bir-birini nom bilan topa olmaydi (DNS yo'q). host: 'baza' ishlamaydi. Yechim — o'z tarmog'ingiz (24-dars). Standart bridge — eski va asosan orqaga moslik uchun.


host — kompyuterning tarmog'i

docker run -d --network host nginx

Konteyner izolyatsiyasiz — kompyuterning tarmog'ini to'g'ridan-to'g'ri ishlatadi:

  • -p kerak emas (va e'tiborsiz qoldiriladi) — Nginx to'g'ridan-to'g'ri kompyuterning 80-portida
  • Konteyner ichidagi localhost — kompyuterning o'zi
  • Tarmoq tezligi biroz yuqori (NAT yo'q)

Kamchiliklari: port to'qnashuvlari, izolyatsiya yo'q. Asosan Linux serverlarda maxsus holatlar uchun (juda yuqori tarmoq yuklamasi). Docker Desktop da (Windows/macOS) host rejimi cheklangan ishlaydi.


none — tarmoqsiz

docker run --rm --network none alpine ping -c 1 google.com
# ping: bad address 'google.com'

Hech qanday tarmoq yo'q — faqat localhost. Ishonchsiz kodni ajratilgan holda ishga tushirish, faqat fayllarni qayta ishlaydigan vazifalar uchun.


Konteynerdan kompyuterga murojaat

Konteyner kompyuterda ishlayotgan xizmatga (masalan, o'rnatilgan MySQL yoki npm run dev dagi API) ulanishi kerak:

host.docker.internal
  • Docker Desktop (Windows, macOS) — avtomatik ishlaydi
  • Linux — qo'shish kerak:
docker run --add-host=host.docker.internal:host-gateway ...
// Konteyner ichidagi ilova — kompyuterdagi API ga
fetch('http://host.docker.internal:4000/api');

11-darsdagi Adminer mashqida aynan shu ishlatilgan.


Tarmoq haqida ma'lumot

docker network inspect bridge

Qaysi konteynerlar ulangan, ularning IP manzillari, subnet. Konteyner ichidan tekshirish:

docker exec -it api sh
# ping baza
# nslookup baza
# wget -qO- http://baza:3306

Ko'p image larda ping yo'q — debug uchun maxsus konteyner:

docker run --rm -it --network mening-tarmoq nicolaka/netshoot

netshoot — tarmoq diagnostikasi vositalari to'plami: curl, dig, nslookup, tcpdump, netstat.


Tarmoq turlari

Driver Nima Qachon
bridge (standart) Izolyatsiyalangan virtual tarmoq, IP orqali Eski; o'rniga — o'z bridge tarmog'ingiz
bridge (o'zingizniki) Xuddi shu + nom bo'yicha DNS ✅ Deyarli doim (24-dars)
host Kompyuterning tarmog'i Maxsus holatlar, Linux
none Tarmoqsiz Izolyatsiyalangan vazifalar
overlay Bir nechta server bo'ylab Docker Swarm
macvlan Konteynerga haqiqiy tarmoqdagi IP Eski tizimlar bilan integratsiya

Nima uchun shunday?

Nima uchun konteynerlar standart holatda bir-birini ko'radi, lekin kompyuterning tarmog'idan ajratilgan?

Docker xavfsizlik va qulaylik o'rtasida muvozanat tanladi. Konteynerlar o'zaro gaplasha olishi kerak (API va baza) — shuning uchun umumiy virtual tarmoq. Lekin tashqi dunyo ularga faqat siz aniq ochgan portlar orqali yetishi kerak (-p). Har bir konteynerning o'z localhost i — portlar to'qnashmasligi uchun: o'nta konteyner o'z ichida 3000-portni ishlatadi. Bu — "izolyatsiya standart, ochiqlik ataylab" tamoyili.


Xulosa

Eslab qoling:

  • Har konteynerning o'z IP si, o'z localhost i
  • bridge (standart) — IP orqali; nom bo'yicha topish yo'q
  • host — kompyuter tarmog'i, izolyatsiyasiz; none — tarmoqsiz
  • host.docker.internal — konteynerdan kompyuterga (Linux da --add-host)
  • docker network ls / inspect; debug — nicolaka/netshoot
  • Amalda — o'z bridge tarmog'ingiz (keyingi dars)

Keyingi dars

24-dars: O'z tarmog'ingiz — konteynerlar nom bilan topishadi