Cách Cài Đặt Docker Trên Ubuntu: Hướng Dẫn Đầy Đủ Dành Cho Người Mới Bắt Đầu (Phương Pháp Chính Thức)

.## 1. Giới thiệu

Khi thiết lập môi trường phát triển trên Ubuntu, những tình huống bạn nghĩ “tạm thời cài Docker thôi” ngày càng trở nên phổ biến. Các ứng dụng web, xử lý batch, cơ sở dữ liệu thử nghiệm, middleware thử nghiệm… Nếu bạn phải cài đặt chúng thủ công mỗi lần, sẽ tốn rất nhiều thời gian và công sức chỉ để chuẩn bị môi trường.

Đây là lúc công nghệ ảo hoá container Docker trở nên vô cùng hữu ích. Với Docker, bạn có thể quản lý không chỉ ứng dụng mà còn tất cả các thư viện và cấu hình cần thiết dưới dạng một “image”. Khi Docker đã được cài đặt trên Ubuntu, bạn có thể dễ dàng:

  • Khởi chạy một môi trường phát triển mới trong vài phút
  • Đảm bảo mọi thành viên trong nhóm có thể tái tạo hành vi trong cùng một môi trường
  • Tái tạo một môi trường giống như production trên máy cục bộ một cách dễ dàng

Những lợi ích này có thể được tận hưởng với ít nỗ lực.

Ngược lại, đối với những người mới dùng Docker, có rất nhiều điểm khó khăn thường gặp:

  • Không biết quy trình cài đặt nào thực sự đúng
  • Không hiểu sự khác biệt giữa kho lưu trữ mặc định của Ubuntu và kho lưu trữ chính thức của Docker
  • Gặp lỗi quyền do nhầm lẫn khi nào nên dùng sudo

Khi bạn tìm kiếm “ubuntu install docker”, sẽ thấy rất nhiều bài viết liệt kê dãy lệnh dài, nhưng chúng thường không giải thích tại sao các bước đó cần thiết hoặc điều gì đánh dấu một cài đặt hoàn chỉnh.

目次

1-1. Mục tiêu của Bài viết này

Bài viết này hướng tới những độc giả muốn cài Docker trên Ubuntu, và bao gồm các điểm chính sau:

  • Quy trình hiện đang phổ biến để cài Docker trên Ubuntu
  • Một phương pháp cài đặt dễ quản lý hơn bằng kho lưu trữ chính thức
  • Cách chạy lệnh docker mà không cần sudo
  • Kiểm tra sau cài đặt và các lệnh cơ bản thiết yếu
  • Giới thiệu về các công cụ thường dùng như Docker Compose

Thay vì chỉ liệt kê các lệnh, hướng dẫn này giải thích tại sao mỗi bước lại cần thiết, giúp bạn duy trì môi trường dễ dàng hơn trong tương lai.

1-2. Đối tượng và Điều kiện tiên quyết

Bài viết này dành cho những người đọc có các tiêu chí sau:

  • Hiểu các thao tác cơ bản trên Ubuntu (mở terminal, dùng lệnh apt, v.v.)
  • Là nhà phát triển hoặc kỹ sư mới muốn thử Docker lần đầu
  • Đang cân nhắc chuyển các môi trường thử nghiệm hiện có sang container

Kiến thức quản trị Linux nâng cao không bắt buộc. Miễn là bạn thoải mái gõ lệnh trong terminal, hướng dẫn này sẽ đủ cho bạn.

1-3. Cấu trúc Bài viết và Cách Đọc

Bài viết sẽ tiến hành theo thứ tự sau:

  • Kiểm tra các điều kiện tiên quyết
  • Các phương pháp cài đặt (kho lưu trữ chính thức / dựa trên script)
  • Cài đặt quyền và kiểm tra
  • Cài đặt Docker Compose
  • Xử lý sự cố và các bước tiếp theo

Bạn có thể đọc toàn bộ từ đầu đến cuối, hoặc nếu Docker đã được cài sẵn, chỉ cần tập trung vào các phần “Quyền” hoặc “Compose”.

2. Điều kiện tiên quyết và Chuẩn bị

Việc cài Docker bản thân nó khá đơn giản, nhưng tùy vào phiên bản Ubuntu hoặc môi trường hiện có, có một số điểm cần kiểm tra trước. Phần này tóm tắt các điều kiện tiên quyết và chuẩn bị cần thiết để cài đặt diễn ra suôn sẻ.

2-1. Các phiên bản Ubuntu được hỗ trợ

Docker hoạt động trên nhiều phiên bản Ubuntu, nhưng các bản phát hành LTS (Long Term Support) sau đây là được sử dụng phổ biến nhất:

  • Ubuntu 22.04 LTS (Được khuyến nghị)
  • Ubuntu 20.04 LTS
  • Ubuntu 24.04 LTS (Mới nhất)

Các bản LTS cung cấp độ ổn định lâu dài, rất thích hợp để duy trì môi trường phát triển dựa trên Docker.

Các bản không phải LTS (như 23.10) cũng có thể dùng được, nhưng trong môi trường chuyên nghiệp thường ưu tiên các phiên bản LTS.

2-2. Các gói Docker đã được cài sẵn

.Ubuntu’s default repository includes a package called docker.io. However, this is not the official Docker package provided by Docker Inc., and updates tend to lag behind. Therefore, installing Docker from the official repository is strongly recommended.

Ubuntu’s default repository includes a package called docker.io. However, this is not the official Docker package provided by Docker Inc., and updates tend to lag behind. Therefore, installing Docker from the official repository is strongly recommended.

First, check and remove any existing Docker-related packages if necessary:

sudo apt remove docker docker.io containerd runc

If the message indicates that nothing is installed, no action is required.

2-3. Cập nhật APT và Cài đặt Các Gói Yêu cầu

Before adding Docker’s official repository, update APT and install required tools:

sudo apt update
sudo apt install -y ca-certificates curl gnupg

These tools are required to add Docker’s GPG key and repository securely.

2-4. Xác minh Quyền Quản trị (sudo)

Docker installation requires sudo privileges. If your account does not have sudo access, switch to an administrator account or request permission.

You can verify sudo access with the following command:

sudo -v

If you are prompted for a password and the command succeeds, you are ready to proceed.

2-5. Kiểm tra Kết nối Mạng

Installing Docker requires access to external repositories, so an active internet connection is mandatory. In corporate or proxy environments, GPG key retrieval may fail due to access restrictions.

In such cases, consult your network administrator regarding proxy settings or allowlist configurations.

2-6. Chọn Phương pháp Cài đặt

There are three main ways to install Docker:

  1. Cài đặt qua kho lưu trữ Docker chính thức (Được khuyến nghị)
  2. Sử dụng script cài đặt get.docker.com (Nhanh và dễ dàng)
  3. Tải xuống và cài đặt thủ công các gói Docker .deb (Trường hợp đặc biệt)

This article focuses primarily on the official repository method, which is the most common and easiest to maintain.

3. Cài đặt Docker

Now let’s install Docker on Ubuntu. Although multiple installation methods exist, this guide focuses on the official Docker repository method, which is the most reliable and widely used in production environments.

This method allows stable upgrades via apt upgrade, making it ideal for long-term use.

3-1. Thêm Kho lưu trữ Docker Chính thức (Được khuyến nghị)

First, register the official GPG key provided by Docker and add Docker’s repository to APT.
Once this is configured correctly, you can avoid accidentally installing the outdated docker.io package from Ubuntu’s default repository.

3-1-1. Đăng ký Khóa GPG

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
  • /etc/apt/keyrings/ là vị trí lưu trữ khóa được khuyến nghị cho Ubuntu 22.04 trở lên
  • --dearmor chuyển đổi khóa sang định dạng nhị phân

This step allows APT to trust the official Docker repository.

3-1-2. Thêm Kho lưu trữ

Next, add Docker’s repository to APT’s source list.

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  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ác điểm quan trọng:

  • $(. /etc/os-release && echo $VERSION_CODENAME) tự động chèn mã tên mã Ubuntu đúng (ví dụ jammy hoặc focal )
  • Chỉ thêm kho lưu trữ ổn định

3-1-3. Cập nhật Thông tin Kho lưu trữ

After adding the repository, update the APT index.

sudo apt update

At this point, docker-ce (Docker Engine) should appear as an installable package.

3-2. Cài đặt Docker Engine

Now install the main Docker packages.

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Vai trò của các gói:

.

  • docker-ce : Lõi Docker Engine
  • docker-ce-cli : Giao diện dòng lệnh Docker
  • containerd.io : Runtime container cốt lõi được Docker sử dụng
  • docker-buildx-plugin : Các tính năng xây dựng nâng cao như build đa nền tảng
  • docker-compose-plugin : Docker Compose V2 (lệnh docker compose)

Sau khi cài đặt, daemon Docker sẽ tự động khởi động.

3-3. Xác minh việc cài đặt

Kiểm tra trạng thái runtime của Docker bằng lệnh sau:

sudo systemctl status docker

Nếu bạn thấy active (running), Docker đang hoạt động bình thường.

Nhấn q để thoát khỏi chế độ xem trạng thái.

3-4. Tùy chọn: Cài đặt bằng script để tiện lợi

Docker cũng cung cấp một script cài đặt “tất cả trong một”.

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Ưu điểm:

  • Ít lệnh hơn và thiết lập nhanh chóng
  • Thích hợp cho các môi trường đơn giản hoặc tạm thời

Nhược điểm:

  • Khó kiểm soát phiên bản
  • Thường không được khuyến khích cho môi trường production hoặc sử dụng lâu dài

Mặc dù tiện lợi cho người mới bắt đầu, bài viết này ưu tiên tính bảo trì và do đó tập trung vào phương pháp cài đặt từ kho chính thức.

3-5. Lưu ý cho các bản phát hành Ubuntu mới nhất (ví dụ: 24.04)

Ngay sau khi Ubuntu ra bản phát hành lớn, kho chính thức của Docker có thể chưa hỗ trợ đầy đủ phiên bản mới.
Trong những trường hợp này, hãy kiểm tra các mục sau:

  • Vị trí và định dạng khóa GPG có khớp với các yêu cầu hiện hành không
  • VERSION_CODENAME có được Docker hỗ trợ chính thức không
  • Không có lỗi chữ ký nào xuất hiện khi chạy apt update

Nếu hỗ trợ bị trì hoãn, việc tạm thời sử dụng script get.docker.com có thể là một giải pháp tạm thời thực tế.

4. Quyền người dùng và chạy Docker mà không cần sudo

Sau khi cài đặt Docker, bạn có thể muốn bắt đầu sử dụng lệnh docker ngay lập tức. Tuy nhiên, theo mặc định, bạn phải đặt tiền tố sudo cho mọi lệnh.

Hành vi này được thiết kế có chủ đích vì lý do bảo mật, nhưng lại gây bất tiện cho việc phát triển hàng ngày hoặc học tập. Để giải quyết, bạn có thể thêm người dùng của mình vào nhóm docker, cho phép thực thi các lệnh Docker mà không cần sudo.

4-1. Tại sao chạy không cần sudo lại quan trọng

Trên Ubuntu, daemon Docker (dockerd) chạy với quyền root.
Do đó, việc tạo hoặc xóa container bằng lệnh docker thường yêu cầu quyền root.

Nhóm docker được tạo ra để đáp ứng yêu cầu này.

  • Người dùng thuộc nhóm này có thể truy cập trực tiếp daemon Docker
  • Điều này cho phép các lệnh như docker run mà không cần sudo
  • Cấu hình này gần như là bắt buộc cho môi trường phát triển

Lưu ý rằng nhóm docker thực chất cấp các quyền gần như root, vì vậy cần thận trọng khi sử dụng trong môi trường chia sẻ.
(Đối với máy tính cá nhân hoặc WSL2, thường không có vấn đề.)

4-2. Thêm người dùng hiện tại vào nhóm docker

Thêm người dùng đang đăng nhập vào nhóm docker:

sudo usermod -aG docker $USER

Lệnh này sẽ thêm người dùng vào nhóm. Tuỳ chọn -aG có nghĩa là append to group (thêm vào nhóm).

4-3. Áp dụng thay đổi

Thay đổi thành viên nhóm sẽ có hiệu lực sau khi bạn đăng xuất và đăng nhập lại.

Để áp dụng ngay lập tức, bạn cũng có thể chạy:

newgrp docker

Lệnh này sẽ khởi động một phiên shell mới với quyền của nhóm docker đã được áp dụng.

4-4. Xác minh việc chạy không cần sudo

Bây giờ thử Docker mà không dùng sudo:

docker run hello-world

Kết quả thành công:

  • Hello from Docker!
  • Image đã được tải xuống và thông báo được hiển thị

