❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Bài 2, mình đã hướng dẫn bạn cài đặt Docker trên VPS thành công. Vậy giờ Docker đã sẵn sàng trên máy, bước tiếp theo là học cách sử dụng nó. Trong bài này, mình sẽ đi qua tất cả các lệnh Docker cơ bản mà bạn cần nắm vững, từ quản lý image, container cho đến thực hành chạy Nginx và MySQL ngay trên VPS.

Các lệnh Docker cơ bản
Minh họa: Các lệnh Docker cơ bản thường dùng

Nếu bạn chưa cài Docker, hãy quay lại Bài 2 để hoàn tất trước khi tiếp tục nhé.

Quản lý Docker Image

Image là “bản thiết kế” để tạo container. Trước khi chạy bất kỳ container nào, bạn cần có image tương ứng. Docker Hub (hub.docker.com) là kho image công cộng lớn nhất, chứa hàng ngàn image chính thức từ Nginx, MySQL, WordPress, Node.js, v.v.

docker search – Tìm image trên Docker Hub

Muốn tìm image mà không cần mở trình duyệt? Dùng docker search:

docker search nginx

Output sẽ hiển thị danh sách image liên quan:

NAME                        DESCRIPTION                                     STARS     OFFICIAL
nginx                       Official build of Nginx.                        20000     [OK]
bitnami/nginx               Bitnami container image for NGINX               200
linuxserver/nginx            An Nginx container...                           100

Cột OFFICIAL cho biết đây có phải image chính thức hay không. Mình khuyên bạn luôn ưu tiên dùng image chính thức (có đánh dấu [OK]) để đảm bảo an toàn và cập nhật thường xuyên.

docker pull – Tải image về máy

Khi đã biết tên image, bạn tải nó về bằng lệnh docker pull:

docker pull nginx

Mặc định, Docker sẽ tải tag latest (phiên bản mới nhất). Nếu muốn tải một phiên bản cụ thể, bạn chỉ định tag sau dấu hai chấm:

docker pull nginx:1.25
docker pull mysql:8.0

docker images – Liệt kê image đã tải

Xem tất cả image hiện có trên máy:

docker images

Output mẫu:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    a8758716bb6a   2 weeks ago    187MB
mysql        8.0       3218b38490ce   3 weeks ago    516MB

Các cột quan trọng:

  • REPOSITORY: Tên image
  • TAG: Phiên bản (latest, 1.25, 8.0,…)
  • IMAGE ID: Mã định danh duy nhất của image
  • SIZE: Dung lượng image trên ổ đĩa

docker rmi – Xoá image

Khi không cần một image nữa, bạn xoá nó để giải phóng dung lượng:

docker rmi nginx

Hoặc xoá bằng IMAGE ID:

docker rmi a8758716bb6a

Lưu ý: Bạn không thể xoá image đang được sử dụng bởi container (kể cả container đã stop). Phải xoá container trước, rồi mới xoá image.

Quản lý Docker Container

Container là “phiên bản đang chạy” của image. Một image có thể tạo ra nhiều container khác nhau. Đây là phần quan trọng nhất mà bạn cần nắm thật rõ.

docker run – Tạo và chạy container

Đây là lệnh bạn sẽ dùng nhiều nhất. Cú pháp cơ bản:

docker run [OPTIONS] IMAGE [COMMAND]

Ví dụ đơn giản nhất:

docker run nginx

Lệnh trên sẽ tạo một container từ image nginx và chạy nó. Tuy nhiên, trong thực tế bạn sẽ cần thêm nhiều flag để kiểm soát container tốt hơn. Dưới đây là các flag quan trọng:

-d (detach), Chạy container ở chế độ nền

docker run -d nginx

Không có -d, container sẽ chiếm terminal của bạn và hiển thị log trực tiếp. Thêm -d để container chạy ngầm, trả lại terminal cho bạn.

-p (publish), Map port từ host vào container

docker run -d -p 8080:80 nginx

