Giám sát, theo dõi lịch sử/trạng thái container
- 04-10-2024
- Toanngo92
- 0 Comments
Mục lục
Các Thành Phần Cấu tạo Docker Container
Để hiểu rõ cách hoạt động của Docker Container, chúng ta cần nắm vững các thành phần cơ bản tạo nên Docker Container.
1. Container
Container là một đơn vị độc lập, nơi ứng dụng và các thành phần của nó được chạy. Nó hoạt động như một “hộp kín” bao gồm toàn bộ các tệp cấu hình, dữ liệu và môi trường cần thiết cho ứng dụng. Mỗi container được tạo ra từ một image. Khi container được khởi chạy, một lớp layer có thể ghi được (writeable layer) sẽ được thêm vào trên đỉnh của image. Điều này cho phép container có thể ghi thêm dữ liệu trong quá trình hoạt động mà không ảnh hưởng đến image gốc.
Container có thể dễ dàng được lưu trữ dưới dạng image mới thông qua lệnh docker commit
, lúc này lớp ghi được sẽ được lưu thành một lớp mới trong image.
2. Image
Image trong Docker là một bản sao “đóng băng” của ứng dụng và các cấu hình cần thiết. Image luôn ở trạng thái chỉ đọc (read-only), và để thực hiện bất kỳ thay đổi nào, Docker sẽ tạo ra một lớp ghi được trên container đang chạy. Khi lớp này được lưu lại, nó sẽ trở thành một image mới với cấu trúc thêm một lớp (layer) mới.
Điều này giúp Docker dễ dàng quản lý và chia sẻ các phiên bản khác nhau của ứng dụng một cách hiệu quả, đồng thời tối ưu hóa không gian lưu trữ bằng cách tái sử dụng các lớp không thay đổi của các image.
3. Platform Image
Platform Image là loại image không có image cha. Đây là image nền tảng chứa các thành phần như biến môi trường, gói phần mềm và tiện ích cần thiết để ứng dụng chạy trong môi trường ảo hóa. Giống như các image khác, platform image cũng ở trạng thái chỉ đọc.
Những platform image phổ biến có thể kể đến là Alpine, Debian, hoặc Ubuntu—chúng cung cấp một hệ điều hành nhẹ và tối giản để bắt đầu xây dựng ứng dụng.
4. Registry
Registry là kho lưu trữ các image Docker. Đây là nơi chia sẻ và tải về các image từ cộng đồng. Docker Hub là registry chính thức của Docker, tuy nhiên, các tổ chức cũng có thể xây dựng registry riêng để lưu trữ và quản lý các image của mình.
Sử dụng registry giúp dễ dàng chia sẻ image giữa các nhóm phát triển hoặc môi trường triển khai khác nhau, tạo ra một luồng làm việc nhanh chóng và linh hoạt hơn.
5. Dockerfile
Dockerfile là một tệp cấu hình chứa các lệnh để tự động tạo image. Thay vì phải thực hiện các thao tác thủ công để cài đặt và cấu hình container, bạn có thể sử dụng Dockerfile để tự động hóa quy trình này.
Dockerfile có cấu trúc rõ ràng và dễ đọc, bao gồm các lệnh như FROM
(chọn image gốc), RUN
(chạy các lệnh trong quá trình tạo image), và COPY
(sao chép tệp từ hệ thống máy chủ vào container). Điều này giúp việc tạo, triển khai và cập nhật các image trở nên đơn giản và hiệu quả hơn.
Truy vấn thông tin về Image và Container
Truy vấn thông tin lịch sử:
docker history name_or_id_of_image
Ví dụ:
docker history nginx
Output:
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:c7b7d163e666 2 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon of… 7.19kB
sha256:2d9f7bc24c59 2 days ago /bin/sh -c #(nop) EXPOSE 80 0B
sha256:58af7db34356 2 days ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
sha256:ed46e1aa8872 2 days ago /bin/sh -c #(nop) CMD ["sh" "-c" "nginx -g 'daem… 0B
sha256:b25f5a0f55f1 2 days ago /bin/sh -c mkdir -p /var/log/nginx && chown -R ng… 14.5MB
sha256:f2cc5edc34ef 2 days ago /bin/sh -c #(nop) COPY file:3a39d107ec827f1cc29f4… 135B
sha256:be8662bc0011 2 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.19.10 0B
sha256:24302f7cf5b1 2 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Docker … 0B
sha256:3058ab8b93d8 2 weeks ago /bin/sh -c apt-get update && apt-get install -y n… 54.3MB
sha256:4ae46518db0c 2 weeks ago /bin/sh -c apt-get update && apt-get install -y c… 23.4MB
sha256:85d6cde2e28d 4 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
sha256:d1d60b3e6782 4 weeks ago /bin/sh -c apt-get update && apt-get install -y s… 12.5MB
sha256:8e674ad76bd5 4 weeks ago /bin/sh -c #(nop) MAINTAINER Nginx Developers <n… 0B
sha256:8c697c71199b 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
sha256:1575c5f63d3d 6 weeks ago /bin/sh -c apt-get update && apt-get install -y s… 123MB
Truy vấn thông tin chi tiết của đối tượng trong Docker
Lệnh docker inspect
dùng để hiển thị thông tin chi tiết về đối tượng Docker, bao gồm container, image, volume hoặc network. Kết quả trả về dưới dạng JSON chứa rất nhiều thông tin về cấu hình và trạng thái của đối tượng được chỉ định.
Cú pháp cơ bản:
docker inspect <name_or_id>
Trong đó:
<name_or_id>
: là tên hoặc ID của container, image, volume hoặc network mà bạn muốn xem thông tin chi tiết.
Ví dụ sử dụng:
- Inspect một container:
docker inspect my_container
Lệnh này sẽ trả về thông tin chi tiết của container có tên là my_container
, bao gồm:
- Các cấu hình mạng (IP address, ports).
- Các biến môi trường (environment variables).
- Thông tin về mount (volumes).
- Trạng thái của container (đang chạy hoặc đã dừng).
- Inspect một image:
docker inspect nginx
Lệnh này trả về thông tin về image nginx
, bao gồm:
- Các lớp (layers) của image.
- Các lệnh được thực thi khi container từ image này khởi chạy.
- Thông tin về kích thước, checksum của image.
- Inspect một volume:
docker inspect my_volume
Lệnh này cung cấp chi tiết về volume my_volume
, bao gồm:
- Đường dẫn nơi volume được mount trên hệ thống.
- Các container sử dụng volume này.
- Inspect một network:
docker inspect my_network
Lệnh này sẽ cung cấp chi tiết về network my_network
, bao gồm:
- Các container được kết nối vào network này.
- Các cấu hình liên quan đến bridge, IP ranges, gateways, v.v.
Thông tin trả về (output) sẽ bao gồm:
- ID: Mã định danh duy nhất của đối tượng.
- Created: Thời gian tạo đối tượng.
- Path: Đường dẫn của lệnh hoặc tệp lệnh được sử dụng khi tạo container.
- Args: Các tham số được truyền vào lệnh đó.
- State: Trạng thái hiện tại của container.
- Mounts: Các volume hoặc thư mục được mount vào container.
- NetworkSettings: Cấu hình mạng của container (như địa chỉ IP, port mapping).
- Và nhiều thông tin khác nữa.
Lệnh docker inspect
rất hữu ích khi bạn muốn tìm hiểu sâu hơn về cách một container, image, volume hoặc network hoạt động và được cấu hình.
Theo dõi sự khác biệt (thay đổi) giữa file system của một container đang chạy
Lệnh docker diff
dùng để hiển thị sự khác biệt (thay đổi) giữa file system của một container đang chạy hoặc đã dừng và file system ban đầu từ image mà container đó được tạo ra.
Cụ thể, lệnh này sẽ liệt kê các tệp và thư mục đã bị:
- Thay đổi.
- Thêm mới.
- Xóa đi trong quá trình container chạy.
Cú pháp:
docker diff <container_name_or_id>
Trong đó:
<container_name_or_id>
: là tên hoặc ID của container mà bạn muốn xem các thay đổi.
Ví dụ sử dụng:
- Kiểm tra sự thay đổi của container:
docker diff my_container
Lệnh này sẽ hiển thị danh sách các thay đổi trong hệ thống tệp của container có tên là my_container
.
Kết quả (output) ví dụ:
C /etc/hosts
A /new_file.txt
D /old_file.txt
Giải thích các ký tự trong kết quả:
- C: Thay đổi (Change) — tệp hoặc thư mục đã bị thay đổi.
- A: Thêm mới (Add) — tệp hoặc thư mục mới đã được thêm vào.
- D: Xóa (Delete) — tệp hoặc thư mục đã bị xóa khỏi hệ thống file của container.
Công dụng:
- Giúp kiểm tra những gì đã thay đổi trong container khi bạn chạy các lệnh hoặc thực hiện các thao tác bên trong container.
- Theo dõi các thay đổi tệp khi phát triển hoặc thử nghiệm ứng dụng trong container.
Xem nhật ký hoạt động container
Lệnh docker logs
được sử dụng để xem các log (nhật ký) của một container Docker. Những log này chứa thông tin về đầu ra tiêu chuẩn (stdout) và đầu ra lỗi (stderr) của container, giúp bạn theo dõi và gỡ lỗi ứng dụng đang chạy bên trong container.
Cú pháp:
docker logs <container_name_or_id>
Trong đó:
<container_name_or_id>
: là tên hoặc ID của container mà bạn muốn xem log.
Các tùy chọn phổ biến:
-f
(follow): Hiển thị log theo thời gian thực. Giống nhưtail -f
, bạn có thể xem log liên tục khi container vẫn đang chạy.docker logs -f <container_name_or_id>
--tail
: Giới hạn số dòng log được hiển thị.docker logs --tail 100 <container_name_or_id>
Ví dụ này chỉ hiển thị 100 dòng log cuối cùng.--since
: Chỉ hiển thị log kể từ một thời điểm cụ thể.docker logs --since "2023-10-01" <container_name_or_id>
Hiển thị log từ ngày 1/10/2023.--until
: Hiển thị log cho đến một thời điểm cụ thể.docker logs --until "2023-10-01T12:00" <container_name_or_id>
Ví dụ này sẽ hiển thị log trước 12 giờ trưa ngày 1/10/2023.--timestamps
: Hiển thị các log kèm theo dấu thời gian.docker logs --timestamps <container_name_or_id>
--details
: Hiển thị thêm chi tiết về log nếu có.
Ví dụ sử dụng:
- Xem log của một container:
docker logs my_container
- Xem log theo thời gian thực:
docker logs -f my_container
- Hiển thị 50 dòng log cuối cùng:
docker logs --tail 50 my_container
Công dụng:
- Theo dõi đầu ra của ứng dụng chạy trong container.
- Gỡ lỗi ứng dụng khi có sự cố xảy ra.
- Kiểm tra các thông báo lỗi hoặc thông tin hữu ích từ container.
Giám sát và đo lường thông tin về hiệu suất của các container
Lệnh docker stats
được sử dụng để giám sát và đo lường thông tin về hiệu suất của các container đang chạy, bao gồm các chỉ số như CPU, bộ nhớ, băng thông mạng và lưu lượng I/O (Input/Output).
Cú pháp:
docker stats [OPTIONS] [container_name_or_id]
Nếu không chỉ định container cụ thể, lệnh này sẽ hiển thị thông tin hiệu suất của tất cả các container đang chạy.
Kết quả (output) ví dụ:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
d9b100f2f636 my_container 2.53% 25.5MiB / 2GiB 1.27% 1.2kB / 2.5kB 0B / 0B 12
Giải thích các cột:
- CONTAINER ID: ID của container.
- NAME: Tên container.
- CPU %: Tỷ lệ phần trăm CPU mà container đang sử dụng.
- MEM USAGE / LIMIT: Bộ nhớ RAM mà container đang sử dụng và giới hạn bộ nhớ đã thiết lập.
- MEM %: Tỷ lệ phần trăm bộ nhớ được sử dụng.
- NET I/O: Dữ liệu vào/ra qua mạng mà container sử dụng (Download/Upload).
- BLOCK I/O: Lưu lượng vào/ra từ thiết bị lưu trữ (disk).
- PIDS: Số lượng tiến trình (process IDs) đang chạy trong container.
Các tùy chọn hữu ích:
--no-stream
: Chỉ hiển thị một lần và không cập nhật liên tục.docker stats --no-stream
Ví dụ này chỉ in ra thông tin hiệu suất một lần thay vì cập nhật theo thời gian thực.--all
hoặc-a
: Hiển thị thông tin của tất cả các container, bao gồm cả container đã dừng.docker stats --all
- Giới hạn số container hiển thị: Bạn có thể chỉ định tên hoặc ID của container để chỉ xem thông tin của container đó.
docker stats my_container
Công dụng:
- Giám sát hiệu suất: Lệnh này giúp bạn theo dõi việc sử dụng tài nguyên của các container để biết container nào đang tiêu tốn nhiều CPU, RAM, hoặc băng thông mạng.
- Gỡ lỗi: Khi một container hoạt động chậm,
docker stats
có thể cung cấp thông tin về việc nó có sử dụng quá nhiều tài nguyên hay không. - Tối ưu hóa: Giúp điều chỉnh giới hạn tài nguyên của các container dựa trên thông tin sử dụng thực tế.
Tự động khởi động lại container khi bị dừng/ngắt
Docker có thể tự động khởi động lại container nếu container bị dừng, và bạn có thể cấu hình hành vi này bằng cách sử dụng tùy chọn --restart
khi khởi động container. Tùy chọn này cho phép bạn kiểm soát cách Docker xử lý container trong các tình huống như lỗi hệ thống hoặc khi container bị dừng bất ngờ.
Các tùy chọn --restart
phổ biến:
no
: Đây là tùy chọn mặc định. Docker sẽ không tự động khởi động lại container nếu nó bị dừng.
docker run --restart no <image_name>
on-failure
: Docker sẽ khởi động lại container nếu nó thoát ra với mã lỗi khác 0 (tức là xảy ra lỗi). Bạn cũng có thể chỉ định số lần tối đa mà Docker cố gắng khởi động lại container. Ví dụ: khởi động lại container tối đa 3 lần khi gặp lỗi:
docker run --restart on-failure:3 <image_name>
always
: Docker sẽ luôn cố gắng khởi động lại container nếu nó bị dừng, bất kể lý do gì. Ngay cả khi bạn khởi động lại hệ thống, Docker cũng sẽ tự động khởi động lại container này.
docker run --restart always <image_name>
unless-stopped
: Docker sẽ tự động khởi động lại container trừ khi container đã bị dừng bằng lệnh thủ công (nhưdocker stop
). Container sẽ không tự động khởi động lại nếu nó bị dừng bằng tay.
docker run --restart unless-stopped <image_name>
Ví dụ khởi động container với tùy chọn --restart
:
Giả sử bạn muốn chạy container từ image nginx
và yêu cầu Docker luôn tự khởi động lại container nếu nó bị dừng:
docker run -d --restart always --name my_nginx nginx
Trong ví dụ này:
- Docker sẽ chạy container trong chế độ nền (
-d
). - Tùy chọn
--restart always
đảm bảo container sẽ được tự động khởi động lại nếu bị dừng.
Kiểm tra trạng thái khởi động lại của container:
Sau khi khởi động container với tùy chọn --restart
, bạn có thể kiểm tra cấu hình này bằng lệnh:
docker inspect <container_name_or_id>
Trong phần output JSON, bạn sẽ thấy một trường RestartPolicy
mô tả cách container được cấu hình để tự khởi động lại.
Tóm tắt:
- Bạn có thể điều khiển việc tự động khởi động lại container bằng cách sử dụng tùy chọn
--restart
. - Tùy chọn này giúp đảm bảo container tiếp tục chạy trong các môi trường sản xuất hoặc thử nghiệm khi gặp sự cố.