Chuyển đến nội dung chính

Docker Stop All Containers: Hướng dẫn từng bước

Tìm hiểu cách dừng tất cả container Docker đang chạy bằng các lệnh đơn giản. Điều này giúp bạn quản lý tài nguyên hệ thống và tối ưu hóa môi trường Docker.
· 5 phút đọc

Khám phá cùng AI

Dừng container từng cái một có thể làm chậm quy trình phát triển của bạn và dễ gây lỗi khi phải xoay xở với microservice hoặc ứng dụng đa container. 

Trong hướng dẫn này, tôi sẽ trình bày một số cách giúp bạn chấm dứt tất cả container đang chạy.

Kết thúc bài hướng dẫn, bạn sẽ có thể:  

  • Hiểu cách Docker xử lý tín hiệu và khoảng thời gian ân hạn
  • Dừng tất cả container bằng các kỹ thuật CLI đơn giản và bộ lọc
  • Tận dụng Docker Compose và alias tùy chỉnh để tối ưu quy trình làm việc 

Tìm hiểu về quá trình kết thúc container Docker

Trước khi dừng hàng loạt container, sẽ hữu ích nếu bạn hiểu cách Docker điều phối việc tắt container ở tầng bên dưới.

Quản lý tiến trình dựa trên tín hiệu

Docker sử dụng tín hiệu Unix để yêu cầu tắt an toàn trước khi buộc kết thúc. Hành vi mặc định của lệnh docker stop là: 

  1. Gửi SIGTERM tới tiến trình chính của container.  
  2. Chờ tối đa 10 giây (có thể cấu hình với -t/--time).  
  3. Gửi SIGKILL nếu tiến trình chưa thoát.
  • SIGTERM: Lịch sự yêu cầu tiến trình dọn dẹp và thoát.  
  • Khoảng ân hạn: Cho ứng dụng thời gian ghi log, đóng kết nối hoặc lưu trạng thái.  
  • SIGKILL: Buộc kết thúc ngay lập tức bất kỳ tiến trình không phản hồi nào.

Dòng thời gian minh họa trình tự tín hiệu khi docker stop: SIGTERM, chờ, rồi SIGKILL.

Cơ chế giao diện dòng lệnh (CLI)

Theo mặc định, docker stop xử lý từng container một. Bạn có thể mở rộng để dừng nhiều container bằng các tính năng của shell.

# Stop a single container named my_container
docker stop my_container

Lệnh này gửi SIGTERM tới my_container và chờ mặc định 10 giây trước khi gửi SIGKILL nếu cần.

# Stop all running containers at once
docker stop $(docker ps -q)

Ở đây, docker ps -q liệt kê ID của tất cả container đang chạy; các ID đó được truyền cho docker stop, vốn sẽ tắt các container theo thứ tự tuần tự.

Phiên terminal chuyển đầu ra docker ps -q vào docker stop để tắt tất cả container.

Ảnh chụp màn hình terminal hiển thị đầu ra docker ps -q được chuyển vào docker stop

Để hiểu sâu hơn các khái niệm này, bạn có thể khám phá Containerization and Virtualization Concepts.

So sánh docker stop và docker kill

Chọn giữa tắt an toàn và tắt cưỡng bức giúp bạn tránh hệ quả ngoài ý muốn.

Tắt an toàn so với tắt ngay lập tức

Lệnh

Tín hiệu

Hành vi

Trường hợp sử dụng

docker stop

SIGTERM → SIGKILL sau khi hết thời gian chờ

Tắt an toàn, có thời gian dọn dẹp

Bảo trì định kỳ hoặc cập nhật

docker kill

SIGKILL

Kết thúc ngay lập tức  

Khắc phục khẩn cấp khi container treo

Tùy chỉnh tín hiệu

Cả hai lệnh đều hỗ trợ cờ --signal để ghi đè mặc định:

# Send SIGINT instead of SIGTERM
docker stop --signal=SIGINT my_container

Lệnh trên cho phép tiến trình bẫy SIGINT để dọn dẹp tùy chỉnh.

# Kill all containers with SIGUSR1
docker kill --signal=SIGUSR1 $(docker ps -q)

Như đã thấy ở trên, bạn có thể dùng tín hiệu tùy chỉnh khi ứng dụng của bạn triển khai các hook tắt cụ thể.

Chiến lược dừng container nâng cao

Lọc và tự động hóa việc dừng container cho phép quy trình DevOps chính xác hơn, đặc biệt trong môi trường quy mô lớn.  

Khi đã nắm vững cơ bản, bạn có thể tinh chỉnh container nào sẽ dừng và cách tự động hóa quy trình.

Dừng container có lọc

Bộ lọc cho phép bạn nhắm mục tiêu container theo thuộc tính như tên image, trạng thái hoặc nhãn:

# Stop containers running the my_image:latest image
docker stop $(docker ps --filter "ancestor=my_image:latest" -q)

Lệnh trên chỉ dừng các container dựa trên my_image:latest, cung cấp khả năng kiểm soát có mục tiêu trong các dự án đa dịch vụ.

Trường hợp sử dụng:  

  • Dừng container test theo thẻ image (--filter "ancestor=test:latest")  
  • Dừng container theo nhãn (--filter "label=env=dev")

Lọc đầu ra docker ps theo tên image tổ tiên trước khi dừng container.

Ảnh terminal sử dụng docker ps --filter

Dọn dẹp tự động với Docker Compose

Nếu dịch vụ của bạn được định nghĩa trong tệp docker-compose.yml, một lệnh duy nhất sẽ dừng tất cả container liên quan:

docker-compose stop

Lệnh này tôn trọng phụ thuộc giữa các dịch vụ và thời gian chờ đã cấu hình để tắt sạch sẽ.

Với các kỹ thuật nâng cao hơn, bạn có thể cân nhắc khóa học Intermediate Docker.

Tối ưu quy trình với alias

Với các tác vụ lặp lại, alias của shell giúp giảm thao tác gõ và chuyển ngữ cảnh:

# Add this to ~/.bashrc or ~/.zshrc
alias ds='docker stop $(docker ps -q)'

Sau khi tải lại shell, chạy ds sẽ dừng tất cả container chỉ với một phím tắt—lý tưởng cho việc dọn dẹp nhanh.

Terminal cho thấy sử dụng thành công alias 'ds' để dừng tất cả container Docker đang chạy trong Ubuntu WSL.

Sử dụng alias 'ds' để dừng tất cả container đang chạy trong Ubuntu WSL

Thực tiễn vận hành tốt

Triển khai quy trình tắt an toàn và dọn dẹp thường xuyên để giữ môi trường ổn định và hiệu năng tốt.

  • Triển khai bộ xử lý tín hiệu trong mã ứng dụng để đóng kết nối và ghi log.  
  • Chỉ dùng docker kill cho can thiệp khẩn cấp; tránh bất nhất dữ liệu.  
  • Điều chỉnh khoảng ân hạn (-t/--time) theo nhu cầu dọn dẹp của ứng dụng.  
  • Tự động dọn dẹp sau khi tắt bằng các lệnh như docker system prune, như chi tiết trong Docker Prune: A Complete Guide with Hands-On Examples.
  • Ghi log sự kiện tắt (dấu thời gian và mã thoát) để chẩn đoán sự cố kết thúc.

Khắc phục sự cố thường gặp

Ngay cả các lệnh đơn giản cũng có thể gặp trục trặc—dưới đây là cách xử lý.

Tiến trình zombie và volume mồ côi

Việc tắt cưỡng bức có thể để lại tiến trình cũ hoặc volume mồ côi, tiêu tốn tài nguyên và dung lượng đĩa của host. Để dọn dẹp:

# Remove dangling volumes
docker volume prune

Lệnh này xóa tất cả volume không được tham chiếu bởi bất kỳ container nào.

Kiểm tra tiến trình daemon Docker còn sót:

ps aux | grep dockerd

Hãy tự tay kill bất kỳ tiến trình con dockerd nào còn tồn tại.

Tình huống thực tế: Trong một dự án, tôi đã dùng docker kill cho một container cơ sở dữ liệu khi quá trình migration bị treo. Việc kill đột ngột đã ngăn DB ghi log giao dịch, làm hỏng bảng InnoDB. Chúng tôi phải khôi phục từ bản sao lưu và phát lại binlog, gây hơn 30 phút downtime. Để tránh điều này, hãy ưu tiên docker stop với thời gian chờ dài hơn hoặc bổ sung bộ xử lý SIGTERM phù hợp trong ứng dụng của bạn.

Lỗi từ chối quyền truy cập

Chạy lệnh Docker mà không có đặc quyền phù hợp thường gây lỗi:

  • Thêm tiền tố sudo cho lệnh hoặc chạy với người dùng thuộc nhóm docker.  
  • Thêm người dùng của bạn vào nhóm docker và đăng nhập lại:
sudo usermod -aG docker $USER

Sau khi đăng xuất và đăng nhập lại, bạn có thể chạy lệnh Docker mà không cần sudo. Trong môi trường CI, đảm bảo người dùng runner thuộc nhóm Docker để tránh lỗi pipeline.

Lưu ý riêng cho Windows

Trên Windows PowerShell, hãy bọc lệnh con trong dấu ngoặc đơn và chạy với quyền Administrator:

docker stop (docker ps -q)

Khởi chạy PowerShell với quyền nâng cao sẽ ngăn vấn đề tường lửa hoặc kiểm soát truy cập. Nếu bạn thấy lỗi bắt tay TLS, hãy xác minh cấu hình daemon của Docker Desktop khớp với môi trường PowerShell.

Kết luận

Dừng hiệu quả tất cả container Docker giúp tiết kiệm thời gian, tiết kiệm tài nguyên và giảm thiểu lỗi do con người trong quy trình phát triển của bạn. Bằng cách hiểu cách Docker xử lý tín hiệu, tận dụng bộ lọc CLI, dùng Docker Compose và tạo alias đơn giản, bạn có thể duy trì môi trường sạch sẽ và có thể dự đoán. 

Khám phá lộ trình Containerization and Virtualization with Docker and Kubernetes hoặc khóa học Intermediate Docker để đào sâu kiến thức về containerization.

Chúc bạn container hóa hiệu quả—và chào mừng những quy trình Docker sạch, gọn, hiệu quả!

FAQs

docker stop trả về mã thoát nào?

Khi thành công, docker stop trả về 0. Mã thoát khác 0 cho biết một hoặc nhiều container không dừng được.

Tôi có thể xem trước những container sẽ bị dừng trước khi chạy lệnh không?

Có—chạy docker ps hoặc docker ps -q để liệt kê container đang chạy và xác minh ID hoặc tên trước khi thực thi docker stop.

Chính sách khởi động lại ảnh hưởng thế nào đến container đã dừng?

Container có chính sách khởi động lại như always sẽ tự động khởi động lại sau khi dừng. Hãy gỡ hoặc sửa chính sách bằng docker update --restart=no <container> nếu bạn muốn chúng vẫn ở trạng thái dừng.

Có cách nào dừng container theo mạng hoặc volume không?

Mặc dù Docker không lọc trực tiếp theo mạng hoặc volume trên docker stop, bạn có thể kết hợp docker ps --filter "network=<name>" hoặc docker ps --filter "volume=<name>" với phép thay thế lệnh.

Làm sao tích hợp docker stop vào pipeline CI/CD?

Tích hợp lệnh stop vào script build hoặc job CI/CD—dùng các cờ như --signal và bộ lọc để tắt có chủ đích, sau đó chạy lệnh dọn dẹp (docker system prune) trong cùng pipeline.

Tôi có thể khởi động lại tất cả container đã dừng sau đó không?

Có, dùng docker start $(docker ps -a -q) để khởi động lại tất cả container, gồm cả những cái đã dừng trước đó.

Việc dừng tất cả container có xóa chúng không?

Không, dừng container không xóa chúng. Chúng vẫn nằm trên hệ thống cho đến khi bạn gỡ bằng docker rm.

Làm sao tự động dừng container hằng ngày?

Dùng cron job với lệnh docker stop $(docker ps -q) để lên lịch dừng tự động hằng ngày.

docker stop có ảnh hưởng đến volume hoặc mạng không?

Không, dừng container không ảnh hưởng đến volume hoặc mạng đính kèm—chúng vẫn nguyên vẹn.

Tôi có thể loại trừ một số container khỏi việc bị dừng không?

Bạn có thể dừng có chọn lọc bằng cách dùng docker ps với bộ lọc hoặc loại trừ các ID container cụ thể khỏi lệnh.

Có công cụ nào giúp quản lý container ngoài lệnh CLI không?

Các công cụ như Portainer hoặc Docker Desktop cung cấp quản lý qua giao diện đồ họa, giúp việc điều khiển container dễ dàng hơn cho người mới bắt đầu.

Khalid Abdelaty

Tác giả

Khalid Abdelaty

Tôi là một kỹ sư dữ liệu và người xây dựng cộng đồng, làm việc với pipeline dữ liệu, đám mây và công cụ AI, đồng thời viết các hướng dẫn thực hành, tác động cao cho DataCamp và các nhà phát triển mới nổi.

Chủ đề

Liên quan