Cú pháp: -p <port_host>:<port_container>. Ví dụ trên map port 8080 trên VPS vào port 80 trong container. Khi truy cập http://IP_VPS:8080 sẽ được chuyển vào container.

--name: Đặt tên cho container

docker run -d --name my-nginx -p 8080:80 nginx

Nếu không đặt tên, Docker sẽ tự sinh tên ngẫu nhiên (kiểu hopeful_darwin). Đặt tên giúp bạn dễ quản lý hơn nhiều.

-e (environment), Truyền biến môi trường vào container

docker run -d --name my-mysql -e MYSQL_ROOT_PASSWORD=secret123 mysql:8.0

Nhiều image yêu cầu biến môi trường để cấu hình (như MySQL cần password root). Bạn có thể dùng nhiều -e trong cùng một lệnh.

--rm: Tự động xoá container khi dừng

docker run --rm nginx echo "Hello Docker"

Flag này hữu ích khi bạn chỉ muốn chạy nhanh một lệnh rồi dọn dẹp, không cần giữ lại container.

docker ps – Xem container đang chạy

Xem danh sách container đang hoạt động:

docker ps

Output mẫu:

CONTAINER ID   IMAGE   COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx   "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8080->80/tcp   my-nginx

Muốn xem tất cả container (kể cả đã dừng), thêm flag -a:

docker ps -a

docker stop / start / restart – Điều khiển container

Dừng container đang chạy:

docker stop my-nginx

Khởi động lại container đã dừng:

docker start my-nginx

Restart container (dừng rồi khởi động lại):

docker restart my-nginx

Bạn có thể dùng tên container hoặc CONTAINER ID cho tất cả các lệnh trên.

docker rm – Xoá container

Xoá container đã dừng:

docker rm my-nginx

Nếu container đang chạy mà muốn xoá luôn, thêm flag -f (force):

docker rm -f my-nginx

Xoá tất cả container đã dừng cùng lúc:

docker container prune

docker logs – Xem log container

Xem log của container (rất hữu ích khi debug):

docker logs my-nginx

Theo dõi log realtime (giống tail -f):

docker logs -f my-nginx

Xem 50 dòng log cuối:

docker logs --tail 50 my-nginx

docker exec – Chạy lệnh trong container đang chạy

Đây là lệnh “chui vào” container để thao tác trực tiếp. Cách dùng phổ biến nhất là mở shell bên trong container:

docker exec -it my-nginx bash

Giải thích các flag:

  • -i (interactive): Giữ STDIN mở để bạn có thể nhập lệnh
  • -t (tty): Cấp phát pseudo-terminal, giúp hiển thị đúng định dạng
  • bash: Shell muốn mở (một số image nhẹ chỉ có sh)

Bạn cũng có thể chạy một lệnh đơn lẻ mà không cần mở shell:

docker exec my-nginx cat /etc/nginx/nginx.conf

Để thoát khỏi shell trong container, gõ exit hoặc nhấn Ctrl + D.

docker inspect – Xem chi tiết container

Muốn xem toàn bộ thông tin cấu hình của container (IP nội bộ, biến môi trường, mount, network,…):

docker inspect my-nginx

Output là JSON rất dài. Bạn có thể lọc thông tin cụ thể bằng flag --format. Ví dụ lấy IP của container:

docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx

Thực hành: Chạy Nginx Container

Lý thuyết đủ rồi, giờ mình thực hành luôn. Mình sẽ chạy một web server Nginx bằng Docker từ đầu đến cuối.

Bước 1: Pull image Nginx

docker pull nginx

Output:

Using default tag: latest
latest: Pulling from library/nginx
...
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

Bước 2: Chạy container Nginx

docker run -d --name web-nginx -p 8080:80 nginx

Giải thích:

  • -d: Chạy ngầm
  • --name web-nginx: Đặt tên container là web-nginx
  • -p 8080:80: Map port 8080 trên VPS → port 80 trong container
  • nginx: Image sử dụng

Kiểm tra container đã chạy chưa:

docker ps

Bước 3: Truy cập web

Mở trình duyệt và truy cập http://IP_VPS:8080. Bạn sẽ thấy trang Welcome mặc định của Nginx.

Hoặc test nhanh bằng curl ngay trên VPS:

curl http://localhost:8080

Nếu thấy đoạn HTML chứa “Welcome to nginx!” là thành công.

Bước 4: Xem logs và exec vào container

Xem log access của Nginx:

docker logs web-nginx

Bạn sẽ thấy dòng log ghi lại request vừa curl ở bước trên.

Exec vào container để khám phá bên trong:

docker exec -it web-nginx bash

Bên trong container, thử xem file cấu hình Nginx:

cat /etc/nginx/conf.d/default.conf

Xem nội dung trang web mặc định:

cat /usr/share/nginx/html/index.html

exit để thoát khỏi container.

Bước 5: Stop, start và xoá container

# Dừng container
docker stop web-nginx

# Kiểm tra — container không còn trong danh sách đang chạy docker ps

# Nhưng vẫn tồn tại (status: Exited) docker ps -a

# Khởi động lại docker start web-nginx

# Xoá hẳn (dừng trước nếu đang chạy) docker stop web-nginx docker rm web-nginx

Thực hành: Chạy MySQL Container

Tiếp theo, mình sẽ chạy MySQL, một ứng dụng cần cấu hình biến môi trường khi khởi tạo.

Bước 1: Chạy MySQL container

docker run -d \
  --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=MyStr0ngP@ss \
  -p 3306:3306 \
  mysql:8.0

Giải thích:

  • -d: Chạy ngầm
  • --name my-mysql: Đặt tên container
  • -e MYSQL_ROOT_PASSWORD=MyStr0ngP@ss: Đặt mật khẩu root cho MySQL (bắt buộc)
  • -p 3306:3306: Map port MySQL ra ngoài VPS
  • mysql:8.0: Dùng image MySQL phiên bản 8.0

Đợi khoảng 10–15 giây để MySQL khởi tạo xong. Kiểm tra log:

docker logs my-mysql

Khi thấy dòng ready for connections là MySQL đã sẵn sàng.

Bước 2: Kết nối vào MySQL

Exec vào container và mở MySQL client:

docker exec -it my-mysql mysql -u root -p

Nhập mật khẩu MyStr0ngP@ss khi được hỏi. Bạn sẽ vào MySQL shell:

Welcome to the MySQL monitor.  Commands end with ; or \g.
...
mysql>

Bước 3: Tạo database test

Trong MySQL shell, thử tạo một database:

CREATE DATABASE docker_test;
SHOW DATABASES;
USE docker_test;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100));
INSERT INTO users (name) VALUES ('Thach'), ('Docker Fan');
SELECT * FROM users;

Output:

+----+------------+
| id | name       |
+----+------------+
|  1 | Thach      |
|  2 | Docker Fan |
+----+------------+
2 rows in set (0.00 sec)

exit để thoát MySQL shell.

Dọn dẹp khi đã xong:

docker stop my-mysql
docker rm my-mysql

Lưu ý quan trọng: Khi xoá container MySQL, toàn bộ dữ liệu bên trong cũng bị mất. Để giữ dữ liệu, bạn cần dùng volume: mình sẽ hướng dẫn ở các bài sau.

Mẹo và Best Practices khi dùng Docker CLI

Sau khi đã nắm được các lệnh cơ bản, đây là một số mẹo giúp bạn làm việc với Docker hiệu quả hơn:

1. Luôn đặt tên cho container

Dùng --name thay vì để Docker tự sinh tên ngẫu nhiên. Khi bạn có 5–10 container chạy cùng lúc, tên có ý nghĩa sẽ giúp quản lý dễ hơn rất nhiều.

2. Dọn dẹp tài nguyên thường xuyên

# Xoá tất cả container đã dừng
docker container prune

# Xoá image không dùng đến docker image prune

# Xoá toàn bộ tài nguyên không dùng (container, image, network, cache) docker system prune

