Docker là một ứng dụng hỗ trợ đơn giản hóa quy trình quản lý các tiến trình của ứng dụng bên trong các container. Container cho phép bạn chạy các ứng dụng của mình trong các tiến trình được cô lập về tài nguyên. Chúng hoạt động tương tự như máy ảo (virtual machines), nhưng container linh hoạt hơn, tiết kiệm tài nguyên hơn và phụ thuộc nhiều hơn vào hệ điều hành máy chủ (host).
Trong bài viết này, InterData sẽ hướng dẫn bạn cách cài đặt và sử dụng Docker Community Edition (CE) trên hệ điều hành Ubuntu. Bạn sẽ được tìm hiểu chi tiết từ cách cài đặt Docker, làm việc với container, quản lý image, cho đến việc đẩy một image tự thiết lập lên Docker Repository.
Hướng dẫn này đã được kiểm tra tính tương thích và hoạt động ổn định trên các phiên bản Ubuntu 20.04, 22.04 và 24.04. Các câu lệnh và bước cài đặt được đồng bộ hóa nhờ sử dụng cơ chế tự động nhận diện phiên bản hệ điều hành.

Những điểm chính cần lưu ý
- Sử dụng kho lưu trữ chính thức của Docker: Việc cài đặt thông qua repository chính thức của Docker giúp đảm bảo bạn luôn nhận được phiên bản ổn định mới nhất cùng các bản vá bảo mật, thay vì phụ thuộc vào kho lưu trữ mặc định đôi khi bị chậm cập nhật của Ubuntu.
- Quy trình cài đặt không phụ thuộc phiên bản: Các câu lệnh tự động nhận diện kiến trúc hệ thống và phiên bản Ubuntu thông qua
$(dpkg --print-architecture)và$(lsb_release -cs)để đảm bảo tính tương thích cao trên Ubuntu 20.04, 22.04 và 24.04. - Chạy lệnh Docker không cần sudo: Bằng cách thêm tài khoản người dùng vào nhóm hệ thống
docker, bạn có thể tối ưu hóa quy trình làm việc, loại bỏ việc phải nhập mật khẩu thường xuyên (cần lưu ý về mặt bảo mật hệ thống). - Phân biệt rõ Image và Container: Image đóng vai trò là các bản thiết kế chỉ đọc (read-only templates), trong khi Container là các thực thể đang hoạt động (running instances) được khởi tạo từ các image đó.
- Docker Compose được tích hợp sẵn: Các bản cài đặt Docker hiện đại đã tích hợp sẵn Docker Compose dưới dạng một plugin, hỗ trợ truy cập trực tiếp qua lệnh
docker compose(không cần dấu gạch ngang) thay vì phải cài đặt công cụ độc lậpdocker-composecũ.
Yêu cầu hệ thống
Để thực hiện theo bài viết này, bạn cần chuẩn bị:
- Một máy chủ ảo chạy Ubuntu đã được thiết lập tài khoản người dùng có quyền
sudo(không phải tài khoản root) và có cấu hình tường lửa cơ bản. Nếu chưa có máy chủ, bạn có thể dễ dàng khởi tạo một cấu hình phù hợp thông qua dịch vụ cho thuê VPS cấu hình cao của InterData. - Một tài khoản đăng ký trên Docker Hub nếu bạn muốn tự tạo và lưu trữ các image của riêng mình lên nền tảng đám mây này (áp dụng ở Bước 7 và Bước 8).
Bước 1 — Cài đặt Docker
Gói cài đặt Docker mặc định trong kho ứng dụng của Ubuntu có thể không phải là phiên bản mới nhất. Để đảm bảo tính ổn định và cập nhật, chúng ta sẽ cài đặt Docker trực tiếp từ kho lưu trữ chính thức của nhà phát triển. Chúng ta sẽ thêm nguồn cài đặt mới, tích hợp khóa GPG của Docker để xác thực bảo mật, sau đó tiến hành cài đặt.
Đầu tiên, cập nhật danh sách các gói ứng dụng hiện có trên hệ thống:
sudo apt update
Tiếp theo, cài đặt một số gói bổ trợ cần thiết để cho phép công cụ apt tải và cài đặt các gói thông qua giao thức HTTPS bảo mật:
sudo apt install ca-certificates curl gnupg
Sau đó, tiến hành tải và lưu khóa GPG chính thức của Docker vào hệ thống bằng phương thức keyring bảo mật mới:
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
Thêm kho lưu trữ của Docker vào danh sách nguồn cấp APT. Câu lệnh dưới đây sẽ tự động nhận diện phiên bản hệ điều hành Ubuntu bạn đang sử dụng:
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
Tiếp tục cập nhật lại cơ sở dữ liệu gói của APT để hệ thống ghi nhận nguồn cài đặt mới vừa thêm:
sudo apt update
Kiểm tra để chắc chắn rằng hệ thống sẽ cài đặt Docker từ kho lưu trữ của chính hãng chứ không phải từ kho mặc định của Ubuntu:
apt-cache policy docker-ce
Kết quả hiển thị trên màn hình sẽ liệt kê các phiên bản có sẵn từ Docker. Phiên bản cụ thể có thể thay đổi tùy thời điểm, nhưng bạn sẽ thấy đường dẫn URL của Docker xuất hiện trong kết quả trả về.
Cuối cùng, chạy lệnh sau để tiến hành cài đặt các thành phần của Docker:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Lưu ý: Quá trình cài đặt này đã bao gồm docker-buildx-plugin và docker-compose-plugin để cung cấp các tính năng Docker Compose hiện đại. Bạn có thể sử dụng trực tiếp lệnh docker compose (không cần dấu gạch ngang) thay thế cho lệnh docker-compose độc lập trước đây.
Sau khi quá trình cài đặt hoàn tất, dịch vụ Docker daemon sẽ tự động được khởi chạy và thiết lập khởi động cùng hệ thống. Hãy kiểm tra trạng thái hoạt động của Docker bằng lệnh:
sudo systemctl status docker
Kết quả hiển thị thành công sẽ tương tự như dưới đây, cho thấy trạng thái dịch vụ đang ở chế độ active (running):
Output● 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
Giờ đây, bạn không chỉ có dịch vụ chạy ngầm Docker (daemon) hoạt động trên máy chủ mà còn có sẵn công cụ dòng lệnh docker (Docker client) để bắt đầu thực thi các thao tác điều phối.
Bước 2 — Chạy lệnh Docker không cần Sudo (Tùy chọn)
Theo mặc định, lệnh docker chỉ có thể được thực thi bởi người dùng root hoặc những tài khoản nằm trong nhóm docker (nhóm này tự động được tạo ra trong quá trình cài đặt Docker). Nếu bạn cố tình chạy lệnh docker bằng một tài khoản người dùng thông thường mà không có tiền tố sudo, hệ thống sẽ trả về lỗi tương tự như sau:
Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Để tránh việc phải nhập tiền tố sudo mỗi khi chạy lệnh docker, bạn hãy thêm tài khoản người dùng hiện tại của mình vào nhóm docker:
sudo usermod -aG docker ${USER}
Để các thay đổi về quyền nhóm có hiệu lực ngay lập tức mà không cần khởi động lại máy chủ, bạn có thể đăng xuất rồi đăng nhập lại, hoặc sử dụng lệnh sau:
su - ${USER}
Hệ thống sẽ yêu cầu bạn nhập mật khẩu tài khoản người dùng để tiếp tục xác thực.
Kiểm tra lại xem tài khoản của bạn đã thực sự thuộc nhóm docker chưa bằng lệnh:
groups
Outputinterdata-user sudo docker
Nếu bạn cần thêm một tài khoản người dùng khác (không phải tài khoản bạn đang đăng nhập) vào nhóm docker, hãy chỉ định rõ tên người dùng đó:
sudo usermod -aG docker username
Các nội dung hướng dẫn tiếp theo trong bài viết này được thực hiện với giả định rằng bạn đang chạy lệnh docker bằng một tài khoản đã thuộc nhóm docker. Nếu bạn không cấu hình bước này, vui lòng thêm tiền tố sudo trước mỗi câu lệnh.
Bước 3 — Tìm hiểu cách sử dụng lệnh Docker
Cấu trúc lệnh của công cụ docker thường bao gồm chuỗi các tùy chọn, lệnh phụ (subcommand) và các đối số đi kèm. Cú pháp cơ bản có dạng:
docker [option] [command] [arguments]
Để xem toàn bộ danh mục các lệnh phụ có sẵn, hãy gõ trực tiếp:
docker
Danh sách các lệnh phụ phổ biến hỗ trợ bạn quản lý hệ thống bao gồm:
| Lệnh | Mô tả |
|---|---|
| attach | Kết nối luồng dữ liệu chuẩn (input, output, error) vào một container đang chạy |
| build | Xây dựng một image mới từ tệp cấu hình Dockerfile |
| commit | Tạo một image mới từ những thay đổi của một container hiện tại |
| cp | Sao chép tập tin/thư mục giữa container và hệ thống tệp cục bộ |
| create | Tạo mới một container nhưng chưa khởi chạy |
| diff | Kiểm tra các thay đổi trên hệ thống tệp của một container |
| events | Nhận các sự kiện theo thời gian thực từ máy chủ Docker |
| exec | Thực thi một câu lệnh trực tiếp bên trong một container đang hoạt động |
| export | Xuất toàn bộ hệ thống tệp của một container thành một tệp nén tar |
| history | Hiển thị lịch sử thay đổi của một image |
| images | Liệt kê danh sách các image hiện có trên máy chủ |
| import | Nhập nội dung từ tệp tin tar để tạo thành một image hệ thống |
| info | Hiển thị các thông tin tổng quan về hệ thống Docker đang hoạt động |
| inspect | Trả về các thông tin chi tiết ở mức độ chuyên sâu của các đối tượng Docker |
| kill | Buộc dừng ngay lập tức một hoặc nhiều container đang chạy |
| load | Tải một image từ một tệp nén tar hoặc luồng dữ liệu đầu vào chuẩn |
| login | Đăng nhập vào một kho chứa Docker registry (như Docker Hub) |
| logout | Đăng xuất khỏi một kho chứa Docker registry |
| logs | Truy xuất thông tin nhật ký (logs) của một container cụ thể |
| pause | Tạm dừng tất cả các tiến trình bên trong một hoặc nhiều container |
| port | Liệt kê hoặc định vị các cổng mạng được ánh xạ của container |
| ps | Liệt kê danh sách các container đang hoạt động |
| pull | Tải một image hoặc kho lưu trữ từ Docker registry về máy chủ |
| push | Đẩy một image hoặc kho lưu trữ từ máy chủ lên Docker registry |
| rename | Đổi tên một container hiện có |
| restart | Khởi động lại một hoặc nhiều container |
| rm | Xóa bỏ một hoặc nhiều container |
| rmi | Xóa bỏ một hoặc nhiều image |
| run | Khởi chạy một câu lệnh bên trong một container mới được tạo |
| save | Lưu một hoặc nhiều image thành một tệp tin tar |
| search | Tìm kiếm các image có sẵn trên kho ứng dụng Docker Hub |
| start | Khởi động một hoặc nhiều container đã bị dừng trước đó |
| stats | Hiển thị số liệu thống kê thời gian thực về tài nguyên phần cứng sử dụng |
| stop | Dừng một hoặc nhiều container đang hoạt động |
| tag | Gán thẻ (tag) cho một image nguồn để dễ dàng quản lý phiên bản |
| top | Hiển thị các tiến trình đang chạy bên trong một container |
| unpause | Khôi phục các tiến trình đang bị tạm ngưng bên trong container |
| update | Cập nhật cấu hình hoạt động của một hoặc nhiều container |
| version | Hiển thị thông tin phiên bản Docker đang cài đặt trên máy |
| wait | Chặn tiến trình cho đến khi container dừng hẳn và in ra mã thoát của nó |
Để tìm hiểu chi tiết các tùy chọn và cách sử dụng của một lệnh cụ thể, bạn có thể sử dụng cú pháp trợ giúp:
docker docker-subcommand --help
Để kiểm tra thông tin cấu hình toàn diện của hệ thống Docker trên máy chủ, hãy dùng lệnh:
docker info
Tiếp theo, chúng ta sẽ bắt đầu thực hành thao tác trực tiếp với các Image.
Bước 4 — Làm việc với Docker Image
Docker container được khởi tạo dựa trên nền tảng của các Docker image. Mặc định, Docker sẽ tìm kiếm và tải các image này từ Docker Hub, một kho lưu trữ chính thức do chính hãng quản lý. Hầu hết các ứng dụng phổ biến và các bản phân phối Linux thông dụng đều có các image được duy trì tại đây.
Để kiểm tra xem máy chủ của bạn có thể kết nối ổn định và tải các image từ Docker Hub hay không, hãy chạy thử lệnh sau:
docker run hello-world
Kết quả trả về hiển thị Docker đang hoạt động tốt:
OutputUnable 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 bản sao cục bộ của image hello-world trên máy chủ của bạn, do đó nó đã tự động tải dữ liệu từ Docker Hub xuống. Sau khi tải thành công, Docker khởi tạo container từ image này và chạy ứng dụng bên trong để in ra thông điệp chào mừng trên màn hình.
Bạn có thể tìm kiếm các ứng dụng hoặc hệ điều hành khác trên Docker Hub bằng lệnh search. Ví dụ, để tìm kiếm hệ điều hành Ubuntu, hãy gõ:
docker search ubuntu
Hệ thống sẽ quét kho chứa trực tuyến và hiển thị danh sách các kết quả phù hợp:
Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
--------------------------------------------------------------------------------------------------------------
ubuntu Ubuntu is a Debian-based Linux operating system... 10908 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface... 428 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of official... 244 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC sessions... 218 [OK]
ubuntu-upstart Upstart is an event-based replacement for the... 108 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with Ansible pre-installed... -
Tại cột OFFICIAL, trạng thái OK xác nhận đây là phiên bản chính thức được xây dựng và hỗ trợ bởi đơn vị phát triển dự án. Khi bạn đã tìm thấy bản phân phối mong muốn, bạn có thể tải nó về máy chủ của mình bằng lệnh pull.
Hãy tải bản cài đặt chính thức của ubuntu về máy:
docker pull ubuntu
Quá trình tải xuống sẽ diễn ra như sau:
OutputUsing default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
Sau khi một image được lưu trữ cục bộ, bạn có thể khởi chạy một container từ nó bằng lệnh run.
Để kiểm tra danh sách tất cả các image hiện có trên máy chủ của bạn, hãy sử dụng câu lệnh:
docker images
Kết quả hiển thị tương tự:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
Bước 5 — Khởi chạy một Docker Container
Container hello-world mà chúng ta chạy ở bước trước là một ví dụ về một container ngắn hạn – nó tự động dừng sau khi in thông điệp. Trong thực tế, container có thể chạy liên tục và cung cấp giao diện tương tác tương tự như một máy ảo thực thụ nhưng tốn cực kỳ ít tài nguyên.
Hãy thử chạy một container tương tác bằng hệ điều hành Ubuntu vừa tải xuống. Việc kết hợp hai tham số -i (interactive) và -t (tty) sẽ cung cấp cho bạn một giao diện shell tương tác trực tiếp bên trong container:
docker run -it ubuntu
Dòng nhắc lệnh (prompt) trên terminal của bạn sẽ thay đổi, phản ánh việc bạn đang đứng bên trong môi trường cô lập của container:
Outputroot@d9b100f2f636:/#
Hãy chú ý đến ID của container hiển thị ngay trên dòng nhắc (ở ví dụ này là d9b100f2f636). Bạn sẽ cần chuỗi ID này khi muốn dừng hoặc gỡ bỏ container này sau này.
Giờ đây, bạn có thể chạy bất kỳ dòng lệnh Linux nào bên trong container này. Ví dụ, cập nhật cơ sở dữ liệu gói ứng dụng của container. Lưu ý rằng bạn không cần sử dụng sudo vì bạn đã đăng nhập với tư cách quyền tối cao root bên trong môi trường này:
apt update
Tiếp tục cài đặt một ứng dụng thực tế, ví dụ như Node.js:
apt install nodejs
Sau khi quá trình hoàn tất, bạn có thể kiểm tra phiên bản Node.js vừa được cài đặt để xác thực:
node -v
Hệ thống sẽ trả về phiên bản của Node.js:
Outputv10.19.0
Lưu ý quan trọng: Bất kỳ thay đổi cấu hình hay cài đặt phần mềm nào bạn thực hiện tại đây đều chỉ có hiệu lực bên trong container riêng biệt này.
Để thoát khỏi container này và quay lại hệ điều hành của máy chủ gốc, bạn chỉ cần gõ:
exit
Bước 6 — Quản lý các Docker Container
Sau một thời gian làm việc với Docker, bạn sẽ có rất nhiều container ở trạng thái đang hoạt động hoặc đã dừng trên hệ thống. Để xem các container đang chạy, hãy sử dụng lệnh:
docker ps
Bạn sẽ thấy màn hình hiển thị tương tự:
OutputCONTAINER ID IMAGE COMMAND CREATED
Trong ví dụ trước, hai container của chúng ta (hello-world và ubuntu) đều đã kết thúc hoạt động sau khi chúng ta thoát ra, vì thế danh sách container đang chạy sẽ trống.
Để hiển thị tất cả các container hiện hữu trên hệ thống (bao gồm cả những container đã dừng), hãy sử dụng thêm tham số -a:
docker ps -a
Hệ thống sẽ trả về danh sách chi tiết:
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 nhanh container được tạo gần đây nhất, hãy sử dụng tham số -l:
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
Để khởi động lại một container đã dừng trước đó, hãy sử dụng lệnh docker start đi kèm với ID hoặc tên của container. Hãy thử khởi chạy lại container Ubuntu của chúng ta (với ID ví dụ là 1c08a7a0d0e4):
docker start 1c08a7a0d0e4
Sau khi khởi chạy, bạn dùng lệnh docker ps để xác minh trạng thái hoạt động:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty
Để dừng một container đang chạy, hãy sử dụng lệnh docker stop. Lần này chúng ta sẽ dùng tên gọi ngẫu nhiên được Docker tự động gán cho container (trong ví dụ này là quizzical_mcnulty):
docker stop quizzical_mcnulty
Khi bạn chắc chắn không còn nhu cầu sử dụng một container nào đó nữa, hãy giải phóng tài nguyên hệ thống bằng cách xóa bỏ nó qua câu lệnh docker rm:
docker rm youthful_curie
Bước 7 — Lưu thay đổi từ Container thành Docker Image
Khi bạn khởi chạy một image, mọi thao tác tạo mới, sửa đổi hoặc xóa tệp tin chỉ ảnh hưởng tới container đó. Nếu bạn xóa bỏ container bằng lệnh docker rm, toàn bộ các dữ liệu thay đổi này sẽ bị mất vĩnh viễn.
Phần này sẽ hướng dẫn bạn cách lưu lại toàn bộ trạng thái hiện tại của một container để đóng gói thành một Docker image mới có thể tái sử dụng.
Sau khi đã cài đặt Node.js vào container Ubuntu ở Bước 5, container này đã khác biệt so với image gốc được tải xuống từ Docker Hub. Để lưu giữ trạng thái này để sử dụng làm nền tảng cho các dự án sau này, bạn hãy thực thi lệnh commit với cú pháp sau:
docker commit -m "Nội dung mô tả thay đổi" -a "Tên Tác Giả" container_id username/ten_image_moi
- Tham số -m dùng để ghi lại thông điệp mô tả những cải tiến bạn đã thực hiện.
- Tham số -a dùng để chỉ định thông tin người thực hiện.
- Đối số
container_idlà mã ID bạn đã ghi nhận khi hoạt động trong container. - Phần
usernamethường trùng khớp với tên tài khoản của bạn trên hệ thống Docker Hub.
Ví dụ, đối với tài khoản người dùng interdata-user và container có ID là d9b100f2f636, lệnh thực thi sẽ là:
docker commit -m "added Node.js" -a "interdata-user" d9b100f2f636 interdata-user/ubuntu-nodejs
Sau khi thực hiện lưu (commit), bản sao của image mới sẽ được lưu cục bộ trên máy chủ của bạn.
Kiểm tra lại danh sách các image hiện có trên máy để thấy sự thay đổi:
docker images
Kết quả trả về:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
interdata-user/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...
Trong ví dụ này, ubuntu-nodejs là image mới được kế thừa từ image ubuntu gốc. Dung lượng tăng thêm phản ánh kích thước của ứng dụng Node.js đã được cài đặt thành công. Từ giờ trở đi, bất cứ khi nào cần một môi trường Ubuntu có sẵn Node.js, bạn chỉ cần khởi chạy trực tiếp từ image này.
Bước 8 — Đẩy (Push) Docker Image lên Docker Hub
Để chia sẻ sản phẩm hoàn thiện của bạn cho cộng đồng, đồng nghiệp hoặc phân phối sang các máy chủ khác, bạn có thể đẩy image của mình lên một Docker registry như Docker Hub.
Trước tiên, hãy đăng nhập vào hệ thống Docker Hub ngay trên giao diện dòng lệnh của máy chủ:
docker login -u docker-registry-username
Hệ thống sẽ yêu cầu bạn nhập mật khẩu tài khoản Docker Hub để hoàn tất xác thực.
Lưu ý: Nếu tên người dùng cục bộ của bạn khác với tên tài khoản trên Docker Hub, bạn cần gán lại nhãn (tag) cho image của mình khớp với tên đăng nhập thực tế:
docker tag interdata-user/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Sau đó, tiến hành đẩy image lên kho lưu trữ bằng câu lệnh:
docker push docker-registry-username/ubuntu-nodejs
Ví dụ, để đẩy image lên tài khoản interdata-user, bạn thực thi:
docker push interdata-user/ubuntu-nodejs
Quá trình tải dữ liệu lên mạng Internet có thể mất một vài phút tùy thuộc vào dung lượng tệp tin và băng thông kết nối của máy chủ:
OutputThe push refers to a repository [docker.io/interdata-user/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
Sau khi hoàn tất, bạn có thể đăng nhập vào trang quản trị của Docker Hub trên trình duyệt để kiểm tra sản phẩm của mình đã xuất hiện trên trang Dashboard cá nhân.
So sánh Docker và Docker Compose
Docker là công cụ cơ bản để khởi chạy và điều phối các container đơn lẻ. Tuy nhiên, khi hệ thống của bạn phát triển phức tạp hơn với mô hình đa dịch vụ (ví dụ: cần chạy song song Web Server, Database, và Redis Cache), việc thiết lập thủ công từng container bằng Docker CLI sẽ trở nên rất phức tạp. Đó là lúc chúng ta cần đến Docker Compose.
Docker Compose cho phép bạn định nghĩa cấu hình của một cụm nhiều container có mối liên hệ mật thiết với nhau chỉ trong một tệp cấu hình duy nhất viết bằng định dạng YAML (thường đặt tên là docker-compose.yml).
Thay vì chạy hàng loạt câu lệnh dài dòng, bạn chỉ cần một câu lệnh duy nhất để khởi động toàn bộ hệ thống:
docker compose up
(Lưu ý: Với các phiên bản Docker đời mới, bạn nên viết lệnh dạng docker compose thay vì dạng có dấu gạch ngang cũ docker-compose để tận dụng hiệu năng và các tính năng tối ưu nhất).
| Tiêu chí so sánh | Docker CLI | Docker Compose |
|---|---|---|
| Phạm vi tác động | Thao tác trên từng container riêng lẻ | Điều phối toàn bộ cụm đa container |
| Phương thức cấu hình | Thực thi trực tiếp bằng các câu lệnh dòng lệnh (CLI) | Khai báo qua tệp cấu hình YAML (docker-compose.yml) |
| Quản lý liên kết | Phải cấu hình liên kết mạng thủ công | Tự động thiết lập cấu hình và liên kết các dịch vụ |
| Môi trường phù hợp | Thử nghiệm, chạy các tiện ích đơn lẻ | Phát triển cục bộ, staging và các dịch vụ liên kết |
Khắc phục một số lỗi thường gặp khi cài đặt Docker
Lỗi: docker: command not found
- Nguyên nhân: Công cụ dòng lệnh Docker chưa được tích hợp vào biến môi trường hệ thống hoặc chưa được cài đặt thành công.
- Cách xử lý: Thực hiện cài đặt lại bằng lệnh:
sudo apt install docker-ce docker-ce-cli containerd.io
Lỗi: Cannot connect to the Docker daemon
- Nguyên nhân: Dịch vụ Docker chạy ngầm chưa khởi động, hoặc tài khoản người dùng của bạn chưa được cấp quyền truy cập (chưa thuộc nhóm
docker). - Cách xử lý: Khởi chạy lại dịch vụ và gán quyền nhóm cho tài khoản:
sudo systemctl start docker
sudo usermod -aG docker $USER
Sau đó, tiến hành đăng xuất và đăng nhập lại hệ thống để cập nhật quyền.
Lỗi liên quan đến Khóa GPG hoặc lỗi cập nhật Repository
- Nguyên nhân: Có thể do cấu hình mạng máy chủ chặn kết nối hoặc khóa cũ đã lỗi thời.
- Cách xử lý: Xác thực lại các bước tạo thư mục và gán quyền trong cấu hình
/etc/apt/keyringsđược đề cập ở Bước 1.
Sử dụng Docker Desktop trên Ubuntu
Docker Desktop hiện đã hỗ trợ cài đặt trên hệ điều hành Linux (phiên bản Ubuntu). Công cụ này cung cấp giao diện đồ họa (GUI) trực quan giúp quản lý nhanh container, tài nguyên ổ đĩa, mạng cũng như tích hợp sẵn cụm phát triển Kubernetes thu nhỏ.
Để cài đặt gói Docker Desktop trên môi trường đồ họa của Ubuntu, bạn tải tệp .deb chính thức và chạy:
sudo apt install ./docker-desktop-<version>-<arch>.deb
Khuyến cáo: Docker Desktop chỉ thực sự phù hợp với các môi trường máy trạm cá nhân phục vụ lập trình viên thiết kế phần mềm. Đối với môi trường máy chủ sản xuất thực tế (Production), bạn nên ưu tiên cài đặt bản Docker Engine Community Edition (Docker CE) tối giản thông qua các dòng lệnh để đảm bảo tiết kiệm tài nguyên phần cứng tốt nhất.
Cài đặt Docker thông qua tệp Dockerfile
Nếu bạn muốn tạo dựng nhanh một môi trường có sẵn Docker phục vụ tự động hóa, bạn có thể tham khảo tệp cấu hình mẫu Dockerfile dưới đây:
FROM ubuntu:20.04
RUN apt-get update && \
apt-get install -y ca-certificates curl gnupg && \
install -m 0755 -d /etc/apt/keyrings && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \
chmod a+r /etc/apt/keyrings/docker.gpg && \
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" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && \
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Cách gỡ cài đặt hoàn toàn Docker khỏi Ubuntu
Khi cần dọn dẹp hệ thống hoặc cài đặt lại từ đầu, bạn có thể thực hiện gỡ cài đặt triệt để các gói và tệp dữ liệu của Docker theo các bước dưới đây:
sudo apt purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
Câu hỏi thường gặp (FAQs)
1. Cách cài đặt Docker tốt nhất trên Ubuntu là gì?
Sử dụng kho lưu trữ chính thức của Docker là phương án tối ưu nhất. Phương pháp này đảm bảo tính ổn định cao, nhận các bản vá bảo mật trực tiếp từ nhà phát hành và tương thích tốt với các phiên bản Ubuntu dài hạn (LTS).
2. Có bắt buộc dùng lệnh sudo để vận hành Docker?
Về mặt bảo mật cốt lõi, Docker yêu cầu quyền root để tương tác trực tiếp với nhân hệ điều hành. Tuy nhiên, bạn hoàn toàn có thể cấu hình tài khoản cá nhân của mình tham gia vào nhóm người dùng docker để lược bỏ yêu cầu nhập sudo khi vận hành thực tế.
3. Làm cách nào để xác thực Docker đang chạy ổn định?
Bạn có thể sử dụng câu lệnh hiển thị tổng thể hệ thống docker info để kiểm tra thông số chi tiết của dịch vụ hoặc chạy trực tiếp lệnh chạy thử nghiệm nhanh docker run hello-world.
4. Tôi có thể cài đặt chính xác một phiên bản Docker mong muốn không?
Hoàn toàn có thể. Hãy liệt kê danh sách các phiên bản có sẵn trong hệ thống lưu trữ bằng câu lệnh:
apt-cache madison docker-ce
Sau đó lựa chọn đúng phiên bản bạn cần và tiến hành cài đặt bằng cú pháp:
sudo apt install docker-ce=<MÃ_PHIÊN_BẢN>
5. Sự khác biệt mấu chốt giữa Docker và Docker Compose là gì?
Docker chịu trách nhiệm quản lý trực tiếp vòng đời của từng container đơn lẻ. Trong khi đó, Docker Compose đóng vai trò là kiến trúc sư giúp thiết lập mối quan hệ và vận hành đồng bộ một nhóm nhiều dịch vụ container có mối liên kết với nhau bằng cách sử dụng tệp cấu hình khai báo YAML.
6. Làm cách nào để xóa Docker khỏi hệ thống của mình?
Để gỡ cài đặt hoàn toàn Docker khỏi hệ thống Ubuntu của bạn, bạn cần xóa các gói Docker và xóa mọi dữ liệu liên quan. Bắt đầu bằng cách chạy:
sudo apt purge docker-ce docker-ce-cli containerd.io
Để dọn dẹp triệt để, hãy xóa các thư mục dữ liệu của Docker bằng:
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
Các thư mục này lưu trữ image, container, khối lượng và dữ liệu liên tục khác. Sau các bước này, Docker và tất cả dữ liệu của nó sẽ bị xóa khỏi hệ thống của bạn.
7. Docker Desktop có sẵn cho Ubuntu và tôi có nên sử dụng nó không?
Có, Docker Desktop hiện có sẵn ở dạng beta cho các bản phân phối Linux, bao gồm cả Ubuntu. Docker Desktop cung cấp giao diện người dùng đồ họa (GUI) để quản lý container, image, khối lượng và mạng, giúp người dùng không thích làm việc độc quyền với dòng lệnh dễ dàng hơn. Nó cũng đi kèm với Docker Engine và cung cấp hỗ trợ Kubernetes tích hợp.
Tuy nhiên, Docker Desktop chủ yếu dành cho môi trường phát triển và không được khuyên dùng cho máy chủ sản xuất (production). Đối với môi trường máy chủ, tốt hơn là sử dụng Docker Engine Community Edition (CE) qua dòng lệnh.
Lời kết
Việc làm chủ công nghệ Docker giúp bạn tối ưu hóa thời gian triển khai ứng dụng, đảm bảo tính đồng nhất giữa môi trường phát triển của lập trình viên và môi trường máy chủ thực tế.