Nếu gặp lỗi, hãy kiểm tra các mục sau:

  • Bạn đã đăng xuất và đăng nhập lại sau khi thay đổi thành viên nhóm chưa?
  • Đường dẫn /usr/bin/docker có đang được sử dụng không?
  • Daemon Docker có đang chạy không (systemctl status docker)?

4-5. Các cân nhắc bảo mật (Quan trọng)

Nhóm docker cung cấp các quyền mạnh mẽ, thực chất tương đương với quyền root.

  • Đọc bất kỳ tệp nào
  • Gắn kết thư mục host vào container
  • Thực hiện các thao tác mạng
  • Kiểm soát hệ thống ở mức socket Docker

.Đây là cách chấp nhận được cho các hệ thống cá nhân, nhưng việc quản lý người dùng là rất quan trọng trên các máy chủ chia sẻ.

Trong những trường hợp như vậy, bạn có thể cân nhắc Docker không có quyền root (rootless Docker), được thảo luận trong các phần sau.

5. Kiểm Tra Khởi Động và Hoạt Động

Sau khi cài đặt Docker và cấu hình quyền, bước tiếp theo là xác minh Docker hoạt động đúng.
Phần này giải thích cách kiểm tra trạng thái dịch vụ Docker và thực sự chạy các container.

5-1. Kiểm Tra Trạng Thái Daemon Docker

Đầu tiên, xác nhận Docker đang chạy đúng trong nền.

sudo systemctl status docker

Các chỉ số trạng thái chính:

  • active (running) → Hoạt động bình thường
  • inactive → Không chạy (phải khởi động thủ công)
  • failed → Lỗi cấu hình hoặc phụ thuộc

Nếu trạng thái là inactive hoặc failed, hãy khởi động Docker bằng lệnh sau:

sudo systemctl start docker

Để đảm bảo Docker tự động khởi động khi hệ điều hành khởi động:

sudo systemctl enable docker

5-2. Xác Minh Hoạt Động Bằng Container hello-world

Cách phổ biến nhất để xác minh việc cài đặt Docker là chạy image hello-world chính thức.

docker run hello-world

Lệnh này thực hiện các hành động sau:

  1. Tải image từ Docker Hub nếu chưa có sẵn trên máy cục bộ
  2. Khởi chạy một container từ image đó
  3. Hiển thị thông báo kiểm tra và thoát

Nếu thành công, bạn sẽ thấy đầu ra tương tự như dưới đây:

Hello from Docker!
This message shows that your installation appears to be working correctly.

Nếu thông báo này xuất hiện, Docker đã được cài đặt và hoạt động đúng.

5-3. Thử Các Lệnh Docker Cơ Bản

Sau khi xác nhận hoạt động cơ bản, hãy thử một số lệnh Docker thường dùng.

5-3-1. Liệt Kê Các Image Docker

docker images

Lệnh này hiển thị danh sách các image đã được tải về cục bộ. Nếu hello-world xuất hiện, mọi thứ đang hoạt động như mong đợi.

5-3-2. Kiểm Tra Các Container Đang Chạy

docker ps

Lệnh này liệt kê các container hiện đang chạy.
(Container hello-world sẽ thoát ngay lập tức và thường không xuất hiện.)

Để hiển thị cả các container đã dừng:

docker ps -a

5-3-3. Chạy Một Ví Dụ Image Chính Thức

Để thử một máy chủ web Nginx đơn giản:

docker run -d -p 8080:80 nginx
  • -d → Chạy ở chế độ nền
  • -p → Ánh xạ cổng 8080 trên máy chủ tới cổng 80 trong container

Mở http://localhost:8080 trong trình duyệt để xem trang Nginx mặc định.

5-4. Dừng và Xóa Các Container

Bạn có thể dừng một container đang chạy bằng lệnh sau:

docker stop <container-id>

Để xóa một container:

docker rm <container-id>

Để xóa các image không còn dùng tới:

docker rmi <image-id>

Hãy nhớ rằng các phụ thuộc tuân theo thứ tự container → image → volume, vì vậy hãy xóa chúng một cách cẩn thận.

5-5. Nguyên Nhân Thường Gặp Khi Gặp Lỗi

● Lỗi Quyền

Got permission denied while trying to connect to the Docker daemon socket
→ Người dùng chưa được thêm vào nhóm docker

● Daemon Docker Không Chạy

