Skip to content
Trung Tiến
HomeBlogProjectsToolsCoursesAboutContact
vi
✦

Trung Tiến

Technology in service of all beings

BlogProjectsCoursesAboutContact

© 2026

← ← Back to courses
Lessons 5/6⏱️ 30 min

Networks & Docker Compose

4/6

🌐Tại sao cần Network?

Mỗi container có network riêng — không thể giao tiếp mặc định. Khi có nhiều container (web + db + cache), cần một mạng ảo để chúng "nhìn thấy" nhau. Docker DNS tự động resolve tên container thành IP — container api chỉ cần gọi http://db:5432.
my-app-net web nginx:80 api node:3000 db pg:5432 api → http://db:5432 | web → proxy http://api:3000

Container gọi nhau bằng tên trong cùng network

Network commands
# Tạo network và chạy container
docker network create my-net
docker run -d --name db --network my-net postgres:16
docker run -d --name api --network my-net -p 3000:3000 my-api

# DNS tự động — bên trong api có thể ping "db"
docker exec api ping db
# PING db (172.18.0.2): 56 data bytes

📦Docker Compose

Chạy nhiều lệnh docker run rất mệt. Docker Compose dùng file docker-compose.yml khai báo tất cả services, network, volume. Compose tự tạo network — không cần docker network create.
docker-compose.yml
services:
  web:
    image: nginx:alpine
    ports: ["8080:80"]
    volumes: ["./html:/usr/share/nginx/html"]

  api:
    build: ./api
    ports: ["3000:3000"]
    environment: [DB_HOST=db]
    depends_on: [db]

  db:
    image: postgres:16-alpine
    volumes: ["pg-data:/var/lib/postgresql/data"]
    environment: [POSTGRES_PASSWORD=secret]

volumes: { pg-data: }

🛠️Compose commands

Compose commands
docker compose up -d    # Khởi động tất cả (nền)
docker compose down     # Dừng và xóa containers
docker compose logs -f  # Xem logs realtime
docker compose ps       # Xem trạng thái
docker compose build    # Build lại images
docker compose up -d web # Chạy 1 service cụ thể

⚖️So sánh: docker run vs Compose

  • -p 8080:80 → ports: ['8080:80']
  • -v ./html:/usr/share/nginx/html → volumes: ['./html:/usr/share/nginx/html']
  • -e DB_HOST=db → environment: [DB_HOST=db]
  • --name web → services: web: (tên service = container name)
  • --restart always → restart: always

🚀Ví dụ đầy đủ: Web + DB + Redis

Full example
services:
  web:
    build: .
    ports: ["3000:3000"]
    environment:
      DATABASE_URL: postgres://postgres:pass@db:5432/app
      REDIS_URL: redis://redis:6379
    depends_on: [db, redis]

  db:
    image: postgres:16-alpine
    volumes: ["pg-data:/var/lib/postgresql/data"]
    environment: { POSTGRES_PASSWORD: pass, POSTGRES_DB: app }

  redis:
    image: redis:7-alpine

volumes: { pg-data: }

🎯Thực hành

  1. Tạo docker-compose.yml với 2 services: web (nginx), db (postgres)
  2. Chạy docker compose up -d — xem containers chạy
  3. Chạy docker compose ps && docker compose logs web
  4. Thêm depends_on: [db] cho web và chạy lại
  5. Chạy docker compose down — dừng toàn bộ

❓ Kiểm tra kiến thức

1. Khi 2 container cùng network, chúng giao tiếp thế nào?

2. docker-compose.yml thay thế lệnh Docker nào?

← Previous5 / 6Next →