Skip to content

Docker Volumes & Networking Lab

🎯 Mục tiêu

🎯 Sau bài thực hành này, bạn sẽ:

  • Tạo và quản lý named volumes để persist dữ liệu
  • Phân biệt bind mount và named volume trong thực tế
  • Thiết lập bridge network cho giao tiếp giữa các container
  • Hiểu cơ chế DNS resolution nội bộ của Docker

Mô tả bài tập

Bạn xây dựng hệ thống gồm web server (Nginx) và database (PostgreSQL). Dữ liệu database phải persist khi container bị xóa, và hai service giao tiếp qua custom network.

Yêu cầu

Bài 1: Named Volume Management

Tạo named volume và sử dụng cho PostgreSQL container.

bash
docker volume create pgdata
docker run -d --name pg-server \
  -e POSTGRES_PASSWORD=secret123 \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16-alpine
docker volume inspect pgdata

Yêu cầu: Xóa container, tạo lại với cùng volume, xác nhận dữ liệu vẫn còn.

Bài 2: Bind Mount Patterns

Mount thư mục config từ host vào Nginx container.

bash
mkdir -p ./nginx-config
docker run -d --name web-server \
  -v $(pwd)/nginx-config:/etc/nginx/conf.d:ro \
  -p 8080:80 nginx:alpine

Yêu cầu: Sửa file config trên host, xác nhận container nhận thay đổi không cần restart.

Bài 3: Bridge Network & DNS Resolution

Tạo custom bridge network để containers giao tiếp bằng tên.

bash
docker network create app-network
docker network connect app-network pg-server
docker network connect app-network web-server
docker exec web-server ping -c 3 pg-server

Yêu cầu: Thêm container api-server trên cùng network, chứng minh DNS resolution hoạt động.

Gợi ý

Gợi ý Bài 1

Dùng docker exec pg-server psql -U postgres -c "CREATE TABLE test(id int);" để tạo data. Sau khi tạo lại container, kiểm tra bằng \dt trong psql.

Gợi ý Bài 3

Trên custom bridge network, Docker cung cấp embedded DNS. Dùng docker network inspect app-network để xem IP mapping.

Lời giải tham khảo

Xem lời giải
yaml
services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: secret123
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - backend
  api:
    build: ./api
    networks:
      - frontend
      - backend
    depends_on:
      - db
  web:
    image: nginx:alpine
    volumes:
      - ./nginx-config:/etc/nginx/conf.d:ro
    ports:
      - "80:80"
    networks:
      - frontend

volumes:
  pgdata:
networks:
  frontend:
  backend: