Giao diện
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 pgdataYê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:alpineYê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-serverYê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: