Chuyển đến nội dung chính

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

Cài đặt Docker trên Ubuntu Server

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:

  1. Một máy chủ Ubuntu Server 20.04, 22.04 hoặc 24.04 LTS với quyền truy cập sudo.
  2. Kiến trúc CPU được hỗ trợ: x86_64 (amd64) hoặc aarch64 (arm64).
  3. 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:

bash
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:

bash
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:

bash
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:

bash
# 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:

bash
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:

bash
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:

bash
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:

bash
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:

bash
sudo systemctl enable docker
sudo systemctl enable containerd

Kiểm tra phiên bản vừa cài đặt:

bash
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:

bash
# 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:

bash
newgrp docker

Kiểm tra chạy thử container không cần quyền root:

bash
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:

bash
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:

bash
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ị:

  1. 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:
    yaml
    ports:
      - "127.0.0.1:8080:80"
    
  2. Sử dụng ufw-docker: Cài đặt công cụ hỗ trợ đồng bộ ufw-docker nế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 psLiệt kê các container đang chạy
docker ps -aLiệt kê toàn bộ container (kể cả đã tắt)
docker imagesXem 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/shTruy cập vào shell bên trong container
docker system dfKiểm tra dung lượng ổ đĩa Docker đang chiếm
docker system prune -afDọ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 EngineDocker 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.

💬

Thảo luận & Bình luận

Đă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.