3. Dùng tag cụ thể thay vì latest

Trong môi trường production, hãy chỉ định version rõ ràng (nginx:1.25, mysql:8.0) thay vì dùng latest. Lý do: latest có thể thay đổi bất kỳ lúc nào và gây lỗi không mong muốn.

4. Kiểm tra log khi gặp lỗi

Container không chạy được? Bước đầu tiên luôn là docker logs <container>. 90% vấn đề sẽ hiện rõ trong log.

5. Dùng --rm cho container tạm

Khi test nhanh hoặc chạy lệnh một lần, thêm --rm để container tự xoá sau khi dừng. Tránh tình trạng hàng chục container “chết” nằm lại trên hệ thống.

6. Cẩn thận với -p trên VPS public

Khi map port, port đó sẽ mở ra internet. Chỉ map những port cần thiết và đảm bảo firewall được cấu hình đúng. Đặc biệt cẩn thận với các service như MySQL, không nên expose port 3306 ra ngoài trừ khi thật sự cần.

📚 Serie Docker từ A đến Z

  1. Bài 1: Docker là gì? Tại sao nên dùng Docker trên VPS
  2. Bài 2: Cài đặt Docker và Docker Compose trên VPS Ubuntu
  3. Bài 3: Làm quen với Docker – Các lệnh cơ bản cần biết (đang đọc)
  4. Bài 4: Docker Image & Dockerfile – Tự tạo Image riêng
  5. Bài 5: Docker Volume & Network – Quản lý dữ liệu và mạng
  6. Bài 6: Docker Compose là gì? Cài đặt và cú pháp cơ bản
  7. Bài 7: Deploy WordPress + MySQL + phpMyAdmin bằng Docker Compose
  8. Bài 8: Deploy LEMP Stack (Nginx + PHP-FPM + MariaDB) bằng Docker Compose
  9. Bài 9: Biến môi trường & file .env trong Docker Compose
  10. Bài 10: Reverse Proxy với Nginx Proxy Manager + SSL tự động
  11. Bài 11: Deploy ứng dụng Node.js / Python với Docker Compose
  12. Bài 12: Backup & Restore dữ liệu Docker Volume
  13. Bài 13: Monitoring Docker với Portainer, Uptime Kuma và cAdvisor
  14. Bài 14: Docker Logging – Quản lý log hiệu quả
  15. Bài 15: Bảo mật Docker trên VPS
  16. Bài 16: CI/CD đơn giản – Auto deploy với Webhook + Docker Compose
  17. Bài 17: Docker Compose trong thực tế – Tổng hợp project mẫu

Tổng kết

Trong bài này, bạn đã học được:

  • Quản lý image: search, pull, images, rmi
  • Quản lý container: run, ps, stop, start, restart, rm, logs, exec, inspect
  • Thực hành: Chạy thành công Nginx và MySQL trên Docker
  • Best practices: Đặt tên container, dọn dẹp, dùng tag cụ thể, kiểm tra log

Đến đây, bạn đã biết cách sử dụng Docker ở mức cơ bản, tải image, chạy container, quản lý và debug. Tuy nhiên, tất cả những gì mình làm đều dùng image có sẵn trên Docker Hub.

Vậy nếu muốn đóng gói ứng dụng riêng thành Docker image thì sao? Đó chính là nội dung của Bài 4: Viết Dockerfile, Tự tạo Docker Image. Mình sẽ hướng dẫn bạn viết Dockerfile từ đầu, hiểu từng instruction, và build image đầu tiên của riêng bạn. Hẹn gặp ở bài tiếp theo!

👈 Bài trước: Cài đặt Docker và Docker Compose trên VPS Ubuntu

👉 Bài tiếp: Docker Image & Dockerfile – Tự tạo Image riêng

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Thạch Phạm

Thạch Phạm

Đồng sáng lập và Giám đốc điều hành của AZDIGI. Có hơn 15 năm kinh nghiệm trong phổ biến kiến thức liên quan đến WordPress tại thachpham.com, phát triển website và phát triển hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI