Asosiy kontentga o‘tish
Innovialabs

Docker tarmoqlari: bridge, host va maxsus tarmoqlar

Asoslar3 daq

Qisqacha

Bitta maxsus tarmoqdagi konteynerlar bir-birini servis nomi orqali topadi, tashqaridan esa ilovaga faqat ochilgan port (-p) orqali kirish mumkin. Host tarmog‘i izolyatsiyani olib tashlaydi va kam hollarda kerak bo‘ladi.

Docker tarmoqlari qanday ishlaydi

Har bir konteyner o‘zining tarmoq stekiga ega: alohida IP-manzil, alohida portlar, alohida localhost. Docker konteynerlarni bir-biri va host bilan tarmoq drayverlari orqali bog‘laydi. Kundalik ishda uchta variant muhim:

  • bridge (standart) — host ichidagi virtual tarmoq. Konteynerlar ichki manzil oladi va tashqariga NAT orqali chiqadi.
  • maxsus (user-defined) bridge tarmog‘i — xuddi shunday, lekin konteyner nomi bo‘yicha DNS va yaxshiroq izolyatsiya bilan. Bu standart tanlov.
  • host — konteyner hostning tarmoq stekidan to‘g‘ridan-to‘g‘ri foydalanadi, izolyatsiyasiz va port ochmasdan.

Boshqa drayverlar ham bor (none, overlay, macvlan), lekin ular maxsus vazifalar uchun: to‘liq izolyatsiya, klasterlar yoki konteynerni fizik tarmoqqa bevosita ulash.

Portlarni ochish: konteynerga tashqaridan kirish

Standart holatda konteyner ichidagi port hostdan ham, internetdan ham ko‘rinmaydi. Uni ochish uchun portni publish qilish kerak:

docker run -d -p 8080:80 nginx

Yozuv HOST:KONTEYNER deb o‘qiladi: hostning 8080-portiga kelgan so‘rovlar konteynerning 80-portiga tushadi.

Muhim tafsilotlar:

  • -p 8080:80 hostning barcha interfeyslarida tinglaydi, ya’ni port internetdan ko‘rinishi mumkin. Agar servis faqat lokal kerak bo‘lsa, -p 127.0.0.1:8080:80 dan foydalaning.
  • Docker hostdagi firewallga o‘z qoidalarini qo‘shadi va ular ufw kabi sozlamalarni chetlab o‘tishi mumkin. Ma’lumotlar bazasi portlarini zaruratsiz ochmang.
  • Dockerfile’dagi EXPOSE — faqat hujjatlashtirish, u portni ochmaydi.

Servis nomi bo‘yicha DNS

Maxsus tarmoqda konteynerlar bir-biriga IP orqali emas, nom orqali murojaat qiladi. IP-manzillar konteyner har safar qayta yaratilganda o‘zgaradi, nomlar esa o‘zgarmaydi.

docker network create app-net
docker run -d --name db --network app-net postgres
docker run -d --name api --network app-net my-api

Endi api bazaga db:5432 manzili orqali ulanadi. Standart bridge tarmog‘ida bunday DNS ishlamaydi — bu «host topilmadi» xatosining keng tarqalgan sababi.

Docker Compose’da maxsus tarmoq avtomatik yaratiladi va docker-compose.yml dagi servis nomi uning DNS-nomiga aylanadi:

services:
  api:
    build: .
    ports:
      - "8080:3000"
    environment:
      DATABASE_URL: postgres://user:pass@db:5432/app
  db:
    image: postgres:16

E’tibor bering: db da ports bo‘limi yo‘q. Bazaga tashqaridan kirish shart emas — api unga ichki tarmoq orqali yetib boradi.

Rejimlarni solishtirish

RejimIzolyatsiyaNom bo‘yicha DNS-p kerakmiQachon ishlatish
standart bridgeboryo‘qhatezkor tajribalar
maxsus bridgeborhaha, tashqi kirish uchundeyarli har doim
hostyo‘q—yo‘qtarmoq unumdorligi bo‘yicha maxsus holatlar, faqat Linux
noneto‘liq——tarmoqsiz vazifalar

Keng tarqalgan xatolar

  • Konteyner ichidagi localhost. Konteyner uchun localhost — bu uning o‘zi, host ham, qo‘shni konteyner ham emas. Qo‘shnilarga servis nomi orqali murojaat qiling.
  • Ilova 127.0.0.1 da tinglaydi. Agar konteyner ichidagi server 127.0.0.1 ga bog‘langan bo‘lsa, ochilgan port ishlamaydi. 0.0.0.0 da tinglang.
  • -p da portlar almashib ketgan. Chapda host porti, o‘ngda konteyner porti.
  • Hostda port band. Agar host porti boshqa jarayon tomonidan ishlatilsa, Docker konteynerni ishga tushirmaydi.
  • Konteynerlar turli tarmoqlarda. Turli Compose loyihalaridagi servislar standart holatda bir-birini ko‘rmaydi. Ularni umumiy tashqi tarmoqqa ulang.
  • Tashqariga ochiq ma’lumotlar bazasi. 5432 yoki 3306 ni barcha interfeyslarda ochish — to‘g‘ridan-to‘g‘ri xavfsizlik xavfi.

Aloqani qanday tekshirish mumkin

  • docker network ls — tarmoqlar ro‘yxati.
  • docker network inspect app-net — qaysi konteynerlar ulangan va ularning manzillari.
  • docker exec -it api sh, so‘ng ping db yoki nc -zv db 5432 (agar obrazda bu utilitalar bo‘lsa) — ichkaridan tekshirish.
  • docker port api — qaysi portlar ochilgan.

Drayverlar haqida batafsil ma’lumot Docker rasmiy hujjatlarida bor.

Ko‘p beriladigan savollar

Docker Desktop’da host.docker.internal nomi ishlaydi. Linux’da uni --add-host=host.docker.internal:host-gateway orqali yoki Compose’dagi extra_hosts orqali qo‘shish mumkin.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.