
Bài 1: Cài Docker Engine trên Ubuntu và Rocky Linux 9
Cài Docker Engine từ kho phù hợp, kiểm tra phiên bản và quyền truy cập; phân biệt lưu trữ containerd mới với overlay2 trên máy nâng cấp.

Chọn nơi lưu dữ liệu, kiểm tra quyền UID/GID và phục hồi thử backup; phân biệt dữ liệu tạm với database cần sao lưu nhất quán theo ứng dụng.
Đối chiếu ngày 24/10/2026. Các nguồn ở cuối bài dùng để kiểm tra phiên bản và giới hạn. Ví dụ phải điều chỉnh theo hệ điều hành và ứng dụng; không phải báo cáo thử nghiệm trên mọi nền tảng.
Mặc định, mọi tệp tin được tạo ra bên trong một container đều được ghi vào tầng đọc-ghi tạm thời (Writable Container Layer). Điều này dẫn đến hai nhược điểm cốt tử:
docker rm, toàn bộ dữ liệu mới ghi sẽ biến mất vĩnh viễn cùng container.Để lưu trữ cơ sở dữ liệu (PostgreSQL, MySQL, MongoDB) hoặc các tệp tin người dùng tải lên một cách bền vững (Persistence), chúng ta bắt buộc phải sử dụng các cơ chế lưu trữ độc lập với vòng đời của container.

