Hướng dẫn cài đặt Docker & Docker compose trên Ubuntu server
Hướng dẫn toàn diện cách cài đặt Docker Engine và Docker Compose V2 trên Ubuntu Server, cấu hình bảo mật non-root user, tối ưu daemon và xử lí xung đột tường lửa UFW

Tự học Docker từ A-Z
Giới thiệu về Docker và Containerization
Docker là nền tảng ảo hóa mức hệ điều hành (Containerization) phổ biến nhất thế giới hiện nay, cho phép các lập trình viên và kỹ sư hệ thống đóng gói toàn bộ ứng dụng cùng các thư viện phụ thuộc (dependencies) vào một đơn vị độc lập gọi là Container.
So với máy ảo truyền thống (Virtual Machines) phải chạy cả một hệ điều hành khách (Guest OS) nặng nề với Hypervisor, container của Docker chia sẻ chung nhân Linux (Kernel) với máy chủ chủ (Host OS). Nhờ vậy, container khởi động chỉ trong vài phần trăm giây, tiêu thụ cực ít tài nguyên CPU/RAM và mang lại tính nhất quán 100% giữa môi trường phát triển (Local Development), kiểm thử (Staging) và vận hành thực tế (Production).
Trong bài viết này, chúng ta sẽ cùng nhau cài đặt phiên bản Docker Engine mới nhất và Docker Compose V2 từ repository chính thức của Docker Inc trên máy chủ Ubuntu Server (hỗ trợ Ubuntu 20.04, 22.04 và 24.04 LTS), đồng thời thiết lập các cấu hình tối ưu hiệu năng và bảo mật tốt nhất.
Chuẩn bị trước khi cài đặt
Trước khi bắt đầu, hãy đảm bảo bạn đã đáp ứng các yêu cầu sau:
- Một máy chủ Ubuntu Server 20.04, 22.04 hoặc 24.04 LTS với quyền truy cập
sudo. - Kiến trúc CPU được hỗ trợ:
x86_64(amd64) hoặcaarch64(arm64). - Kết nối Internet ổn định để tải các gói phần mềm và Docker Images.
Bước 1: Gỡ bỏ các phiên bản Docker cũ (nếu có)
Nếu trước đây máy chủ đã từng cài đặt các gói Docker không chính thức, hãy gỡ bỏ chúng để tránh xung đột xung quanh package manager:
sudo apt-get remove -y docker docker-engine docker.io containerd runc
Sau đó, hãy cập nhật lại danh mục gói phần mềm của hệ thống:
sudo apt-get update && sudo apt-get upgrade -y
Bước 2: Cài đặt các gói phụ thuộc cần thiết
Cài đặt các tiện ích hỗ trợ nạp kho APT thông qua giao thức bảo mật HTTPS:
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
Bước 3: Thiết lập Docker Official GPG Key và APT Repository
Tạo thư mục lưu trữ khóa bảo mật GPG và tải khóa chính thức của Docker về máy:
# Tạo thư mục keyring
sudo install -m 0755 -d /etc/apt/keyrings
# Tải và lưu GPG Key của Docker
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
Tiếp theo, thêm kho lưu trữ APT chính thức của Docker vào danh sách nguồn tải phần mềm:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Cập nhật lại index gói phần mềm để hệ thống nhận diện kho Docker vừa thêm:
sudo apt-get update
Bước 4: Cài đặt Docker Engine và Docker Compose V2
Bây giờ chúng ta sẽ cài đặt toàn bộ gói cốt lõi của Docker:
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Kiểm tra trạng thái dịch vụ Docker sau khi cài đặt:
sudo systemctl status docker --no-pager
Đảm bảo dịch vụ Docker luôn tự khởi động cùng hệ thống khi máy chủ reboot:
sudo systemctl enable docker
sudo systemctl enable containerd
Kiểm tra phiên bản vừa cài đặt:
docker --version
docker compose version
Bước 5: Quản lý Docker không cần quyền Root (Non-root user)
Mặc định, Docker daemon gắn kết với Unix socket thuộc sở hữu của người dùng root. Nếu không muốn gõ sudo trước mỗi lệnh docker, bạn hãy thêm user hiện tại vào nhóm docker:
# Tạo group docker nếu chưa tồn tại
sudo groupadd -f docker
# Thêm user hiện tại vào group docker
sudo usermod -aG docker $USER
Để các thay đổi nhóm có hiệu lực ngay lập tức mà không cần đăng xuất máy chủ, hãy chạy:
newgrp docker
Kiểm tra chạy thử container không cần quyền root:
docker run hello-world
Bước 6: Tối ưu cấu hình Docker Daemon (daemon.json)
Để tối ưu hóa dung lượng ổ đĩa và kiểm soát log container tránh làm tràn ổ cứng, bạn nên cấu hình file /etc/docker/daemon.json:
sudo tee /etc/docker/daemon.json << 'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"live-restore": true
}
EOF
Giải thích các tham số:
log-opts: max-size & max-file: Giới hạn mỗi container chỉ được ghi tối đa 3 file log, mỗi file không quá 10MB. Điều này ngăn chặn việc container ghi log quá nhiều làm sập ổ cứng máy chủ.live-restore: true: Giữ cho các container tiếp tục chạy ngay cả khi Docker daemon bị restart hoặc cập nhật phần mềm.
Khởi động lại Docker daemon để áp dụng cấu hình:
sudo systemctl daemon-reload
sudo systemctl restart docker
Bước 7: Cảnh báo quan trọng về Docker và Tường lửa UFW
Một vấn đề phổ biến trên máy chủ Linux là Docker tự động can thiệp vào bảng định tuyến iptables để mở cổng (NAT), điều này có thể vượt qua các quy tắc của tường lửa UFW.
Ví dụ: Nếu bạn dùng lệnh docker run -p 8080:80 nginx, cổng 8080 sẽ mở công khai ra Internet ngay cả khi bạn chưa hề cho phép cổng 8080 trong UFW (ufw allow 8080).
Giải pháp an toàn khuyến nghị:
- Chỉ bind cổng vào localhost: Khi chạy các ứng dụng đứng sau Nginx Reverse Proxy, chỉ bind cổng vào
127.0.0.1:yamlports: - "127.0.0.1:8080:80" - Sử dụng ufw-docker: Cài đặt công cụ hỗ trợ đồng bộ
ufw-dockernếu muốn quản lý các container thông qua UFW một cách tường minh.
Bước 8: Các lệnh Docker cơ bản cần nhớ
Dưới đây là bảng tổng hợp các lệnh Docker thường dùng trong quản trị hàng ngày:
| Lệnh | Ý nghĩa |
|---|---|
docker ps | Liệt kê các container đang chạy |
docker ps -a | Liệt kê toàn bộ container (kể cả đã tắt) |
docker images | Xem danh sách các image đã tải về máy |
docker logs -f <id> | Xem log thời gian thực của container |
docker exec -it <id> /bin/sh | Truy cập vào shell bên trong container |
docker system df | Kiểm tra dung lượng ổ đĩa Docker đang chiếm |
docker system prune -af | Dọn dẹp toàn bộ container, image thừa không dùng |
Tổng kết
Bạn đã cài đặt thành công Docker Engine và Docker Compose V2 bản chuẩn từ nhà phát triển, đồng thời cấu hình bảo mật non-root user và giới hạn log tự động. Bây giờ bạn đã sẵn sàng để triển khai các ứng dụng web, cơ sở dữ liệu và microservices một cách chuyên nghiệp và linh hoạt.



Đăng nhập bằng tài khoản GitHub để đặt câu hỏi hoặc đóng góp ý kiến cho bài viết.