Docker tarmog'i — bridge, host, none
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
bridgetarmog'ida konteynerlar bir-birini nom bilan topa olmaydi (DNS yo'q).host: 'baza'ishlamaydi. Yechim — o'z tarmog'ingiz (24-dars). Standartbridge— 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:
-pkerak 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
localhosti bridge(standart) — IP orqali; nom bo'yicha topish yo'qhost— kompyuter tarmog'i, izolyatsiyasiz;none— tarmoqsizhost.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