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

Cài đặt Docker trên Debian: Hướng dẫn cài đặt đầy đủ

Hướng dẫn này bao quát bốn cách cài đặt, từ kho chính thức của Docker đến cài gói thủ công, cùng cấu hình hậu cài đặt thiết yếu cho triển khai doanh nghiệp. Bạn sẽ học cách bảo mật môi trường Docker, khắc phục sự cố thường gặp và duy trì thiết lập sẵn sàng cho sản xuất.
· 15 phút đọc

Khám phá cùng AI

Cài đặt Docker trên Debian không nên là trò đoán xem phương pháp nào sẽ không làm hỏng hệ thống của bạn.

Hầu hết các hướng dẫn đưa ra hàng loạt lựa chọn cài đặt mà không giải thích khi nào nên dùng mỗi cách. Bạn dễ nhận về các gói lỗi thời từ kho Debian, hoặc tệ hơn là lỗi quyền hạn khiến bạn bị chặn khỏi chính các container của mình. Kết quả? Bạn mất hàng giờ để khắc phục sự cố thay vì triển khai ứng dụng.

Chu kỳ phát hành dự đoán được và độ ổn định vững chắc của Debian khiến nó hoàn hảo cho triển khai Docker trong sản xuất. Bạn có hiệu năng container ổn định mà không lo các bản cập nhật hệ thống bất ngờ phá vỡ thiết lập. Về lý thuyết, bạn sẽ không gặp vấn đề sau phần khó khăn nhất: cài đặt.

Trong hướng dẫn này, tôi sẽ dẫn bạn qua bốn phương pháp cài đặt, các bước tăng cường bảo mật thiết yếu, cấu hình lưu trữ và cách khắc phục sự cố để chạy Docker ổn định trên Debian.

Mới hoàn toàn với Docker? Bắt đầu với kiến thức nền tảng về Docker trước khi thực hiện các bước cài đặt.

Yêu cầu hệ thống

Docker chạy trên hầu hết các hệ thống Debian hiện đại, nhưng bạn cần kiểm tra vài điều trước. Phần này sẽ nêu chính xác những yêu cầu hệ thống cần có trước khi bắt đầu cài đặt.

Debian 10 (Buster) hoặc mới hơn là yêu cầu đối với các phiên bản Docker hiện tại. Các bản phát hành cũ như Debian 9 sẽ không hoạt động với các bản dựng Docker Engine gần đây. Phiên bản kernel của bạn nên từ 3.10 trở lên - hầu hết các cài đặt Debian vài năm gần đây đều đáp ứng tự động.

Bạn cần quyền root hoặc sudo để cài đặt các gói Docker và cấu hình hệ thống. Docker cũng yêu cầu các gói lõi sau: apt-transport-https, ca-certificates, curl và gnupg. Phần lớn hệ thống Debian đã có sẵn, nhưng bạn sẽ xác minh điều này sau.

Yêu cầu phần cứng tối thiểu:

  • 2GB RAM để xử lý khối lượng công việc container cơ bản, dù 4GB trở lên sẽ tốt hơn cho môi trường phát triển
  • Ít nhất 10GB trống trên đĩa cho image Docker và dữ liệu container. Môi trường sản xuất nên dự trù nhiều hơn.

Nếu bạn dùng môi trường desktop GNOME, hãy đảm bảo đã cài gói gnome-terminal. Một số công cụ quản lý Docker cần nó cho các phiên làm việc tương tác trong container.

Gỡ bỏ mọi cài đặt Docker cũ trước khi bắt đầu. Các gói cũ như docker, docker.io hoặc docker-engine có thể xung đột với Docker Engine hiện tại. Chạy lệnh này để dọn dẹp phiên bản cũ:

sudo apt remove docker docker-engine docker.io containerd runc

Cấu hình tường lửa và mạng của bạn có thể ảnh hưởng đến networking của container. Docker tạo các giao diện mạng và quy tắc iptables riêng. Nếu bạn dùng UFW hoặc quy tắc tường lửa tùy chỉnh, có thể cần điều chỉnh sau khi cài đặt để cho phép lưu lượng của container.

Hãy kiểm tra các yêu cầu này ngay bây giờ - điều đó sẽ giúp bạn tiết kiệm thời gian khắc phục sự cố về sau.

Các phương pháp cài đặt

Bạn có bốn cách để cài đặt Docker trên Debian, mỗi cách có ưu nhược điểm khác nhau. Tôi sẽ giúp bạn chọn phương pháp phù hợp với môi trường và yêu cầu bảo mật của bạn.

Bạn đang tìm hướng dẫn cài đặt trên Ubuntu? Chúng tôi có hướng dẫn từng bước đầy đủ về cài đặt Docker trên Ubuntu.

Phương pháp 1: Kho chính thức của Docker (khuyến nghị)

Cách này giúp bạn có phiên bản Docker mới nhất với các bản cập nhật bảo mật thường xuyên.

Kho chính thức của Docker luôn có các bản phát hành ổn định mới nhất, đồng thời bạn nhận được cập nhật tự động qua trình quản lý gói. Bạn sẽ không bị kẹt với các phiên bản lỗi thời bỏ lỡ bản vá bảo mật quan trọng hoặc tính năng mới.

Bắt đầu bằng cách cập nhật hệ thống và cài các gói Docker cần:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

Sau đó, thêm khóa GPG chính thức của Docker để xác minh tính xác thực gói:

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Cấu hình kho bằng cách thêm vào danh sách nguồn:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Cuối cùng, cài Docker Engine, CLI và Compose:

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

Cách này cung cấp mọi thứ bạn cần cho triển khai Docker trong sản xuất.

Phương pháp 2: Kho mặc định của Debian

Cách này cài Docker chỉ với một lệnh, nhưng bạn sẽ nhận phiên bản cũ hơn.

Kho mặc định của Debian giúp cài đặt đơn giản - chỉ cần chạy sudo apt install docker.io. Nhưng có một lưu ý: bạn thường sẽ nhận các phiên bản Docker đã tụt hậu vài tháng hoặc vài năm so với bản hiện hành.

sudo apt update
sudo apt install docker.io

Phương pháp này ổn cho thử nghiệm cơ bản hoặc khi bạn cần phiên bản cũ cụ thể để tương thích. Nhưng bạn sẽ bỏ lỡ cập nhật bảo mật, cải thiện hiệu năng và tính năng mới của các bản phát hành gần đây.

Chỉ dùng cách này khi kho chính thức không khả dụng.

Phương pháp 3: Cài đặt thủ công gói DEB

Tôi sẽ chỉ bạn cách tải và cài đặt gói trực tiếp khi bạn không thể truy cập các kho.

Cách này phù hợp cho hệ thống cô lập mạng, mạng doanh nghiệp bị hạn chế truy cập internet, hoặc khi bạn cần cài cùng một phiên bản Docker trên nhiều máy mà không tải lại nhiều lần.

Tải các gói DEB từ trang web của Docker:

  1. Truy cập https://download.docker.com/linux/debian/dists/

  2. Chọn phiên bản Debian của bạn (bullseye, bookworm, v.v.)

  3. Đi tới pool/stable/amd64/

  4. Tải các gói: docker-ce_*.deb, docker-ce-cli_*.deb và containerd.io_*.deb

Cài đặt các gói theo thứ tự:

sudo dpkg -i containerd.io_*.deb
sudo dpkg -i docker-ce-cli_*.deb
sudo dpkg -i docker-ce_*.deb

Nếu gặp lỗi phụ thuộc, chạy sudo apt-get install -f để sửa.

Cách này đòi hỏi làm thủ công nhiều hơn khi cập nhật, nhưng giúp bạn kiểm soát hoàn toàn phiên bản được cài.

Phương pháp 4: Script tiện lợi

Cách cuối cùng tôi đề cập mang lại cài đặt nhanh cho môi trường thử nghiệm, nhưng bạn nên rà soát script trước.

Docker cung cấp các script cài đặt tự nhận diện hệ thống và cài Docker tự động. Chúng hữu ích để dựng nhanh môi trường thử nghiệm hoặc khi bạn thiết lập Docker trên nhiều hệ thống.

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

Luôn xem nội dung script trước khi chạy:

cat get-docker.sh

Hãy tìm bất cứ điều gì đáng ngờ hoặc bất thường. Script sẽ sửa đổi cấu hình hệ thống, nên bạn cần biết nó làm gì.

Chạy script sau khi bạn đã rà soát:

sudo sh get-docker.sh

Không dùng script tiện lợi trong môi trường sản xuất. Chúng được thiết kế để thiết lập nhanh, không dành cho triển khai an toàn, có thể tái lập. Hãy gắn bó với phương pháp kho chính thức cho các hệ thống quan trọng.

Tôi khuyên dùng phương pháp kho chính thức trừ khi bạn có ràng buộc cụ thể đòi hỏi cách tiếp cận khác.

Xác minh cài đặt

Cài đặt chỉ là bước đầu - bạn cần xác nhận Docker thực sự hoạt động trước khi triển khai bất cứ thứ gì. Những kiểm tra nhanh sau sẽ cho biết thiết lập Docker của bạn đã sẵn sàng cho khối lượng công việc thực tế hay chưa.

Kiểm tra phiên bản Docker để xác nhận cài đặt đã hoàn tất:

docker --version

Bạn sẽ thấy đầu ra dạng Docker version xx.x.x, build x. Nếu gặp lỗi "command not found", Docker chưa cài đúng cách hoặc chưa có trong PATH của bạn.

Lấy thông tin build chi tiết để xem các thành phần đang chạy:

docker version

Lệnh này hiển thị riêng phiên bản client và server, cùng chi tiết kiến trúc. Phần server xác nhận daemon Docker đang chạy và có thể truy cập.

Chạy một container thử nghiệm để xác thực mọi thứ hoạt động từ đầu đến cuối:

docker run hello-world

Docker sẽ tải image hello-world và chạy nó. Bạn sẽ thấy thông điệp giải thích cách Docker container hoạt động nếu mọi thứ ổn. Bài kiểm tra này xác nhận Docker có thể kéo image, tạo container và thực thi lệnh.

Bạn có thể xác minh Docker Compose đã được cài và đang hoạt động:

docker compose version

Bạn sẽ thấy đầu ra như Docker Compose version vX.xx.x. Lưu ý các bản cài Docker mới dùng docker compose (có khoảng trắng) thay cho lệnh cũ docker-compose.

Nếu tất cả lệnh trên chạy không lỗi, cài đặt Docker của bạn đã sẵn sàng cho sản xuất.

Sẵn sàng chạy container thực thụ? Tìm hiểu cách chạy Docker image từng bước.

Cấu hình sau cài đặt

Docker có thể dùng ngay, nhưng bạn sẽ muốn cấu hình vài thứ cho sử dụng hằng ngày. Phần này đề cập quản lý dịch vụ và quyền người dùng để Docker thuận tiện và an toàn hơn.

Quản lý dịch vụ

Bạn có thể kiểm soát khi nào Docker chạy bằng các lệnh systemd sau:

sudo systemctl start docker    # Start Docker
sudo systemctl stop docker     # Stop Docker
sudo systemctl restart docker  # Restart Docker service

Để bật Docker khởi động cùng hệ thống khi máy khởi động, chạy lệnh sau:

sudo systemctl enable docker

Điều này đảm bảo Docker chạy mỗi khi bạn khởi động lại máy chủ, điều bạn muốn cho hệ thống sản xuất.

Nếu cần kiểm tra Docker có đang chạy và xem trạng thái hiện tại, chạy lệnh này:

sudo systemctl status docker

Bạn sẽ thấy dịch vụ đang hoạt động hay không, đã chạy bao lâu và các thông điệp log gần đây. Nếu Docker gặp vấn đề, lệnh này thường cho bạn biết lý do.

Để khắc phục sự cố dịch vụ, kiểm tra log:

sudo journalctl -u docker.service

Lệnh này hiển thị log chi tiết của Docker daemon, hữu ích để chẩn đoán lỗi khởi động, lỗi quyền hạn hoặc vấn đề cấu hình.

Truy cập không cần quyền root

Nếu bạn cần thêm người dùng của mình vào nhóm docker để chạy lệnh Docker mà không cần sudo:

sudo usermod -aG docker $USER

Lệnh này thêm người dùng hiện tại vào nhóm docker, cấp quyền giao tiếp với Docker daemon.

Sau đó, bạn cần đăng xuất và đăng nhập lại để thay đổi nhóm có hiệu lực:

logout

Hoặc khởi động lại phiên terminal. Bạn cũng có thể chạy newgrp docker để kích hoạt nhóm trong phiên hiện tại mà không cần đăng xuất.

Cuối cùng, để kiểm tra truy cập không cần root, chạy lệnh Docker này:

docker run hello-world

Nếu lệnh chạy được mà không cần sudo, bạn đã sẵn sàng.

Nhưng có đánh đổi về bảo mật: Người trong nhóm docker có quyền tương đương root trên hệ thống. Họ có thể mount thư mục host, truy cập tệp nhạy cảm, và tiềm ẩn khả năng thoát khỏi container để xâm phạm host.

Chỉ thêm người dùng đáng tin vào nhóm docker, và không bao giờ làm vậy trên hệ thống chia sẻ nơi bạn không kiểm soát tất cả người dùng.

Cấu hình các thiết lập này một lần sẽ giúp Docker dễ làm việc hơn nhiều mỗi ngày.