Cannot connect to the Docker daemon at unix:///var/run/docker.sock
→ Khởi động Docker bằng systemctl start docker

● Vấn Đề Mạng Ngăn Cản Việc Tải Image

→ Kiểm tra cài đặt proxy, cấu hình DNS, hoặc các hạn chế mạng

● Gói docker.io Cũ Vẫn Được Cài Đặt

→ Gỡ bỏ hoàn toàn và cài lại Docker từ kho chính thức

6. Cài Đặt và Sử Dụng Docker Compose

Một công cụ thiết yếu để làm việc với Docker ở quy mô lớn là Docker Compose.
Các ứng dụng web hiện đại thường bao gồm nhiều thành phần như cơ sở dữ liệu, bộ nhớ đệm, worker và máy chủ web. Việc quản lý chúng riêng lẻ bằng các lệnh docker run nhanh chóng trở nên không thực tế.

Docker Compose cho phép bạn định nghĩa nhiều cấu hình container trong một file duy nhất và quản lý chúng cùng nhau, khiến nó trở thành một trong những công cụ được sử dụng rộng rãi nhất trong phát triển thực tế.

markdown.### 6-1. Xác minh việc cài đặt Docker Compose V2

Khi cài đặt Docker từ kho chính thức, Docker Compose được cài đặt tự động dưới dạng plugin.

Xác minh việc cài đặt bằng lệnh sau:

docker compose version

Nếu cài đặt thành công, bạn sẽ thấy đầu ra tương tự như:

Docker Compose version v2.x.x

Nếu bạn gặp lỗi như docker: 'compose' is not a docker command, hãy cài đặt plugin thủ công:

sudo apt install docker-compose-plugin

6-2. Lợi ích của Docker Compose

Các ưu điểm chính của Docker Compose bao gồm:

  • Quản lý thống nhất nhiều container (khởi động, dừng, khởi động lại)
  • Cấu hình dưới dạng mã , đảm bảo môi trường có thể tái tạo
  • Dễ dàng chia sẻ các thiết lập ứng dụng, API và cơ sở dữ liệu
  • Khởi chạy môi trường phát triển chỉ với một lệnh docker compose up

Điều này khiến Docker Compose gần như không thể thiếu cho việc phát triển ứng dụng.

6-3. Cấu trúc cơ bản của tệp cấu hình Compose

Docker Compose sử dụng tệp có tên docker-compose.yml (hoặc compose.yaml) để định nghĩa các service.
Lấy một ví dụ tối thiểu, tạo một cấu hình đơn giản để khởi chạy Nginx.

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

Chạy lệnh sau trong thư mục chứa tệp:

docker compose up -d

Nginx sẽ khởi động ở chế độ nền. Truy cập http://localhost:8080 trong trình duyệt để xác nhận.

6-4. Ví dụ: Cấu hình đa container (Web + Database)

Sức mạnh thực sự của Compose được thể hiện khi quản lý nhiều container đồng thời.
Ví dụ, chạy một ứng dụng web cùng với MySQL có thể được cấu hình như sau:

services:
  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

Giải thích:

  • depends_on đảm bảo cơ sở dữ liệu khởi động trước ứng dụng
  • volumes lưu trữ dữ liệu của cơ sở dữ liệu
  • Nhiều service được quản lý trong một tệp YAML duy nhất

Đây là một mẫu rất thực tiễn cho môi trường phát triển.

6-5. Các lệnh Docker Compose thường dùng

Các lệnh này hữu ích để ghi nhớ:

CommandDescription
docker compose up -dStart containers in the background
docker compose downStop and remove containers and networks
docker compose buildBuild images using Dockerfile
docker compose psList containers managed by Compose
docker compose logs -fView logs (optionally per service)

Sử dụng Compose cho phép bạn tái tạo các môi trường giống hệt nhau nhiều lần, rất phù hợp cho phát triển nhóm.

6-6. Các trường hợp sử dụng đề xuất cho Compose trong phát triển

  • Thiết lập môi trường cục bộ chỉ bằng một lệnh
  • Kiểm thử trong môi trường gần với môi trường production
  • Khởi chạy các dịch vụ kết hợp như cơ sở dữ liệu, cache và hàng đợi tin nhắn
  • Lưu trữ dữ liệu bằng volumes
  • Quản lý cấu hình bằng các biến môi trường .env
  • Hỗ trợ kiến trúc microservice phức tạp

Khi bạn đã quen với Docker và Compose, thời gian thiết lập môi trường giảm đáng kể,
độ hiệu quả phát triển được cải thiện mạnh mẽ.

7. Các cân nhắc về bảo mật và vận hành

Docker là một công cụ cực kỳ mạnh mẽ và tiện lợi, nhưng “được container hoá” không đồng nghĩa tự động với “bảo mật”.
Khi sử dụng Docker thường xuyên trên Ubuntu, có một số điểm quan trọng về bảo mật và vận hành mà bạn cần nắm rõ.

Phần này sắp xếp các kiến thức thiết yếu để vận hành Docker một cách an toàn và ổn định, ngay cả với người mới bắt đầu.

7-1. Nhóm docker có quyền “gần như root”

Nhóm docker được cấu hình ở trên thực tế cấp quyền rất mạnh.
Người dùng thuộc nhóm docker có thể vận hành hệ điều hành chủ thông qua socket Docker, điều này tương đương với quyền root.

● Các điểm cần lưu ý

  • Không thêm người dùng tùy ý vào nhóm docker trên các máy chủ chia sẻ
  • Hiểu rõ các hệ quả, không chỉ vì tiện lợi “không cần sudo”
  • Trong các tổ chức có chính sách bảo mật nghiêm ngặt, có thể cần sự chấp thuận của quản trị viên

answer.Đây hiếm khi là vấn đề trên các máy Ubuntu cá nhân hoặc máy tính phát triển, nhưng cần có sự đánh giá cẩn thận trên các máy chủ sản xuất.

7-2. Xem xét Docker không có quyền root (Tùy chọn nâng cao)

Docker cung cấp một tính năng gọi là chế độ không có quyền root,
cho phép daemon Docker chạy dưới tài khoản người dùng thường thay vì root.

Ưu điểm:

  • Giảm đáng kể rủi ro đặc quyền của hệ điều hành máy chủ
  • Cho phép sử dụng Docker an toàn hơn trong các môi trường có yêu cầu bảo mật nghiêm ngặt

Nhược điểm:

  • Một số tính năng mạng bị hạn chế
  • Cấu hình phức tạp hơn đối với người mới bắt đầu
  • Hành vi có thể khác so với Docker tiêu chuẩn

Chế độ không có quyền root không cần thiết cho hầu hết các trường hợp phát triển,
nhưng có thể là một lựa chọn khả thi trong các môi trường doanh nghiệp hoặc tập trung vào tuân thủ.

7-3. Dọn dẹp các Image và Container không sử dụng

Theo thời gian, Docker có thể tiêu tốn một lượng lớn không gian đĩa mà bạn không nhận ra.
Các container, image và volume không sử dụng có thể tích tụ và dễ dàng vượt quá 100 GB.

● Các lệnh để xóa các tài nguyên không sử dụng

Xóa các image không dùng

docker image prune

Xóa container và mạng cùng lúc

docker system prune

Dọn dẹp mạnh mẽ (cẩn thận khi sử dụng)

docker system prune -a

Tùy chọn -a sẽ xóa tất cả các image không dùng, vì vậy hãy sử dụng nó một cách thận trọng.

7-4. Tránh sử dụng thẻ “latest” trong môi trường sản xuất

Mặc dù các thẻ như nginx:latest tiện lợi trong quá trình phát triển, chúng không được khuyến nghị cho môi trường sản xuất.

Lý do:

  • Phiên bản chính xác phía sau latest không được đảm bảo
  • Các bản cập nhật bất ngờ có thể gây lỗi thời gian chạy
  • Mất khả năng tái tạo dẫn đến triển khai không ổn định

Cách tiếp cận được đề xuất: Ghim phiên bản một cách rõ ràng

Ví dụ:

image: nginx:1.25

Ghim phiên bản một cách rõ ràng là quy tắc cơ bản cho các môi trường sản xuất.

7-5. Sử dụng Image gốc chính thức trong Dockerfile

Khi tạo Dockerfile, hãy tuân theo các hướng dẫn sau:

  • Ưu tiên các image chính thức (image thư viện)
  • Tránh các image do các tác giả không xác định hoặc không đáng tin cậy duy trì
  • Khi sử dụng các image hệ điều hành nhẹ như Alpine, kiểm tra trạng thái hỗ trợ lỗ hổng bảo mật

Các image không đáng tin cậy có thể chứa phần mềm độc hại.
Ngay cả trong môi trường phát triển, cũng nên tránh chúng càng nhiều càng tốt.

7-6. Cẩn thận với việc phơi bày mạng và cổng

Khi các container mở cổng trên hệ điều hành máy chủ,
chúng có thể trở nên truy cập được từ bên ngoài hệ thống.

Biện pháp phòng ngừa:

  • Tránh các ánh xạ -p 80:80 không cần thiết
  • Đối với sử dụng cục bộ, chỉ ràng buộc vào localhost, ví dụ -p 127.0.0.1:8080:80
  • Kết hợp với cài đặt tường lửa như UFW
  • Đối với môi trường sản xuất, sử dụng reverse proxy (như Nginx) để tăng cường bảo mật

Quản lý cổng đặc biệt quan trọng trên các máy chủ VPS hoặc máy chủ Ubuntu dựa trên đám mây.

7-7. Quản lý log khi xảy ra lỗi

Log của Docker có thể xem bằng lệnh sau:

docker logs <container-name>

Khối lượng log lớn có thể nhanh chóng tiêu tốn không gian đĩa,
vì vậy hãy cân nhắc cấu hình driver logxoay vòng log.

8. Các vấn đề thường gặp và khắc phục

Mặc dù Docker là một công cụ mạnh mẽ, các lỗi không mong muốn vẫn có thể xảy ra trên Ubuntu do sự khác biệt môi trường hoặc cấu hình sai.
Phần này tóm tắt các vấn đề phổ biến và giải pháp của chúng, từ cấp độ người mới đến trung cấp.

8-1. Không thể kết nối tới Docker Daemon

● Thông báo lỗi

Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

● Nguyên nhân và giải pháp

  1. Docker daemon chưa chạy : sudo systemctl start docker
  2. Thay đổi nhóm docker chưa được áp dụng : Đăng xuất và đăng nhập lại, hoặc chạy newgrp docker
  3. Vấn đề quyền với /var/run/docker.sock : Đảm bảo người dùng thuộc nhóm docker

8-2. Lỗi Permission Denied

● Lỗi điển hình

Got permission denied while trying to connect to the Docker daemon socket

● Giải pháp

Nguyên nhân hầu như luôn là thiếu cấu hình nhóm docker.

sudo usermod -aG docker $USER

Sau đó đăng xuất và đăng nhập lại.

8-3. Lỗi GPG Khi Thêm Kho APT

● Ví dụ lỗi

NO_PUBKEY XXXXXXXX

hoặc

The following signatures couldn't be verified

● Nguyên nhân và cách khắc phục

  • Khóa GPG chưa được đăng ký đúng cách
  • curl thất bại do hạn chế mạng

Đăng ký lại khóa bằng cách:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
 | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Sau đó chạy lại sudo apt update.

8-4. Xung Đột Gán Cổng

● Ví dụ lỗi

Bind for 0.0.0.0:80 failed: port is already allocated.

● Nguyên nhân

  • Cổng đã được một tiến trình khác trên máy chủ sử dụng
  • Một container Docker khác đang dùng cùng cổng

● Giải pháp

Kiểm tra tiến trình đang sử dụng cổng:

sudo lsof -i -P -n | grep :80

Kiểm tra các container đang chạy:

docker ps

Thay đổi ánh xạ cổng:

-p 8080:80

8-5. Lỗi Tải Ảnh

● Nguyên nhân phổ biến

  • Hạn chế mạng (môi trường doanh nghiệp)
  • Vấn đề cấu hình DNS
  • Truy cập Docker Hub bị chặn

● Giải pháp

  • Thay đổi máy chủ DNS (ví dụ: 1.1.1.1 hoặc 8.8.8.8)
  • Kiểm tra cấu hình proxy
  • Sử dụng VPN nếu môi trường yêu cầu

8-6. Lỗi Hết Dung Lượng Ổ Đĩa

● Thông báo điển hình

no space left on device

● Khắc phục

Xóa các tài nguyên không sử dụng:

docker system prune -a

Xem lại các image, container và volume:

docker images
docker ps -a
docker volume ls

Hết dung lượng ổ đĩa là một trong những vấn đề vận hành Docker phổ biến nhất.

侍エンジニア塾