Docker / Docker network

Docker network

Container-ууд хоорондоо болон гадаад сүлжээтэй хэрхэн холбогддогийг Docker network удирддаг. Network ойлгохгүйгээр олон container-тай аппликейшн ажиллуулахад хэцүү.

Анхдагч network-ууд

Docker суулгасны дараа гурван network автоматаар үүснэ:

bash
docker network ls
код
NETWORK ID     NAME      DRIVER    SCOPE
a1b2c3d4e5f6   bridge    bridge    local
b2c3d4e5f6a1   host      host      local
c3d4e5f6a1b2   none      null      local

Bridge network (анхдагч)

Container ажиллуулахад -network заагаагүй бол bridge network-т орно.

bash
docker run -d --name app1 nginx
docker run -d --name app2 nginx

app1 ба app2 хоёулаа bridge network-т байна. Гэхдээ анхдагч bridge-д нэрээр хандах боломжгүй — зөвхөн IP хаягаар.

bash
# Container-ийн IP хаяг харах
docker inspect app1 | grep '"IPAddress"'
# "IPAddress": "172.17.0.2"

# IP-аар хандаж болно, гэхдээ IP өөрчлөгдөж болно
docker exec app2 curl 172.17.0.2

Custom bridge network (зөвлөмж)

Өөрийн network үүсгэвэл container-ууд нэрээр хандаж болно — DNS автоматаар ажиллана.

bash
# Network үүсгэх
docker network create mynet

# Container-уудыг тэр network-т ажиллуулах
docker run -d --name db --network mynet postgres:16 -e POSTGRES_PASSWORD=secret
docker run -d --name app --network mynet -p 3000:3000 myapp

app container нь db нэрээр PostgreSQL-д хандаж болно:

javascript
// Container дотор "db" нэр ажиллана
const pool = new Pool({ host: "db", port: 5432 });

Host network

Container нь host машины сүлжээг шууд ашиглана — port mapping шаардлагагүй. Зөвхөн Linux-т ажиллана (Mac/Windows-т бүрэн дэмжигдэхгүй).

bash
docker run -d --network host nginx
# Nginx host-ийн 80 port-д шууд сонсоно
# -p флаг шаардлагагүй

Гүйцэтгэл маш сайн боловч тусгаарлалт байхгүй тул production-д болгоомжтой ашиглана.

None network

Сүлжээний холбоо огт байхгүй — бүрэн тусгаарлагдсан container.

bash
docker run -d --network none myapp
# Гаднаас ч, дотроос ч сүлжээнд хандах боломжгүй

Аюулгүй байдлын шаардлагатай тооцооллын ажлуудад хэрэглэнэ.

docker network команд

bash
# Network үүсгэх
docker network create mynet

# Driver зааж үүсгэх
docker network create --driver bridge mynet

# Subnet заах
docker network create --subnet 192.168.10.0/24 mynet

# Бүх network жагсаах
docker network ls

# Network-ийн дэлгэрэнгүй мэдээлэл
docker network inspect mynet

# Container-ийг network-т нэмэх (ажиллаж байхад ч болно)
docker network connect mynet app1

# Container-ийг network-ээс салгах
docker network disconnect mynet app1

# Network устгах
docker network rm mynet

# Ашиглагдаагүй network устгах
docker network prune

docker network inspect

bash
docker network inspect mynet
json
[
  {
    "Name": "mynet",
    "Driver": "bridge",
    "Subnet": "172.20.0.0/16",
    "Containers": {
      "a1b2...": {
        "Name": "db",
        "IPv4Address": "172.20.0.2/16"
      },
      "c3d4...": {
        "Name": "app",
        "IPv4Address": "172.20.0.3/16"
      }
    }
  }
]

Container хоорондын холбоо

Жишээ: Node.js апп + Redis + PostgreSQL

bash
# Network үүсгэх
docker network create appnet

# PostgreSQL
docker run -d \
  --name postgres \
  --network appnet \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=mydb \
  postgres:16

# Redis
docker run -d \
  --name redis \
  --network appnet \
  redis:7-alpine

# Node.js апп
docker run -d \
  --name app \
  --network appnet \
  -p 3000:3000 \
  -e DB_HOST=postgres \
  -e REDIS_HOST=redis \
  myapp:1.0

app container дотор:

  • postgres нэрээр PostgreSQL-д хандана
  • redis нэрээр Redis-т хандана
  • Гаднаас зөвхөн app-ийн 3000 port харагдана

Олон network

Container нэгэн зэрэг хэд хэдэн network-т байж болно:

bash
docker network create frontend
docker network create backend

# Backend-д ажиллах DB
docker run -d --name db --network backend postgres:16

# Хоёр network-т байх апп
docker run -d --name app --network backend myapp
docker network connect frontend app

# Зөвхөн frontend-д байх nginx
docker run -d --name nginx --network frontend -p 80:80 nginx
код
Интернет → nginx (frontend) → app (frontend + backend) → db (backend)

db нь frontend network-т байхгүй тул гаднаас шууд хандах боломжгүй.

Network driver-ууд харьцуулалт

| Driver | Хэрэглэх үе | DNS | Гүйцэтгэл | | ------- | --------------------------------- | --- | ------------ | | bridge | Нэг host дахь container-ууд | ✓ | Сайн | | host | Гүйцэтгэл хамгийн чухал үед | — | Хамгийн сайн | | none | Сүлжээ шаардлагагүй тооцоолол | — | — | | overlay | Хэд хэдэн host (Swarm/Kubernetes) | ✓ | Дунд |

Дараагийн хичээлд:

Docker Compose ашиглан олон container-ийг нэг файлаар тохируулж ажиллуулна.