Cấu hình trình điều khiển lưu trữ

Trình điều khiển lưu trữ của Docker quản lý cách lưu trữ image và dữ liệu container trên hệ thống. Phần lớn người dùng không cần thay đổi, nhưng hiểu các lựa chọn giúp tối ưu hiệu năng cho khối lượng công việc cụ thể.

Docker tự động chọn trình điều khiển lưu trữ tốt nhất cho hệ thống của bạn trong quá trình cài đặt. Trên Debian, thường là overlay2, mang lại hiệu năng và ổn định xuất sắc cho hầu hết trường hợp.

Kiểm tra trình điều khiển hiện tại bằng lệnh sau:

docker info | grep "Storage Driver"

Trình điều khiển overlay2 hoạt động tốt vì:

  • Xử lý thao tác copy-on-write nhanh khi container sửa đổi tệp
  • Chia sẻ layer giữa các image để tiết kiệm dung lượng đĩa
  • Hỗ trợ đầy đủ các tính năng Docker mà không gặp vấn đề tương thích
  • Hoạt động ổn định trên nhiều loại filesystem khác nhau

Bạn có thể cần trình điều khiển khác nếu chạy khối lượng công việc chuyên biệt hoặc có yêu cầu filesystem cụ thể. 

Ví dụ, một số hệ thống lưu trữ doanh nghiệp hoạt động tốt hơn với trình điều khiển devicemapper, hoặc bạn có thể cần vfs để gỡ lỗi vấn đề filesystem trong container.

Bạn có thể đổi trình điều khiển lưu trữ bằng cách chỉnh cấu hình daemon của Docker:

sudo nano /etc/docker/daemon.json

Tại đây, thêm hoặc sửa thiết lập storage-driver:

{
  "storage-driver": "devicemapper"
}

Cuối cùng, nhớ khởi động lại Docker để áp dụng thay đổi:

sudo systemctl restart docker

Hãy lưu ý rằng đổi trình điều khiển lưu trữ sẽ khiến các container và image hiện có không thể truy cập. Sao lưu dữ liệu quan trọng trước, hoặc export các container bạn muốn giữ lại.

Giờ bạn có thể thử driver mới bằng cách kéo một image và chạy container:

docker pull hello-world
docker run hello-world

Tóm lại, hãy gắn với overlay2 trừ khi bạn có yêu cầu cụ thể buộc dùng driver khác.

Tăng cường bảo mật

Cài đặt Docker mặc định phù hợp cho phát triển, nhưng môi trường sản xuất cần thêm các lớp bảo mật. Các cấu hình này bảo vệ hệ thống host khỏi tấn công thoát container và tấn công cạn kiệt tài nguyên.

Tích hợp SELinux/AppArmor

Cơ chế kiểm soát truy cập bắt buộc bổ sung một lớp bảo vệ, giới hạn những gì container có thể làm, ngay cả khi chúng bị xâm phạm. Không có các cơ chế này, một container chạy quyền root có thể truy cập tài nguyên host mà đáng lẽ không được phép.

Bạn có thể bật AppArmor cho Docker, đây là khung bảo mật mặc định trên Debian, bằng cách chạy các lệnh sau:

sudo apt install apparmor-utils
sudo systemctl enable apparmor
sudo systemctl start apparmor

Khi AppArmor đang chạy, nạp profile bảo mật của Docker:

sudo apparmor_parser -r /etc/apparmor.d/docker

Giờ bạn có thể chạy container với AppArmor được bật:

docker run --security-opt apparmor=docker-default nginx

Profile docker-default hạn chế các khả năng như mount filesystem, truy cập giao diện mạng thô, và nạp module kernel.

Đối với hệ thống SELinux (nếu bạn dùng thay cho AppArmor), trước tiên hãy bật quản lý container:

sudo setsebool -P container_manage_cgroup on

Sau đó chạy container với nhãn SELinux:

docker run --security-opt label=type:container_t nginx

Các kiểm soát này chặn nhiều kỹ thuật thoát container phổ biến và hạn chế thiệt hại khi container bị xâm phạm.

Cấu hình daemon

Bạn có thể (và nên) tùy chỉnh thiết lập daemon của Docker để giảm bề mặt tấn công và cải thiện tư thế bảo mật. Tạo hoặc chỉnh tệp /etc/docker/daemon.json:

{
  "live-restore": true,
  "userland-proxy": false,
  "no-new-privileges": true,
  "icc": false,
  "disable-legacy-registry": true
}

Ý nghĩa của từng thiết lập:

  • live-restore: true giữ container tiếp tục chạy nếu Docker daemon gặp sự cố

  • userland-proxy: false dùng trực tiếp iptables thay vì userland proxy để có hiệu năng tốt hơn

  • no-new-privileges: true ngăn container đạt được đặc quyền mới

  • icc: false tắt giao tiếp giữa các container theo mặc định disable-legacy-registry: true chặn truy cập giao thức registry cũ, không an toàn

Sau khi thay đổi, khởi động lại Docker để áp dụng:

sudo systemctl restart docker

Bạn cũng nên chạy container với người dùng không phải root bất cứ khi nào có thể:

docker run --user 1000:1000 nginx

Điều này giới hạn những gì container bị xâm phạm có thể làm trên hệ thống.

Giới hạn tài nguyên với control groups (cgroups)

Container không có giới hạn tài nguyên có thể dùng hết CPU, bộ nhớ và I/O, cuối cùng làm sập cả host. Control groups (cgroups) ngăn điều đó bằng cách áp hạn mức cứng lên việc sử dụng tài nguyên.

Bắt đầu với giới hạn bộ nhớ để ngăn container dùng quá nhiều RAM:

docker run --memory=512m nginx

Bạn cũng có thể giới hạn CPU để ngăn một container chiếm dụng quá nhiều năng lực xử lý:

docker run --cpus=1.5 nginx

Với hệ thống có I/O đĩa cao, hãy kiểm soát tốc độ đọc/ghi:

docker run --device-read-bps /dev/sda:1mb nginx

Bạn cũng có thể kết hợp nhiều giới hạn để kiểm soát tài nguyên toàn diện:

docker run \
  --memory=1g \
  --cpus=2 \
  --pids-limit=100 \
  nginx

Để áp giới hạn nhất quán cho mọi container, cấu hình mặc định trong daemon.json:

{
  "default-ulimits": {
    "nofile": {
      "Hard": 64000,
      "Name": "nofile",
      "Soft": 64000
    }
  }
}

Các giới hạn này ngăn tấn công cạn kiệt tài nguyên và đảm bảo chia sẻ tài nguyên công bằng giữa các container.

Cấu hình các biện pháp bảo mật này một lần và môi trường Docker của bạn sẽ khó bị xâm phạm hơn rất nhiều.

Cần nắm vững các lệnh Docker để quản lý hằng ngày? 18 lệnh Docker thiết yếu này sẽ giúp bạn làm việc hiệu quả.

Khắc phục sự cố thường gặp

Ngay cả khi cài đặt đúng, Docker vẫn có thể gặp trục trặc khiến container không chạy đúng. Dưới đây là các vấn đề phổ biến nhất và cách khắc phục nhanh.

Lỗi quyền hạn

Phần lớn lỗi quyền hạn của Docker là do người dùng của bạn không có quyền truy cập đúng tới tệp socket của Docker. Khi bạn thấy Got permission denied while trying to connect to the Docker daemon socket, nghĩa là bạn chưa thuộc nhóm docker.

Điều này xảy ra vì Docker chạy với quyền root, nhưng tạo một socket mà thành viên nhóm docker có thể truy cập. Thêm bạn vào nhóm:

sudo usermod -aG docker $USER

Bạn cần đăng xuất và đăng nhập lại để thay đổi có hiệu lực. Nếu không muốn đăng xuất ngay, bạn có thể kích hoạt nhóm trong phiên hiện tại:

newgrp docker

Lỗi quyền tệp bên trong container cũng phổ biến tương tự. Chúng xảy ra khi tiến trình trong container không thể đọc/ghi các tệp bạn mount từ hệ thống host. Container có thể đang chạy với UID khác với UID sở hữu tệp của bạn.

Kiểm tra người sở hữu tệp của bạn:

ls -la /path/to/your/files

Phần lớn container Docker chạy với UID 1000 theo mặc định. Nếu tệp của bạn do root hoặc người dùng khác sở hữu, hãy đổi quyền sở hữu:

sudo chown -R 1000:1000 /path/to/your/files

Nếu bạn đang dùng SELinux (thay cho AppArmor), bạn có thể thấy các từ chối quyền khác hiển thị trong log kiểm toán. Chúng phức tạp hơn vì SELinux kiểm soát những gì tiến trình có thể truy cập dựa trên ngữ cảnh bảo mật, không chỉ UID.

Tìm vi phạm truy cập gần đây:

sudo ausearch -m avc -ts recent

Khắc phục ngữ cảnh SELinux bằng cách bật quản lý container và khôi phục nhãn đúng cho volume Docker của bạn:

sudo setsebool -P container_manage_cgroup on
sudo restorecon -R /path/to/your/volume

Lỗi dịch vụ

Khi Docker không khởi động hoặc liên tục sập, bạn cần hiểu điều gì đang lỗi trước khi sửa. Trạng thái dịch vụ systemd cho bạn cái nhìn nhanh:

sudo systemctl status docker

Lệnh này cho biết Docker có đang chạy không và hiển thị các thông điệp lỗi gần đây. Nhưng để khắc phục chi tiết, bạn nên theo dõi log trực tiếp khi Docker cố gắng khởi động:

sudo journalctl -u docker.service -f

Một lỗi khởi động phổ biến xảy ra khi Docker không tắt sạch. Bạn sẽ thấy lỗi như "failed to start daemon: pid file found, ensure docker is not running." Nghĩa là còn sót lại tệp tiến trình làm script khởi động nhầm lẫn.

Xóa tệp cũ và thử khởi động lại:

sudo rm /var/run/docker.pid
sudo systemctl start docker

Vấn đề lưu trữ cũng thường gây lỗi daemon. Docker lưu toàn bộ dữ liệu ở /var/lib/docker, và nếu thư mục này hết dung lượng hoặc bị hỏng, Docker không thể khởi động đúng.

Kiểm tra dung lượng còn trống:

df -h /var/lib/docker

Nếu sắp hết dung lượng, hãy dọn container và image cũ không dùng nữa:

docker system prune -a

Xung đột mạng cũng có thể ngăn Docker khởi động. Điều này xảy ra khi mạng cầu nối mặc định của Docker (thường là 172.17.0.0/16) xung đột với thiết lập mạng hiện có. Bạn sẽ thấy lỗi về dải địa chỉ không khả dụng.

Khắc phục bằng cách cấu hình IP bridge tùy chỉnh không xung đột với mạng của bạn. Chỉnh /etc/docker/daemon.json:

{
  "bip": "192.168.1.1/24"
}

Sau khi thay đổi, khởi động lại Docker để dùng cấu hình mạng mới:

sudo systemctl restart docker

Vấn đề kernel lỗi thời

Docker phụ thuộc vào các tính năng kernel Linux cho container hóa, mạng và bảo mật. Nếu kernel quá cũ, bạn sẽ gặp vấn đề không thể sửa nếu không nâng cấp.

Kiểm tra phiên bản kernel bạn đang chạy bằng lệnh này:

uname -r

Docker cần ít nhất kernel 3.10 cho chức năng cơ bản, nhưng tốt nhất là 4.0 hoặc mới hơn cho môi trường sản xuất. Bất kỳ bản cũ hơn 3.10 đơn giản là không hoạt động với phiên bản Docker hiện đại.

Cập nhật kernel trên Debian rất dễ, chỉ cần cài gói kernel mới nhất:

sudo apt update
sudo apt install linux-image-amd64

Kernel mới sẽ không hoạt động cho đến khi bạn khởi động lại hệ thống:

sudo reboot

Đôi khi kernel đủ mới, nhưng một số module kernel chưa được nạp. Docker cần module cụ thể cho tính năng mạng và container hóa. Bạn sẽ thấy lỗi về giao diện mạng không khả dụng hoặc container không khởi động đúng.

Nạp thủ công các module thiết yếu:

sudo modprobe bridge
sudo modprobe ip_tables
sudo modprobe iptable_nat

Các module này lẽ ra tự nạp, nhưng nếu không, hãy làm cho chúng vĩnh viễn bằng cách thêm vào cấu hình hệ thống:

echo "bridge" | sudo tee -a /etc/modules
echo "ip_tables" | sudo tee -a /etc/modules  
echo "iptable_nat" | sudo tee -a /etc/modules

Ngay cả với kernel mới, bạn có thể gặp lỗi runtime của container báo "operation not supported." Thông thường nghĩa là kernel của bạn được biên dịch thiếu một số tính năng Docker mong đợi. Đáng tiếc, không có cách lách cho thiếu tính năng kernel - bạn cần một kernel được cấu hình đúng.

Phần lớn vấn đề cài đặt Docker quay về ba mảng: quyền người dùng, cấu hình dịch vụ, hoặc tương thích kernel. Sửa vấn đề gốc thay vì lách qua triệu chứng, và môi trường Docker của bạn sẽ ổn định hơn nhiều.

Làm việc với cơ sở dữ liệu trong container? Cấu hình PostgreSQL trong Docker dễ hơn bạn nghĩ.

Gỡ cài đặt Docker

Đôi khi bạn cần loại bỏ hoàn toàn Docker khỏi hệ thống, dù là chuyển sang runtime container khác hay bắt đầu lại sau các vấn đề cấu hình. 

Quy trình này không chỉ gỡ gói - bạn cũng nên dọn dữ liệu và các thay đổi hệ thống.

Bắt đầu bằng cách gỡ tất cả gói Docker khỏi hệ thống. Lệnh chính xác phụ thuộc vào cách bạn cài Docker ban đầu.

Nếu bạn cài từ kho chính thức của Docker:

sudo apt purge docker-ce docker-ce-cli containerd.io docker-compose-plugin

Nếu bạn cài từ kho mặc định của Debian:

sudo apt purge docker.io docker-compose

Lệnh này gỡ các gói nhưng để lại tệp cấu hình và phụ thuộc mà gói khác có thể còn cần. Để gỡ chúng luôn:

sudo apt autoremove --purge

Sau đó, xóa thư mục dữ liệu của Docker nếu bạn muốn gỡ toàn bộ image, container và volume. Bước này tùy chọn nhưng nên làm để dọn sạch hoàn toàn.

Theo mặc định, Docker lưu mọi thứ trong /var/lib/docker. Xóa thư mục này sẽ xóa vĩnh viễn tất cả container, image, mạng và volume:

sudo rm -rf /var/lib/docker

Bạn cũng nên xóa thư mục cấu hình của Docker:

sudo rm -rf /etc/docker

Tiếp tục bằng cách dọn nhóm và người dùng hệ thống mà Docker đã tạo khi cài đặt. Docker thêm một nhóm docker vào hệ thống và có thể đã chỉnh quyền người dùng.

Xóa nhóm docker:

sudo groupdel docker

Nếu bạn đã thêm người dùng vào nhóm docker, tư cách nhóm của họ sẽ tự được dọn khi bạn xóa nhóm. Nhưng bạn cũng có thể chủ động xóa người dùng cụ thể khỏi nhóm trước khi xóa:

sudo gpasswd -d username docker

Sau đó, xóa các tệp dịch vụ systemd và socket của Docker:

sudo rm -f /lib/systemd/system/docker.service
sudo rm -f /lib/systemd/system/docker.socket
sudo systemctl daemon-reload

Cuối cùng, kiểm tra các tiến trình Docker còn lại có thể vẫn đang chạy:

ps aux | grep docker

Nếu tìm thấy, dừng thủ công:

sudo pkill -f docker

Sau các bước này, Docker sẽ được gỡ hoàn toàn khỏi hệ thống của bạn mà không còn tệp hay cấu hình sót lại.

Cân nhắc lựa chọn thay thế cho Docker? Khám phá các nền tảng container hóa khác trước khi chuyển đổi.

Kết luận và thực tiễn tốt nhất

Giờ bạn đã chạy Docker trên Debian, nhưng cài đặt chỉ là khởi đầu. Cách bạn cấu hình và duy trì môi trường Docker sẽ quyết định bạn có trải nghiệm sản xuất trơn tru hay phải thức đêm để xử lý sự cố container.

Xây dựng container đa nền tảng cho các kiến trúc khác nhau? Docker Buildx giúp build đa nền tảng trở nên đơn giản.

Chọn phương pháp cài đặt dựa trên ràng buộc của bạn. Kho chính thức của Docker phù hợp nhất cho hầu hết môi trường sản xuất vì bạn nhận được tính năng và bản vá bảo mật mới nhất. Nhưng mạng cô lập hoặc yêu cầu đồng nhất phiên bản có thể đòi hỏi cài thủ công gói DEB.

Bảo mật môi trường Docker ngay lập tức. Bật AppArmor hoặc SELinux cho kiểm soát truy cập bắt buộc, cấu hình daemon với thiết lập hạn chế, và dùng cgroups để giới hạn tài nguyên container. Giữ Docker luôn được cập nhật với các bản vá bảo mật tự động, nhưng hãy thử nghiệm ở staging trước.

Dùng Docker Compose cho ứng dụng đa container. Thay vì quản lý các lệnh docker run phức tạp, hãy định nghĩa stack ứng dụng của bạn trong YAML.

Theo dõi dung lượng đĩa và dọn dẹp thường xuyên. Chạy docker system prune để gỡ image không dùng và thiết lập xoay vòng log để ngăn container làm đầy đĩa.

Khi cần thông tin chi tiết hơn, tài liệu chính thức bao quát các chủ đề nâng cao mà hướng dẫn này không đề cập. Xem tài liệu Docker để tìm hiểu sâu về mạng, các trình điều khiển lưu trữ và điều phối. Tài liệu gói Docker của Debian giải thích cấu hình đặc thù gói và các vấn đề đã biết.

Docker trên Debian mang đến một nền tảng ổn định, mạnh mẽ cho ứng dụng container hóa - nhưng chỉ khi bạn cấu hình thấu đáo và duy trì nhất quán.

Muốn tìm hiểu thêm về Docker, container hóa, và ứng dụng của nó trong khoa học dữ liệu và machine learning? Các khóa học của DataCamp dưới đây là điểm dừng chân tiếp theo phù hợp:

Dario Radečić

Tác giả

Dario Radečić

Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.

Câu hỏi thường gặp

Cách tốt nhất để cài Docker trên Debian cho môi trường sản xuất là gì?

Phương pháp kho chính thức của Docker là lựa chọn tốt nhất cho môi trường sản xuất vì cung cấp các bản phát hành ổn định mới nhất cùng cập nhật bảo mật thường xuyên. Cách này đảm bảo bạn nhận mọi tính năng mới và bản vá quan trọng có thể không có trong kho mặc định của Debian. Bạn cũng được lợi từ cập nhật tự động qua trình quản lý gói, giúp cài đặt Docker luôn an toàn mà không cần can thiệp thủ công.

Tôi có cần lo lắng về bảo mật khi chạy Docker trên Debian không?

Có, bảo mật Docker đòi hỏi cấu hình cẩn trọng vượt ra ngoài cài đặt cơ bản. Container dùng chung kernel của host, nên một container bị xâm phạm có thể truy cập tài nguyên host nếu không được cách ly đúng. Bạn nên bật AppArmor hoặc SELinux cho kiểm soát truy cập bắt buộc, cấu hình giới hạn tài nguyên bằng cgroups, và chạy container với người dùng không phải root bất cứ khi nào có thể. Ngoài ra, luôn cập nhật Docker và tránh thêm người dùng vào nhóm docker trừ khi thật cần thiết, vì điều này cấp quyền tương đương root trên hệ thống.

Tôi có thể chạy Docker trên các phiên bản Debian cũ hơn không?

Docker yêu cầu Debian 10 (Buster) hoặc mới hơn để hoạt động với các phiên bản Docker Engine hiện tại. Các bản phát hành cũ như Debian 9 thiếu tính năng kernel và phụ thuộc gói cần thiết cho Docker hiện đại. Nếu bạn đang mắc kẹt với bản Debian cũ, bạn cần nâng cấp hệ thống trước, vì không có cách khả thi để bù cho tính năng kernel còn thiếu mà Docker phụ thuộc vào cho container hóa và mạng.

Vì sao Docker không khởi động sau khi cài đặt, và làm sao sửa lỗi daemon?

Lỗi Docker daemon thường bắt nguồn từ ba nguyên nhân chính: vấn đề lưu trữ, xung đột mạng, hoặc tệp tiến trình còn sót từ cài đặt trước. Kiểm tra /var/lib/docker có đủ dung lượng bằng df -h /var/lib/docker, và dọn dẹp bằng docker system prune -a nếu cần. Với xung đột mạng, IP bridge mặc định của Docker (172.17.0.0/16) có thể trùng với thiết lập mạng hiện có, yêu cầu bạn cấu hình IP bridge tùy chỉnh trong /etc/docker/daemon.json. Nếu thấy lỗi "pid file found", hãy xóa tệp cũ bằng sudo rm /var/run/docker.pid và khởi động lại dịch vụ.

Làm thế nào để gỡ Docker và toàn bộ dữ liệu khỏi hệ thống Debian đúng cách?

Gỡ Docker hoàn toàn đòi hỏi nhiều hơn việc gỡ gói - bạn cần dọn thư mục dữ liệu, nhóm hệ thống và tệp dịch vụ. Bắt đầu bằng purge các gói Docker với sudo apt purge docker-ce docker-ce-cli containerd.io docker-compose-plugin, sau đó xóa thư mục dữ liệu bằng sudo rm -rf /var/lib/docker (hành động này xóa vĩnh viễn tất cả container và image). Xóa nhóm docker bằng sudo groupdel docker, gỡ tệp dịch vụ systemd, và kiểm tra tiến trình Docker còn lại với ps aux | grep docker. Điều này đảm bảo sạch hoàn toàn nếu bạn cần cài lại hoặc chuyển sang runtime container khác.

Chủ đề

Liên quan