Sunday, September 29, 2024

[Docker] Phần 5 – Tra cứu thông tin image và giám sát các container trong Docker

-

1. Mở Đầu

Trong hành trình khám phá Docker, phần 5 này sẽ làm quen với cách tra cứu thông tin về các image và cách giám sát các container trong môi trường Docker. Hiểu rõ về các image có sẵn và cách theo dõi hoạt động của container là quan trọng để quản lý và duy trì ứng dụng một cách hiệu quả.

Trong phần này, chúng ta sẽ tìm hiểu cách tra cứu thông tin về các image có sẵn trong Docker Hub và trên máy local. Chúng ta cũng sẽ tìm hiểu cách giám sát hoạt động của các container, bao gồm việc xem danh sách container đang chạy, theo dõi logs, và quản lý tài nguyên của container.

Lưu ý:
Để thực hiện các thao tác liên quan đến Docker, hãy đảm bảo bạn đã cài đặt Docker trên hệ thống của mình.

2. Tìm hiểu các thành phần tạo nên Container.

Các thành phần tạo nên Docker Container là những yếu tố quan trọng trong việc quản lý và triển khai ứng dụng trong môi trường Docker. Dưới đây là một số khái niệm liên quan đến Docker Container:

Container: Container là một môi trường ảo hoá lép với tất cả các thành phần và tài nguyên cần thiết để ứng dụng hoạt động. Mỗi container được tạo ra dựa trên một image cụ thể. Container là phiên bản chạy của image đó và có thể được tùy chỉnh thêm. Container sử dụng layering để thay đổi và lưu trữ dữ liệu.

Image: Image là một bản sao chỉ đọc của một container hoặc một tập hợp các cấu hình, thư viện, và tài nguyên cần thiết để chạy một ứng dụng cụ thể. Image là một bản “đóng băng” của container, không thể sửa đổi trực tiếp. Khi một container chạy, nó sẽ tạo một lớp (layer) được phép ghi thêm lên image gốc. Image có thể được chia sẻ và sử dụng trên nhiều máy tính.

Platform Image: Platform Image là một loại image đặc biệt mà không có image cha. Chúng chứa toàn bộ cấu hình và tài nguyên cần thiết cho việc ảo hóa và chạy ứng dụng. Platform Image thường là image gốc và không phụ thuộc vào bất kỳ image nào khác.

Registry: Registry là nơi lưu trữ và quản lý các image. Các image có thể được tải về từ registry và chia sẻ giữa nhiều người dùng và máy tính khác nhau. Docker Hub là một trong những registry phổ biến và chứa nhiều image sẵn có.

Dockerfile: Dockerfile là một tệp cấu hình có cấu trúc được sử dụng để tạo ra image. Bằng cách sử dụng Dockerfile, bạn có thể tự động hóa quy trình tạo, cấu hình, và triển khai các container. Dockerfile mô tả các bước để tạo image, bao gồm việc chọn base image, cài đặt các gói phần mềm, cấu hình biến môi trường và thực hiện các tùy chỉnh khác.

Các thành phần này là những khái niệm quan trọng trong Docker và giúp bạn hiểu rõ hơn về cách Docker hoạt động và cách quản lý container và image.

3. Truy vấn thông tin về Image và Container.

Lệnh này để truy vấn thông tin lịch sử các thao tác để hình thành nên một image. Cú pháp như sau

$ docker history hoanghd164/getdata:vnpt
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
339cdde13838   10 days ago   /bin/sh -c echo '#!/bin/bash' > /usr/local/b…   77B
<missing>      10 days ago   /bin/sh -c echo '#!/bin/bash' > /usr/local/b…   151B
<missing>      10 days ago   /bin/sh -c #(nop) WORKDIR /home/monitor/prom…   0B
<missing>      10 days ago   /bin/sh -c pip3 install     --upgrade pip   …   45.9MB
<missing>      10 days ago   /bin/sh -c apt install -y     python3-pip   …   234MB
<missing>      10 days ago   /bin/sh -c apt-get update -y && apt-get inst…   212MB
<missing>      4 weeks ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      4 weeks ago   /bin/sh -c #(nop) ADD file:8faed18d471598732…   72.8MB

Lệnh docker inspect

Để có được thông tin chi tiết về một image, container nào đó sử dụng đến lệnh docker inspect, lệnh này trả về thông tin về đối tượng cần truy vấn dưới dạng JSON. Cú pháp như sau:

$ docker inspect hoanghd164/getdata:vnpt
[
    {
        "Id": "sha256:339cdde138382f3b2411dbd9d28450af72875cc908a8573b6f4be0fdc8e66b45",
        "RepoTags": [
            "hoanghd164/getdata:vnpt"
        ],
        "RepoDigests": [
            "hoanghd164/getdata@sha256:4f271aba0ea9e2a9186a3186de207130bfaa8835da416fc1f2098d06128b0092"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2022-10-24T13:28:49.205263047Z",
        "Container": "6c1fa9caa834ae8d32f538858723bca89894c769342822daf9101a7e985542a2",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "echo '#!/bin/bash' > /usr/local/bin/python_path.sh     && echo \"export PYTHONPATH='/home/monitor/prometheus/pustgateway/common/'\" >> /usr/local/bin/python_path.sh     && chmod +x /usr/local/bin/python_path.sh"
            ],
            "Image": "sha256:689cdce8f606162e65742510a03f7ae6e475ca534ec9f7693e7ae18c07f6853f",
            "Volumes": null,
            "WorkingDir": "/home/monitor/prometheus/pustgateway",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "20.10.20",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "bash"
            ],
            "Image": "sha256:689cdce8f606162e65742510a03f7ae6e475ca534ec9f7693e7ae18c07f6853f",
            "Volumes": null,
            "WorkingDir": "/home/monitor/prometheus/pustgateway",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 564961896,
        "VirtualSize": 564961896,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/b7cf39f56098fd544044cc54472b5b1ddf99adbf2dc5ddecf303f6cfb588f8ff/diff:/var/lib/docker/overlay2/b73c3ef9140a6c0224e7f7d8fb8064e4e76c501d8b6bcbeeb5e475b7ac3790cd/diff:/var/lib/docker/overlay2/5ad698c07e42e4a3771b1850e5679bb4d90e82a24f9a98971c4eddd8da46800f/diff:/var/lib/docker/overlay2/5b8549f11fbdd6c9d74f749186bfd2645de8882ebec3cbd28fb50e52494cad32/diff:/var/lib/docker/overlay2/c88f25b3ced5853dd3111da627ec14103c1f9ae22116dff54cf04b7c3f3c0fe2/diff:/var/lib/docker/overlay2/da4ea3781bc8b645c2ed1a6c1f57cea34eba5895fafe30199d60c2b957333fdb/diff",
                "MergedDir": "/var/lib/docker/overlay2/0cdff6225ac16ca8b0f2a471cdccc8cd1f04693c9283d13435d15b3a2b79dbe6/merged",
                "UpperDir": "/var/lib/docker/overlay2/0cdff6225ac16ca8b0f2a471cdccc8cd1f04693c9283d13435d15b3a2b79dbe6/diff",
                "WorkDir": "/var/lib/docker/overlay2/0cdff6225ac16ca8b0f2a471cdccc8cd1f04693c9283d13435d15b3a2b79dbe6/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:cdca8156a203b9719f985c3114336529115cdc392f89d45cfcd37c968ddd3645",
                "sha256:66cdeb03db339e3dbb18c043318857340f4325e1a84fc2ebabf4dd963ddcd3f1",
                "sha256:0f1070a8cea785b6cedd1f69cdd328847418941ec025c9aac826f86be153972a",
                "sha256:2ec475c06652e7792c5513ca7fa5d61dace5834e110b0659e6ffa77316dc03eb",
                "sha256:be634f226245711b6f121b66e61f6231efbbbc411ab32ea48c31011f2a9294a1",
                "sha256:1afed5fd5fa0535384f0f5c0939866d65c2e47b76f903ada70499a509f975d36",
                "sha256:a5b2173ac58f4b52fb61443c134da0cd2abdf30f7bc667b412b25130a5b66728"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

4. Lệnh docker diff.

Lệnh docker diff để kiểm tra xem một container từ lúc nó được tạo ra đến giờ hệ thống file/thư mục thay đổi như thế nào. Kết quả liệt kê ra danh sách trên từng dòng những thư mục, file có sự thay đổi. Tiền tố đầu dòng có thể là A (thêm vào add), D (bị xóa đi delete) hoặc C (được được cập nhật – change).

$ docker diff jenkins
C /run
A /run/docker.sock
C /tmp
A /tmp/hsperfdata_jenkins
A /tmp/hsperfdata_jenkins/7
A /tmp/jetty-0_0_0_0-8080-war-_-any-11018340037403365808
A /tmp/winstone11787610757511023616.jar
C /usr
C /usr/bin
A /usr/bin/terraform
A /usr/bin/sshpass
A /usr/bin/docker
C /usr/local
C /usr/local/bin
A /usr/local/bin/docker-compose

5. Lệnh docker logs.

$ docker logs vnpt-pushgateway | more
ts=2022-10-24T15:53:47.454Z caller=main.go:85 level=info msg="starting pushgateway" version="(version=1.4.3, branch=HEAD, revision=f9dc1c8664050edbc75916c3664be1df595a1958)"
ts=2022-10-24T15:53:47.454Z caller=main.go:86 level=info build_context="(go=go1.18.2, user=root@75e397dd33fe, date=20220530-19:02:00)"
ts=2022-10-24T15:53:47.457Z caller=main.go:139 level=info listen_address=:9091
ts=2022-10-24T15:53:47.457Z caller=tls_config.go:195 level=info msg="TLS is disabled." http2=false

Bạn có thể đưa vào một số tùy chọn sau của lệnh:

  • –tail n chỉ hiện thị n dòng cuối
  • -f hoặc –follow với tham số này, nếu container đang chạy nó sẽ tự động hiện thị thêm log mới nếu container phát sinh log. Ngắt giám sát log nhấn CTRL+C

6. Đo lường thông tin container với docker stats.

Lệnh docker stats giám sát theo thời gian thực một số lại lượng sử dụng bởi container gồm: CPU, bộ nhớ, và lưu lượng mạng, số tiến trình. Cú pháp lệnh như sau:

$ docker stats vnpt-pushgateway vnpt-prometheus
CONTAINER ID   NAME               CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
a194c49977c3   vnpt-pushgateway   0.00%     25.76MiB / 15.66GiB   0.16%     13.9GB / 4.22GB   0B / 0B          15
3ba6ddaea5c0   vnpt-prometheus    0.37%     88.54MiB / 15.66GiB   0.55%     4.67GB / 1.5GB    242kB / 2.84GB   17

7. Docker tự khởi động Container nếu Container bị dừng.

Triển khai một ứng dụng, container nào đó bạn muốn đảm bảo nó được Docker khởi động lại nếu bị dừng vì lý do nào đó thì khi tạo container bằng lệnh docker run cần thiết lập chính sách khởi động của container với tham số –restart=always

Ví dụ, ở phần trước container máy chủ MySQL tạo lại có chính sách này:

docker run -it --network network_name --name prometheus -h prometheus \
        -v /home/prometheus:/etc/prometheus \
        --restart=always prom/prometheus

8. Kết Luận.

Tra cứu thông tin image và giám sát các container là phần quan trọng trong việc quản lý và duy trì các ứng dụng trong môi trường Docker. Trong phần này, chúng ta đã tìm hiểu cách tra cứu thông tin về các image và cách giám sát các container để hiểu rõ hơn về hoạt động của Docker trong phát triển và triển khai ứng dụng. Hi vọng rằng kiến thức này sẽ giúp bạn tận dụng toàn bộ tiềm năng của Docker.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories