Đang tải bài viết Tianwu đang chở nội dung tới, chậm mà chắc…
Shanverse Nơi học hỏi, xây dựng và chia sẻ kiến thức về phát triển phần mềm.
© 2026 Shanverse. Đã đăng ký mọi quyền.
Được xây dựng với Next.js và Notion.
Các lệnh Docker CLI cơ bản phải biết: run, ps, exec, stop, rm và logs | Shanverse
⌨️
Note
Chỉ với sáu lệnh run , ps , exec , stop , rm và logs , bạn đã có thể xử lý phần lớn vòng đời Container trong môi trường development: tạo, quan sát, truy cập, chẩn đoán, dừng và dọn dẹp.
Bức tranh tổng thể Mermaid Image là template bất biến. Container là instance được tạo từ Image, có lifecycle và writable layer riêng.
Tác giả
Shanverse Software engineer sharing practical notes about building products and systems.
docker run tạo Container mới; nó không chỉ “chạy lại” một Container cũ. Với Container đã dừng, dùng docker start <name> .
1. docker run : tạo và khởi động Container Nếu Image chưa có trên máy, Docker pull Image rồi:
Tạo Container. Tạo writable layer. Thiết lập network và mounts. Khởi động process chính. Attach terminal vào output nếu không chạy detached.
Chạy nền với -d Docker trả về Container ID và process tiếp tục chạy nền.
Đặt tên với --name Tên Container phải duy nhất trên Docker host. Nếu gặp lỗi tên đã tồn tại, kiểm tra cả Container đã dừng:
Publish port với -p Truy cập http://localhost:8080 .
Để Docker chọn host port động:
Không publish port không có nghĩa Container không có network; nó chỉ chưa expose port đó ra host theo mapping này.
Environment variables 🔐
Warning
Không truyền password/token nhạy cảm trực tiếp trên command line trong production. Chúng có thể xuất hiện trong shell history, process metadata hoặc Container configuration. Dùng secret manager phù hợp và giới hạn quyền truy cập.
Mount Volume Named Volume tồn tại độc lập với lifecycle của Container và phù hợp hơn writable layer cho dữ liệu cần lưu lâu dài.
Bind mount cho development:
Interactive terminal với -it -i : giữ STDIN mở. -t : cấp pseudo-TTY. --rm : tự xóa Container khi process kết thúc. --rm phù hợp cho job tạm, thử lệnh và test. Không dùng nếu cần giữ Container lại để điều tra filesystem sau khi process kết thúc.
Resource limits Đặt giới hạn giúp tránh một Container dùng hết tài nguyên host, nhưng cần đo workload thay vì chọn số tùy ý.
Restart policy Các policy phổ biến: no , on-failure , always , unless-stopped . Restart policy không thay thế health check, orchestration hoặc alerting.
2. docker ps : xem Container Tất cả Container, gồm cả đã dừng:
CONTAINER ID : ID rút gọn. IMAGE : Image được dùng. COMMAND : process chính. CREATED : thời điểm tạo. STATUS : running, exited, restarting hoặc health state. PORTS : port mapping. NAMES : tên Container.
Chỉ hiển thị ID Hữu ích cho scripting, nhưng luôn kiểm tra danh sách trước khi đưa vào lệnh xóa hàng loạt.
Filter
Xem kích thước writable layer Nếu writable layer tăng nhanh, kiểm tra log/file tạm và chuyển dữ liệu cần persistence sang Volume hoặc storage phù hợp.
3. docker exec : chạy lệnh trong Container đang chạy Minimal Image có thể không chứa bash , thậm chí không có shell. Khi đó hãy chạy binary có sẵn hoặc dùng debug workflow/tool phù hợp.
Chạy một lệnh
Chạy với user và working directory
Đặt environment cho process mới Biến này chỉ áp dụng cho process do exec tạo, không thay đổi environment của process chính.
⚠️
Warning
docker exec chỉ hoạt động khi Container đang chạy. Các thay đổi thủ công bằng exec nằm trong writable layer, không cập nhật Image và sẽ mất khi Container bị thay thế. Hãy sửa source/Dockerfile rồi build Image mới.
Không dùng exec như cách triển khai code hoặc cấu hình lâu dài trên production.
4. docker logs : đọc output của Container Lệnh này đọc log mà Container ghi ra STDOUT/STDERR , tùy khả năng của logging driver. Nó không tự động đọc mọi file log nằm trong Container.
Theo dõi realtime Thoát chế độ follow bằng Ctrl+C ; thao tác này không dừng Container.
Chỉ lấy dòng gần nhất
Log theo thời gian
Thêm timestamp
Kết hợp khi debug Kiểm tra Container có chạy không: docker ps -a . Kiểm tra process có ghi STDOUT/STDERR không. Kiểm tra logging driver và rotation policy. Kiểm tra application có ghi vào file riêng không. Xem exit code bằng docker inspect nếu process đã dừng. Production cần log rotation hoặc nền tảng log tập trung để tránh đầy disk.
5. docker stop : dừng Container an toàn Gửi signal dừng, mặc định thường là SIGTERM , tới process chính. Chờ grace period. Gửi SIGKILL nếu process chưa thoát. Application nên xử lý graceful shutdown:
Ngừng nhận request mới. Hoàn tất request đang chạy trong giới hạn thời gian. Đóng database/message broker connection. Flush buffer cần thiết. Thoát với exit code phù hợp. docker kill dừng mạnh hoặc gửi signal cụ thể và không phải lựa chọn mặc định cho shutdown thông thường.
stop không xóa Container. Bạn vẫn thấy nó bằng:
6. docker rm : xóa Container Nếu Container đang chạy, Docker từ chối. Quy trình an toàn:
Force remove -f dừng mạnh và xóa; chỉ dùng khi hiểu tác động tới process và dữ liệu đang ghi.
Xóa nhiều Container đã dừng Xóa toàn bộ stopped Containers:
Đọc danh sách/xác nhận trước khi dọn trên môi trường quan trọng.
Anonymous Volume -v có thể xóa anonymous volumes gắn với Container; named volumes không tự động bị xóa theo cách tương tự. Luôn kiểm tra:
Xóa Container không xóa Image:
Workflow debug thực tế Giả sử API không truy cập được:
Không sửa production Container rồi coi đó là bản fix. Container thay thế phải được tạo từ Image và configuration có thể tái hiện.
Các lỗi thường gặp
“Container name is already in use” Hoặc chọn tên mới nếu Container cũ vẫn cần giữ.
“Port is already allocated” Dừng workload chiếm port hoặc chọn host port khác:
Container thoát ngay sau run Container tồn tại khi process chính còn chạy. Kiểm tra:
Không giữ Container sống bằng một shell giả nếu application process đang lỗi; hãy sửa command/config.
exec: "bash": executable file not found Nếu Image không có shell, dùng binary có sẵn hoặc debug Image/tool chuyên dụng.
logs không hiển thị application log Application có thể đang ghi file. Với Container, ưu tiên cấu hình log ra STDOUT/STDERR rồi thu thập bằng logging platform.
Cheat sheet
Bài tập 5 phút
Tổng kết docker run : tạo và start Container mới từ Image. docker ps : quan sát trạng thái và port mapping. docker exec : chạy process bổ sung trong Container đang chạy. docker logs : đọc STDOUT/STDERR qua logging driver. docker stop : graceful shutdown trước khi buộc dừng. docker rm : xóa Container, không tự xóa Image. ✅
Note
Quy trình nên thành phản xạ: run để tạo → ps để quan sát → logs để chẩn đoán → exec khi cần kiểm tra sâu → stop để dừng an toàn → rm để dọn Container.
Code plain text
Copy1 Host port 8080 → Container port 80 Code bash
Copy1 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Code bash
Copy1 docker run nginx:1.27-alpine Code bash
Copy1 docker run -d nginx:1.27-alpine Code bash
Copy1 docker run -d --name web nginx:1.27-alpine Code bash
Copy1 docker logs web 2 docker stop web Code bash
Copy1 docker ps -a --filter name=web Code bash
Copy1 docker run -d --name web -p 8080:80 nginx:1.27-alpine Code bash
Copy1 docker run -d -p 80 nginx:1.27-alpine 2 docker ps Code bash
Copy1 docker run -d \ 2 --name api \ 3 -e NODE_ENV=production \ 4 -e PORT= 3000 \ 5 demo-api:1.0 Code bash
Copy1 docker run --env-file .env demo-api:1.0 Code bash
Copy1 docker run -d \ 2 --name db \ 3 -v postgres-data:/var/lib/postgresql/data \ 4 postgres:17 Code bash
Copy1 docker run --rm -it \ 2 -v " $PWD ":/app \ 3 -w /app \ 4 node:22-alpine npm test Code bash
Copy1 docker run --rm -it alpine:3.20 sh Code bash
Copy1 docker run -d \ 2 --name worker \ 3 --memory 512m \ 4 --cpus 1.0 \ 5 demo-worker:1.0 Code bash
Copy1 docker run -d \ 2 --name api \ 3 --restart unless-stopped \ 4 demo-api:1.0 Code bash
Copy1 docker ps -q 2 docker ps -aq Code bash
Copy1 docker ps --filter status=running 2 docker ps -a --filter status=exited 3 docker ps --filter name=api 4 docker ps --filter ancestor=nginx:1.27-alpine 5 docker ps --filter label=app=payments Code bash
Copy1 docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}' Code bash
Copy1 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Code bash
Copy1 docker exec -it app bash Code bash
Copy1 docker exec web nginx -t 2 docker exec api node --version 3 docker exec db pg_isready Code bash
Copy1 docker exec -u node -w /app api npm run healthcheck Code bash
Copy1 docker exec -e DEBUG= true api node scripts/check.js Code bash
Copy1 docker logs --tail 100 web Code bash
Copy1 docker logs --since 10m web 2 docker logs --since '2026-08-19T14:00:00+07:00' web 3 docker logs --until 30m web Code bash
Copy1 docker logs -t --tail 100 web Code bash
Copy1 docker logs -f --tail 200 api Code bash
Copy1 docker stop web api worker Code bash
Copy1 docker stop web 2 docker rm web Code bash
Copy1 docker rm web api worker Code bash
Copy1 docker volume ls 2 docker volume inspect < volume-nam e > Code bash
Copy1 # 1. Tìm Container và trạng thái 2 docker ps -a --filter name=api 3 4 # 2. Đọc 200 dòng log gần nhất 5 docker logs --tail 200 api 6 7 # 3. Theo dõi khi tái hiện lỗi 8 docker logs -f api 9 10 # 4. Kiểm tra process/config bên trong nếu còn chạy 11 docker exec -it api sh 12 13 # 5. Dừng an toàn 14 docker stop -t 30 api 15 16 # 6. Xóa Container cũ 17 docker rm api 18 19 # 7. Tạo lại từ Image/config đã sửa 20 docker run -d --name api -p 3000:3000 demo-api:1.1 Code bash
Copy1 docker ps -a --filter name=my-app 2 docker rm my-app Code bash
Copy1 docker ps --format 'table {{.Names}}\t{{.Ports}}' Code bash
Copy1 docker run -p 8081:80 nginx Code bash
Copy1 docker ps -a 2 docker logs < containe r > Code bash
Copy1 docker exec -it < containe r > sh Code bash
Copy1 # Chạy Nginx 2 docker run -d --name cli-demo -p 8080:80 nginx:1.27-alpine 3 4 # Quan sát 5 docker ps --filter name=cli-demo 6 7 # Đọc log 8 docker logs --tail 20 cli-demo 9 10 # Kiểm tra cấu hình Nginx 11 docker exec cli-demo nginx -t 12 13 # Dừng 14 docker stop cli-demo 15 16 # Xác nhận trạng thái 17 docker ps -a --filter name=cli-demo 18 19 # Xóa 20 docker rm cli-demo Bài viết liên quan Những bài viết có cùng chủ đề hoặc công nghệ bạn có thể muốn đọc tiếp.
DevOps & Cloud
Hướng dẫn tự động deploy ứng dụng Docker lên VPS Ubuntu và cloud providers bằng GitHub Actions: AWS ECS/App Runner/EC2, Vercel, Render, secrets, healthcheck, rollback và zero-downtime strategy.
20 thg 8, 2026 10 phút đọcĐọc tiếp DevOps & Cloud
Hướng dẫn đăng ký và quản lý Private Container Registry với Docker Hub và GitHub Container Registry: token, push/pull, access control, GitHub Actions, multi-arch, bảo mật và cleanup.
DevOps & Cloud
Hướng dẫn Docker Networks toàn diện: bridge, host, none, overlay, service discovery, port publishing, Compose network segmentation, internal networks, bảo mật và debug kết nối.