❤️ 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.

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