Chào mừng bạn trở lại với chuỗi bài viết “Roadmap Docker”! Sau khi đã cùng nhau tìm hiểu Container là gì, sự khác biệt giữa Container, Máy ảo và Bare Metal, Hiểu về Docker và Tiêu chuẩn OCI, và trang bị cho mình các kỹ năng Linux cốt lõi bao gồm quản lý gói (Package Managers), quản lý người dùng và quyền hạn, cũng như các lệnh Shell cần thiết và sử dụng Shell Script, đã đến lúc chúng ta đặt viên gạch đầu tiên để bắt đầu hành trình với Docker: Cài đặt Docker Engine trên hệ điều hành Linux thân thuộc.
Docker Engine là trái tim của Docker. Nó là ứng dụng client-server chính giúp bạn xây dựng, chạy và quản lý container. Đối với một DevOps Engineer, việc nắm vững cách cài đặt và cấu hình Docker Engine trên Linux là một kỹ năng nền tảng cực kỳ quan trọng. Bài viết này sẽ cung cấp cho bạn một hướng dẫn chi tiết, từng bước để thực hiện công việc này một cách chính xác và hiệu quả.
Mục lục
Chuẩn bị trước khi bắt đầu
Trước khi “xắn tay áo” vào cài đặt, hãy đảm bảo rằng hệ thống Linux của bạn đáp ứng các yêu cầu cơ bản và bạn đã nắm vững những kiến thức đã được đề cập trong các bài viết trước:
- Hệ điều hành Linux: Docker Engine hỗ trợ nhiều bản phân phối Linux khác nhau như Ubuntu, Debian, CentOS, Fedora, RHEL… Tuy nhiên, các bước cụ thể có thể hơi khác nhau tùy thuộc vào bản phân phối bạn đang sử dụng. Hãy chắc chắn bạn biết bản phân phối và phiên bản của hệ thống mình.
- Quyền root hoặc sudo: Bạn cần có quyền quản trị để thực hiện các lệnh cài đặt hệ thống.
- Kết nối Internet: Việc cài đặt đòi hỏi tải về các gói từ Internet.
- Kiến thức cơ bản về Linux: Hiểu cách sử dụng terminal, làm việc với file/folder, và đặc biệt là cách sử dụng các trình quản lý gói (apt, yum, dnf) là rất quan trọng.
- Hiểu về người dùng và nhóm: Chúng ta sẽ cần thêm người dùng hiện tại vào nhóm
docker
để chạy lệnh Docker mà không cầnsudo
, điều này liên quan trực tiếp đến kiến thức về Người Dùng, Nhóm và Quyền Hạn trong Linux.
Với những nền tảng vững chắc này, bạn đã sẵn sàng để tiếp tục!
Chọn bản phân phối Linux phù hợp
Docker Engine hỗ trợ nhiều bản phân phối Linux, nhưng phổ biến nhất trong môi trường server và DevOps là Ubuntu, CentOS/RHEL, và Fedora. Các bước cài đặt dưới đây sẽ tập trung vào các bản phân phối này, vì chúng sử dụng các trình quản lý gói khác nhau (apt
cho Ubuntu/Debian, yum
cho CentOS/RHEL cũ, và dnf
cho CentOS/RHEL mới hơn cũng như Fedora).
Lưu ý: Luôn kiểm tra trang tài liệu chính thức của Docker để biết danh sách đầy đủ các bản phân phối được hỗ trợ và các yêu cầu cụ thể cho từng phiên bản.
Gỡ bỏ các phiên bản Docker cũ (Nếu có)
Nếu bạn đã từng cài đặt Docker bằng các phương pháp khác hoặc phiên bản cũ hơn, việc gỡ bỏ chúng là cần thiết để tránh xung đột. Tên gói có thể khác nhau, nhưng bạn có thể thử các lệnh sau tùy thuộc vào trình quản lý gói của bạn. Đây là lúc kiến thức về Package Managers phát huy tác dụng!
Trên Ubuntu/Debian (sử dụng apt):
sudo apt-get remove docker docker-engine docker.io containerd runc
Trên CentOS/RHEL (sử dụng yum):
sudo yum remove docker docker-client docker-client-latest docker-common docker-ce docker-ce-cli docker-engine docker-latest docker.io containerd.io docker-buildx-plugin docker-compose-plugin docker-distribution docker-plugins
Trên Fedora (sử dụng dnf):
sudo dnf remove docker docker-client docker-client-latest docker-common docker-ce docker-ce-cli docker-engine docker-latest docker.io containerd.io docker-buildx-plugin docker-compose-plugin docker-distribution docker-plugins
Lệnh này chỉ gỡ bỏ Docker Engine, các file cấu hình, ảnh (images), container, volume hoặc network cũ vẫn sẽ còn lại. Nếu bạn muốn gỡ bỏ hoàn toàn, bạn sẽ cần thêm các bước thủ công sau đó (thường không cần thiết trừ khi bạn gặp vấn đề nghiêm trọng).
Thiết lập Kho lưu trữ (Repository) của Docker
Cách cài đặt Docker Engine được khuyến nghị và an toàn nhất là sử dụng kho lưu trữ chính thức của Docker. Điều này đảm bảo bạn luôn nhận được các phiên bản mới nhất, ổn định và được cập nhật bảo mật. Quá trình này bao gồm thêm khóa GPG của Docker và cấu hình kho lưu trữ vào danh sách các nguồn cài đặt của hệ thống.
1. Thêm khóa GPG chính thức của Docker
Khóa GPG (GNU Privacy Guard) được sử dụng để xác minh tính toàn vẹn và nguồn gốc của các gói bạn tải xuống. Việc thêm khóa này đảm bảo rằng các gói Docker bạn cài đặt thực sự đến từ Docker và không bị giả mạo.
Trên Ubuntu/Debian:
sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
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
Lệnh này cập nhật danh sách gói, cài đặt các tiện ích cần thiết (ca-certificates
và curl
), tạo thư mục cho keyrings nếu chưa có, tải khóa GPG và đặt quyền đọc cho nó.
Trên CentOS/RHEL:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Lệnh này cài đặt yum-utils
(bao gồm yum-config-manager
) và sử dụng nó để thêm kho lưu trữ Docker CE (Community Edition). Bước này đã bao gồm việc thiết lập khóa GPG cho kho lưu trữ.
Trên Fedora:
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
Tương tự như CentOS/RHEL, lệnh này cài đặt các plugin cần thiết và thêm kho lưu trữ Docker CE, bao gồm cả việc thiết lập khóa GPG.
2. Thêm kho lưu trữ Docker vào hệ thống
Sau khi có khóa GPG, bạn cần thêm thông tin về kho lưu trữ Docker vào danh sách các nguồn mà trình quản lý gói của bạn sẽ tìm kiếm phần mềm.
Trên Ubuntu/Debian:
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
Lệnh này thêm dòng cấu hình cho kho lưu trữ Docker vào file /etc/apt/sources.list.d/docker.list
. Nó tự động xác định kiến trúc CPU và tên mã phiên bản Ubuntu/Debian của bạn.
Trên CentOS/RHEL và Fedora:
Bước thêm kho lưu trữ đã được thực hiện ở bước trước khi sử dụng yum-config-manager
hoặc dnf config-manager
.
Cài đặt Docker Engine
Sau khi đã thiết lập kho lưu trữ, bạn có thể tiến hành cài đặt Docker Engine, cùng với các thành phần cần thiết khác như containerd
(thành phần runtime cấp thấp) và docker-ce-cli
(công cụ dòng lệnh).
Trên Ubuntu/Debian:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Đầu tiên, cập nhật lại danh sách gói để trình quản lý gói biết về kho lưu trữ Docker mới. Sau đó, cài đặt các gói docker-ce
(Docker Engine), docker-ce-cli
(client CLI), containerd.io
(runtime), và các plugin khác như buildx và compose (rất hữu ích sau này).
Trên CentOS/RHEL:
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Cài đặt các gói tương tự sử dụng yum
.
Trên Fedora:
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Cài đặt các gói tương tự sử dụng dnf
.
Sau khi cài đặt xong, Docker Engine (daemon) sẽ tự động được khởi động và được cấu hình để chạy khi khởi động hệ thống trên hầu hết các bản phân phối sử dụng systemd
(như các phiên bản Ubuntu, CentOS/RHEL, Fedora gần đây). Nếu hệ thống của bạn vẫn sử dụng SysVinit, bạn có thể cần các lệnh khác để quản lý service.
Quản lý Docker với người dùng không phải Root
Mặc định, để chạy các lệnh docker
, bạn cần có quyền root hoặc sử dụng sudo
. Điều này không an toàn và bất tiện trong quá trình làm việc hàng ngày. Docker tạo ra một Unix group có tên là docker
. Khi một người dùng được thêm vào nhóm này, họ có thể chạy các lệnh Docker mà không cần sudo
. Điều này liên quan chặt chẽ đến kiến thức về Người Dùng, Nhóm và Quyền Hạn trong Linux mà chúng ta đã tìm hiểu.
1. Tạo nhóm docker (thường đã có sau khi cài đặt)
sudo groupadd docker
Lệnh này tạo nhóm docker
nếu nó chưa tồn tại. Sau khi cài đặt Docker, nhóm này thường đã được tạo tự động.
2. Thêm người dùng hiện tại vào nhóm docker
sudo usermod -aG docker $USER
Lệnh usermod
được sử dụng để sửa đổi thông tin người dùng. Tùy chọn -aG
thêm người dùng ($USER
là biến môi trường chứa tên người dùng hiện tại của bạn) vào nhóm bổ sung (G
) mà không xóa họ khỏi các nhóm khác (a
). Đây là bước quan trọng để cho phép người dùng thông thường chạy lệnh docker.
3. Kích hoạt thay đổi nhóm
Để thay đổi nhóm có hiệu lực, bạn cần đăng xuất và đăng nhập lại, hoặc sử dụng lệnh newgrp
.
newgrp docker
Lệnh newgrp docker
tạm thời chuyển môi trường shell hiện tại của bạn sang nhóm docker
. Điều này cho phép bạn chạy các lệnh Docker ngay lập tức mà không cần đăng xuất/đăng nhập lại. Tuy nhiên, phương pháp đăng xuất/đăng nhập lại hoặc khởi động lại hệ thống là cách chắc chắn nhất để đảm bảo thay đổi có hiệu lực vĩnh viễn.
4. Kiểm tra quyền truy cập
Sau khi đã thực hiện các bước trên, bạn có thể kiểm tra xem mình có thể chạy Docker mà không cần sudo
hay chưa.
docker run hello-world
Nếu bạn thấy thông báo chào mừng từ Docker và không gặp lỗi quyền hạn, nghĩa là bạn đã thành công. Nếu vẫn cần sudo
, hãy kiểm tra lại các bước thêm người dùng vào nhóm và đảm bảo bạn đã đăng nhập lại hoặc sử dụng newgrp
.
Cấu hình Docker khởi động cùng hệ thống
Trên các hệ thống sử dụng systemd
(phổ biến nhất hiện nay), Docker Engine thường được cấu hình để khởi động tự động khi hệ thống boot. Bạn có thể kiểm tra trạng thái và kích hoạt/vô hiệu hóa nó bằng các lệnh sau:
Kiểm tra trạng thái Docker:
sudo systemctl status docker
Bạn sẽ thấy thông báo về trạng thái hiện tại của service Docker (active, inactive, failed…).
Kích hoạt Docker khởi động cùng hệ thống (nếu chưa):
sudo systemctl enable docker.service
Lệnh này tạo liên kết cần thiết để systemd
khởi động Docker daemon khi hệ thống boot.
Khởi động Docker service (nếu chưa chạy):
sudo systemctl start docker.service
Khởi động lại Docker service:
sudo systemctl restart docker.service
Kiểm tra cài đặt lần cuối
Cách tốt nhất để xác minh rằng Docker Engine đã được cài đặt và hoạt động chính xác là chạy container hello-world
.
docker run hello-world
Lệnh này sẽ:
- Tải về ảnh
hello-world
từ Docker Hub (nếu chưa có). - Tạo một container mới từ ảnh đó.
- Chạy ứng dụng trong container, ứng dụng này sẽ in ra thông báo chào mừng.
- Dừng container.
Nếu bạn thấy thông báo như sau, xin chúc mừng, bạn đã cài đặt Docker Engine thành công!
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
... (output during download) ...
Digest: sha256:...
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(Assuming it was not already locally available.)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and too much more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Bảng tóm tắt lệnh cài đặt cho các bản phân phối phổ biến
Để tiện theo dõi, đây là bảng tóm tắt các lệnh chính cho các bản phân phối phổ biến:
Bước | Ubuntu/Debian (apt ) |
CentOS/RHEL (yum ) |
Fedora (dnf ) |
---|---|---|---|
Gỡ phiên bản cũ | sudo apt-get remove docker docker-engine docker.io containerd runc |
sudo yum remove docker docker-client docker-client-latest docker-common docker-ce docker-ce-cli docker-engine docker-latest docker.io containerd.io docker-buildx-plugin docker-compose-plugin docker-distribution docker-plugins |
sudo dnf remove docker docker-client docker-client-latest docker-common docker-ce docker-ce-cli docker-engine docker-latest docker.io containerd.io docker-buildx-plugin docker-compose-plugin docker-distribution docker-plugins |
Thiết lập Repo (Key & Config) |
|
|
|
Cài đặt Docker Engine etc. |
|
|
|
Start/Enable Service (systemd) |
|
|
|
Thêm người dùng vào nhóm docker |
(Đăng xuất/Đăng nhập lại hoặc |
||
Kiểm tra |
|
Khắc phục sự cố thường gặp
- Quyền hạn bị từ chối (Permission denied): Đây là lỗi phổ biến nhất. Hãy kiểm tra xem người dùng của bạn đã được thêm vào nhóm
docker
chưa (sử dụng lệnhgroups $USER
) và bạn đã đăng xuất/đăng nhập lại hoặc sử dụngnewgrp docker
chưa. - Docker daemon không chạy: Sử dụng
sudo systemctl status docker
để kiểm tra trạng thái. Nếu nó không chạy, thử khởi động nó bằngsudo systemctl start docker
. - Không tìm thấy gói Docker: Đảm bảo rằng bạn đã thiết lập kho lưu trữ Docker chính xác và đã chạy
sudo apt-get update
(hoặc tương đương) trước khi cài đặt. Kiểm tra lại các bước thêm khóa GPG và kho lưu trữ. - Lỗi kết nối mạng: Đảm bảo hệ thống của bạn có kết nối internet để tải về các gói và ảnh Docker. Kiểm tra tường lửa có chặn kết nối không.
Tiếp theo trên Roadmap Docker
Việc cài đặt Docker Engine chỉ là bước khởi đầu. Bạn đã có công cụ mạnh mẽ trong tay, sẵn sàng để khám phá thế giới container hóa. Trong các bài viết tiếp theo của chuỗi “Roadmap Docker”, chúng ta sẽ đi sâu vào:
- Làm việc với Docker Images và Docker Hub.
- Hiểu thêm về các công nghệ nền tảng như Namespaces, cgroups, UnionFS.
- Viết Dockerfile để xây dựng các ảnh tùy chỉnh.
- Quản lý dữ liệu với Docker Volumes.
- Kết nối container với Docker Networks.
- Giới thiệu Docker Compose để quản lý các ứng dụng multi-container.
Mỗi bước đi này sẽ củng cố kiến thức và kỹ năng của bạn trên con đường trở thành một DevOps Engineer giỏi.
Lời kết
Chúc mừng! Bạn đã hoàn thành việc cài đặt Docker Engine trên hệ thống Linux của mình. Đây là một cột mốc quan trọng trong hành trình học Docker của bạn. Mặc dù các bước có vẻ chi tiết, nhưng một khi đã hiểu rõ quy trình và mục đích của từng lệnh, bạn sẽ thấy việc này trở nên dễ dàng hơn rất nhiều. Việc sử dụng kho lưu trữ chính thức đảm bảo tính bảo mật và cập nhật cho môi trường làm việc của bạn.
Hãy dành thời gian làm quen với công cụ mới này, thử chạy một vài container đơn giản và chuẩn bị cho những kiến thức thú vị tiếp theo trong chuỗi “Roadmap Docker”. Hẹn gặp lại bạn ở bài viết sau!