Bài viết này sẽ hướng dẫn bạn cách cài đặt Docker trên server Ubuntu. Nếu bạn muốn triển khai ứng dụng Docker trên một server trực tiếp với một cú click.
Để theo dõi bài hướng dẫn này, bạn cần:
Gói cài đặt Docker có trong kho Ubuntu chính thức có thể không phải là phiên bản mới nhất. Để đảm bảo lấy được phiên bản mới nhất, ta sẽ cài Docker từ kho chính thức của Docker. Cách làm là thêm nguồn gói mới, thêm khóa GPG của Docker để xác thực gói tải xuống, sau đó cài đặt gói đó.
Trước tiên, cập nhật danh sách gói hiện có:
sudo apt update
Tiếp theo, cài đặt các gói tiền đề để apt có thể sử dụng gói qua HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Sau đó thêm khóa GPG cho kho chính thức của Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Thêm kho Docker vào nguồn APT:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Giờ kho gói sẽ được cập nhật thêm các gói Docker từ repo mới.
Kiểm tra chắc chắn sẽ cài từ kho Docker thay vì kho Ubuntu mặc định:
apt-cache policy docker-ce
Bạn sẽ thấy đầu ra kiểu như:
docker-ce:
Installed: (none)
Candidate: 5:19.03.9~3-0~ubuntu-focal
Version table:
5:19.03.9~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
Lưu ý docker-ce chưa được cài, phiên bản sẵn cài là bản từ Docker repository cho Ubuntu (focal).
Sau cùng, cài Docker:
sudo apt install docker-ce
Docker sẽ được cài, daemon sẽ được khởi động và kích hoạt khởi chạy cùng hệ thống. Kiểm tra trạng thái:
sudo systemctl status docker
Bạn sẽ thấy kết quả cho thấy dịch vụ đang chạy, ví dụ:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 24321 (dockerd)
Tasks: 8
Memory: 46.4M
CGroup: /system.slice/docker.service
└─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Cài Docker mang đến không chỉ daemon mà còn cả tiện ích dòng lệnh docker. Bài viết sẽ hướng dẫn sử dụng docker ở các bước cạnh sau.
Mặc định, lệnh docker chỉ được chạy bởi user root hoặc user trong nhóm docker (nhóm này được tự động tạo khi cài Docker). Nếu bạn chạy lệnh docker không kèm sudo hoặc không trong nhóm docker, sẽ nhận được thông báo lỗi:
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Để không cần gõ sudo mỗi lần chạy lệnh docker, thêm user của bạn vào nhóm docker:
sudo usermod -aG docker ${USER}
Để nhóm mới có hiệu lực, đăng xuất rồi đăng nhập lại hoặc chạy:
su - ${USER}
Bạn sẽ được yêu cầu nhập mật khẩu.
Xác nhận user đã vào nhóm docker:
groups
Kết quả ví dụ:
sammy sudo docker
Nếu muốn thêm user khác vào nhóm docker, chạy:
sudo usermod -aG docker username
Các bước sau giả định bạn đang chạy lệnh docker dưới user nằm trong nhóm docker. Nếu không, nhớ thêm sudo trước lệnh.
Lệnh docker gồm chuỗi tùy chọn, lệnh con và tham số. Cú pháp:
docker [option] [command] [arguments]
Để xem các lệnh con có thể dùng:
docker
Từ Docker 19, danh sách lệnh con gồm:
attach Kết nối chuẩn input, output, error tới container đang chạy
build Xây dựng image từ Dockerfile
commit Tạo image mới từ thay đổi container
cp Sao chép file/thư mục giữa container và hệ thống
create Tạo container mới
diff Kiểm tra thay đổi trong filesystem của container
events Lấy sự kiện real-time từ server
exec Chạy lệnh trong container đang chạy
export Xuất filesystem container ra tar archive
history Hiển thị lịch sử image
images Liệt kê các image
import Nhập filesystem từ tarball
info Hiển thị thông tin tổng quan Docker
inspect Thông tin chi tiết về Docker objects
kill Dừng một hoặc nhiều container
load Tải image từ tar archive hoặc STDIN
login Đăng nhập Docker registry
logout Đăng xuất Docker registry
logs Lấy logs container
pause Tạm dừng tiến trình trong container
port Liệt kê ánh xạ port của container
ps Liệt kê container
pull Tải image từ registry
push Đẩy image lên registry
rename Đổi tên container
restart Khởi động lại container
rm Xóa container
rmi Xóa images
run Chạy lệnh trong container mới
save Lưu images ra tar archive
search Tìm kiếm image trên Docker Hub
start Khởi động container đã dừng
stats Hiển thị thống kê tài nguyên container
stop Dừng container
tag Tạo tag image
top Hiển thị tiến trình container đang chạy
unpause Tiếp tục tiến trình container
update Cập nhật cấu hình container
version Hiển thị phiên bản Docker
wait Chờ container dừng, trả về exit code
Để xem tùy chọn của một lệnh con:
docker docker-subcommand --help
Để xem thông tin hệ thống Docker:
docker info
Bài viết sẽ tiếp tục với thao tác làm việc với images.
Container Docker xây dựng từ Docker images. Mặc định, Docker tải các images từ Docker Hub, một registry do Docker quản lý. Ai cũng có thể lưu trữ images tại đây, nên hầu hết ứng dụng và bản phân phối Linux đều có images tại đó.
Kiểm tra có thể truy cập và tải image từ Docker Hub:
docker run hello-world
Đầu ra cho thấy Docker đang hoạt động đúng:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Ban đầu Docker không tìm thấy image hello-world cục bộ, nên tải image từ Docker Hub. Sau khi tải xong, Docker tạo container từ image và chạy ứng dụng, xuất thông báo.
Bạn có thể tìm kiếm images trên Docker Hub dùng lệnh search:
docker search ubuntu
Kết quả liệt kê images phù hợp. Cột OFFICIAL ghi dấu [OK] nếu image được Docker chính thức hỗ trợ.
Để tải image ubuntu:
docker pull ubuntu
Bạn sẽ thấy thông báo tải về:
Using default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
Sau khi tải, chạy container từ image bằng lệnh run. Nếu chưa có image, Docker sẽ tự tải trước khi chạy container.
Xem các images đã tải:
docker images
Ví dụ:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
Images dùng để chạy containers có thể được chỉnh sửa và tạo mới, rồi đẩy lên Docker Hub hoặc registry khác.
Container hello-world trong bước trước chạy và thoát sau khi xuất thông báo. Container có thể tương tác, vì chúng giống máy ảo nhưng nhẹ và tiết kiệm hơn.
Ví dụ, chạy container Ubuntu mới nhất với shell tương tác:
docker run -it ubuntu
Dấu nhắc lệnh sẽ thay đổi thành:
root@d9b100f2f636:/#
ID container (ví dụ d9b100f2f636) bạn sẽ dùng để quản lý container sau.
Bạn có thể chạy lệnh bên trong container, ví dụ cập nhật gói:
apt update
Sau đó cài ứng dụng, ví dụ Node.js:
apt install nodejs
Sau khi cài, kiểm tra version Node.js:
node -v
Hiển thị:
v10.19.0
Các thay đổi bên trong container chỉ áp dụng cho container đó.
Thoát container bằng lệnh:
exit
Sau khi dùng Docker một thời gian, bạn sẽ có nhiều container đang chạy và đã dừng.
Xem container đang chạy:
docker ps
Kết quả:
CONTAINER ID IMAGE COMMAND CREATED
Bạn đã tạo 2 container: hello-world và ubuntu. Cả hai đều không chạy nhưng vẫn tồn tại.
Xem tất cả container (đang chạy và dừng):
docker ps -a
Kết quả ví dụ:
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty
a707221a5f6c hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago youthful_curie
Xem container mới nhất:
docker ps -l
Ví dụ:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
Khởi chạy container đã dừng:
docker start 1c08a7a0d0e4
Xem trạng thái:
docker ps
Dừng container:
docker stop quizzical_mcnulty
Xóa container không cần nữa (tìm ID hoặc tên bằng docker ps -a
):
docker rm youthful_curie
Bạn có thể tạo container với tên tuỳ chọn bằng --name
hoặc tự xoá container khi dừng với --rm
. Xem docker run --help
để biết thêm.
Container có thể chuyển thành image dùng để tạo container mới.
Khi bạn chạy Docker image, bạn có thể tạo, sửa, xóa file như máy ảo. Thay đổi chỉ áp dụng cho container. Khi xoá container bằng docker rm
, thay đổi sẽ mất.
Phần này hướng dẫn cách lưu trạng thái container thành image mới.
Sau khi cài Node.js trong container Ubuntu, bạn có container khác với image gốc. Bạn có thể tái sử dụng container này để tạo image mới.
Commit thay đổi thành image mới:
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
-m
là mô tả commit, giúp nhớ thay đổi gì; -a
là tác giả. container_id
là ID container; repository
thường là username Docker Hub.
Ví dụ với user sammy và container ID d9b100f2f636:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
Sau commit, image mới sẽ nằm ở máy bạn.
Liệt kê images:
docker images
Ví dụ:
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...
Trong ví dụ, ubuntu-nodejs
là image mới, tạo từ image Ubuntu gốc trên Docker Hub. Kích thước phản ánh thay đổi (đã cài NodeJS).
Bạn cũng có thể tạo image từ Dockerfile để tự động cài phần mềm, nhưng phần đó ngoài phạm vi bài này.
Tiếp theo là chia sẻ image vừa tạo.
Bước tiếp theo sau khi tạo image là chia sẻ với bạn bè, hoặc đẩy lên Docker Hub hoặc registry khác. Để đẩy image lên, bạn cần tài khoản ở đó.
Phần này hướng dẫn đẩy image lên Docker Hub. Nếu muốn tạo registry riêng, xem hướng dẫn cài registry riêng trên Ubuntu.
Đăng nhập Docker Hub:
docker login -u docker-registry-username
Bạn nhập mật khẩu để xác thực.
Lưu ý: Nếu username Docker registry khác với user tạo image, bạn cần tag image lại:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Sau đó, đẩy image:
docker push docker-registry-username/docker-image-name
Ví dụ đẩy image ubuntu-nodejs cho user sammy:
docker push sammy/ubuntu-nodejs
Quá trình có thể mất thời gian, khi xong bạn sẽ thấy:
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
...
Image sẽ xuất hiện trên trang dashboard Docker Hub.
Nếu gặp lỗi chưa đăng nhập:
unauthorized: authentication required
Hãy đăng nhập lại với docker login
rồi thử đẩy lại.
Bây giờ bạn có thể kéo image này trên máy khác:
docker pull sammy/ubuntu-nodejs
Docker cho phép xây dựng và chạy container đơn lẻ, nhưng quản lý multi-container phức tạp với Docker thuần túy có thể rườm rà. Docker Compose giải quyết vấn đề này.
Docker Compose là công cụ định nghĩa và chạy các ứng dụng nhiều container qua file YAML. Thay vì chạy nhiều container riêng biệt cho web server, database và cache tầng, bạn định nghĩa trong docker-compose.yml
rồi chạy với:
docker-compose up
Hướng dẫn chi tiết cách dùng Docker Compose trên Ubuntu có tại tutorial của DigitalOcean.
Feature | Docker CLI | Docker Compose |
---|---|---|
Usage | Vận hành container đơn | Orchestration nhiều container |
Configuration | Lệnh CLI | File cấu hình YAML |
Dependency handling | Thủ công | Tự động liên kết dịch vụ |
Best use case | Thử nghiệm container riêng | Phát triển và staging đa container |
docker: command not found
Fix: Docker CLI không có trong PATH, cài lại hoặc đảm bảo /usr/bin
có trong PATH.
sudo apt install docker-ce docker-ce-cli containerd.io
Fix: Docker chưa chạy hoặc user chưa thuộc nhóm docker.
sudo systemctl start docker
sudo usermod -aG docker $USER
Đăng xuất và đăng nhập lại.
Fix: Nếu lỗi key hoặc repo, tham khảo tài liệu chính thức của Docker về khóa GPG và repo mới nhất. Nếu dùng Ubuntu 22.04, dùng hướng dẫn riêng cho phiên bản này. Có thể dùng Ansible để cài đặt tự động tránh lỗi.
Docker Desktop đã hỗ trợ beta cho Linux, bao gồm Ubuntu. Nó cung cấp GUI, Docker Engine và hỗ trợ Kubernetes.
Cài Docker Desktop:
sudo apt install ./docker-desktop-<version>-<arch>.deb
Xem tài liệu chính thức Docker Desktop cho Linux để biết yêu cầu và link tải.
Lưu ý: Docker Desktop thích hợp cho phát triển, trên server nên dùng Docker CE.
Bạn có thể tự động cài Docker bằng Dockerfile như sau:
FROM ubuntu:20.04
RUN apt-get update && \
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" && \
apt-get update && \
apt-get install -y docker-ce docker-ce-cli containerd.io
Bạn cũng có thể dùng Ansible để tự động cài và cấu hình Docker, tiện cho nhiều máy hoặc duy trì cấu hình đồng nhất.
Xóa Docker hoàn toàn:
sudo apt purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
Nếu bạn đã thêm user vào nhóm docker, có thể xóa nhóm:
sudo groupdel docker
Nhớ sao lưu dữ liệu quan trọng trước khi gỡ bỏ.
Cách tốt nhất là dùng repo chính thức của Docker. Bạn đầu cập nhật package index, cài các gói tiền đề, thêm khóa GPG và repo ổn định, rồi cài Docker Engine và các thành phần liên quan. Cách này giúp bạn có phiên bản mới nhất, vá lỗi và cập nhật bảo mật.
Mặc định Docker cần quyền root, nên phải dùng sudo trước mỗi lệnh. Bạn có thể thêm user vào nhóm docker để chạy mà không cần sudo. Lệnh:
sudo usermod -aG docker $USER
Rồi đăng xuất và đăng nhập lại.
Bạn dùng:
docker info
để xem thông tin tổng quan. Hoặc:
docker run hello-world
Nếu chạy thành công hiển thị thông báo chào mừng Docker.
Có, bạn dùng:
apt-cache madison docker-ce
để xem các phiên bản. Rồi cài:
sudo apt install docker-ce=<VERSION_STRING>
Phiên bản này giúp giữ ổn định hoặc tương thích với dự án cũ.
Docker chạy container đơn lẻ. Docker Compose quản lý ứng dụng đa container qua file YAML, giúp xây dựng, cấu hình và chạy các dịch vụ liên kết phức tạp dễ dàng hơn.
Xem mục "How to Uninstall Docker on Ubuntu".
Docker Desktop có bản beta cho Linux, có giao diện GUI, kèm Docker Engine và Kubernetes. Phù hợp cho phát triển, không nên dùng trên server production. Dùng Docker CE cho server là tốt hơn.