Docker cung cấp 3 cơ chế mount dữ liệu với mục đích sử dụng khác nhau:
| Tiêu chí | Named Volumes (Khuyên dùng Prod) | Bind Mounts (Khuyên dùng Dev) | Tmpfs Mounts (Bộ nhớ RAM) |
|---|---|---|---|
| Vị trí lưu trên Host | Được Docker quản lý riêng tại /var/lib/docker/volumes/ |
Bất kỳ thư mục hoặc file nào trên máy chủ Host (ví dụ /opt/app) |
Bộ nhớ tạm; có thể liên quan swap host |
| Mức độ phụ thuộc OS | Độc lập hoàn toàn với cấu trúc thư mục của máy chủ | Phụ thuộc chặt chẽ vào đường dẫn tuyệt đối của Host | Chỉ hỗ trợ trên hệ điều hành nhân Linux |
| Khả năng chia sẻ | Có thể mount nhiều container; ứng dụng phải xử lý truy cập đồng thời | Dễ chia sẻ nhưng dễ xung đột quyền file giữa Host và Container | Chỉ sử dụng riêng cho một container duy nhất |
| Trường hợp sử dụng | Dữ liệu database, file uploads, lưu trữ lâu dài | Live-reload mã nguồn khi code, mount file cấu hình | Session tạm, token nhạy cảm, cache RAM tạm thời |
Trước đây, cờ -v hoặc --volume thường được sử dụng ngắn gọn nhưng cú pháp dễ gây nhầm lẫn. Docker hiện tại khuyến nghị chuyển sang sử dụng cờ --mount với các cặp key-value rõ ràng:
# 1. Tao mot named volume chuyen dung cho co so du lieu
docker volume create pgdata_prod
# 2. Gan volume vao container bang cu phap --mount chuan
docker run -d \
--name postgres_db \
--restart unless-stopped \
-e POSTGRES_PASSWORD_FILE=/run/secrets/db_password \
--mount type=bind,source=/srv/secrets/db_password,target=/run/secrets/db_password,readonly \
--mount type=volume,source=pgdata_prod,target=/var/lib/postgresql/data \
postgres:16-alpine
# 3. Kiem tra thong tin chi tiet vi tri luu tru tren Host
docker volume inspect pgdata_prod
Trong quá trình lập trình, bạn muốn mỗi khi sửa một dòng code trên máy tính của mình thì ứng dụng bên trong container sẽ tự động reload ngay lập tức mà không cần build lại image:
docker run -d \
--name dev_backend \
-p 3000:3000 \
--mount type=bind,source="$(pwd)",target=/app \
--mount type=bind,source="$(pwd)/config/local.yaml",target=/app/config.yaml,readonly \
--workdir /app node:24-alpine npm run dev
Lưu ý: Bạn có thể thêm cờ readonly để đảm bảo container chỉ được đọc file cấu hình mà không có quyền sửa đổi file trên máy chủ Host.
Đối với các dữ liệu tạm thời yêu cầu tốc độ đọc ghi cực nhanh hoặc các secret nhạy cảm không được phép lưu vết lên ổ đĩa vật lý:
docker run -d \
--name secure_app \
--mount type=tmpfs,target=/tmp,tmpfs-size=536870912,tmpfs-mode=1777 \
my-app:v1
Khi container dừng, tmpfs mount bị gỡ. Tuy nhiên Linux có thể ghi trang nhớ ra swap; tmpfs không cam kết bí mật không bao giờ chạm đĩa. Đánh giá swap, dump, quyền host và mô hình đe dọa.
Tar volume chỉ phù hợp với file đã ở trạng thái nhất quán. Không coi tar thư mục PostgreSQL đang ghi là backup hợp lệ. Database cần logical/physical backup được hỗ trợ, hoặc dừng ghi/dừng dịch vụ đúng quy trình trước khi chụp dữ liệu.
# Dieu kien: ung dung da dung ghi, du lieu nhat quan.
# 1. Sao luu Volume 'pgdata_prod' ra file backup.tar.gz tren thu muc hien tai
docker run --rm \
--mount type=volume,source=pgdata_prod,target=/data,readonly \
-v "$(pwd)":/backup \
alpine tar -czf /backup/pgdata_backup_$(date +%Y%m%d).tar.gz -C /data .
# 2. Phuc hoi du lieu tu file backup vao mot volume moi 'pgdata_restore'
docker volume create pgdata_restore
docker run --rm \
--mount type=volume,source=pgdata_restore,target=/data \
-v "$(pwd)":/backup \
alpine tar -xzf /backup/pgdata_backup_20261023.tar.gz -C /data
Một lỗi cực kỳ phổ biến khi dùng Bind Mounts là file do container sinh ra thuộc quyền sở hữu của root (UID 0), khiến người dùng trên Host không thể mở hoặc xóa file. Cách xử lý:
# Truyen UID va GID cua user hien tai vao container khi khoi chay
docker run -d \
--user "$(id -u):$(id -g)" \
--mount type=bind,source="$(pwd)",target=/app \
my-app:v1
Ví dụ database cần chuẩn bị file secret ngoài Git với quyền phù hợp. PostgreSQL 16 là ví dụ có chủ đích, không phải tuyên bố major mới nhất; đường mount và nâng major theo tài liệu image. Mount read-only không bảo vệ toàn bộ host. Phục hồi thử vào volume mới, xác nhận dữ liệu và quyền trước chuyển ứng dụng.

Đọc đúng tài liệu theo phiên bản. Địa chỉ, tên và đường dẫn trong ví dụ cần thay theo môi trường. Sơ đồ là khái niệm, không phải screenshot hay benchmark.
Lưu cấu hình và digest cũ, kiểm tra backup phục hồi được, xác nhận endpoint và log sau thay đổi. Rollback phải tính đến dữ liệu đã ghi mới; đổi image không tự phục hồi database.

Cài Docker Engine từ kho phù hợp, kiểm tra phiên bản và quyền truy cập; phân biệt lưu trữ containerd mới với overlay2 trên máy nâng cấp.

Tra trạng thái, đọc log, kiểm tra OOM và giới hạn tài nguyên; hiểu tác động của stop, restart và prune trước khi thao tác trên máy production.

Phân biệt tag và digest, save/load với export; chuẩn bị TLS, xác thực và quy trình garbage collection trước khi vận hành private registry.

Sắp xếp layer, chọn exec form, quản lý dependency và đưa bí mật vào build đúng cách; kèm mẫu Node.js để điều chỉnh theo ứng dụng thực tế.