Các thành phần tạo nên Container

Những phần trước bạn đã biết tạo và chạy container (kể cả việc dừng, khởi động lại, xóa ... container), giờ tìm hiểu chi tiết hơn một chút về Docker Container. Một số khái niệm mô tả hoạt động của Docker

  • Container: đó là một hộp kín để ứng dụng hoạt động. Mỗi container đều được tạo dựa trên một image (image đó chứa đủ cấu hình, thành phần dữ liệ). Khi bạn chạy một container xuất phát sừ một image, có một lớp (layer) được phép ghi thêm vào trên đỉnh của image (vậy container = image + layer được phép ghi). Sau đó, khi bạn lưu container này thành image mới (lệnh docker commit), một lớp image mới được thêm vào vào.
  • Image: như là ảnh chụp lại các cấu hình của container. Một image luôn ở trạng thái chỉ đọc, mọi thứ muốn thay đổi đều phải lưu ở tầng trên cùng (được phép ghi) của container, và tầng này có thể lưu lại để tạo image mới (thêm layer vào image cũ) và nó lại thành trạng thái chỉ đọc. Với quy trình như vậy, mỗi image đều phụ thuộc vào một hoặc nhiều image cha.
  • Platform Image : là một image mà nó không có image cha. Những image loại này cchuwas các biến môi trường, các gói, tiện ích để ưng dụng ảo hóa chạy, nó cũng chỉ đọc.
  • Registry là kho chứa các image, nơi chi sẻ, tải về các image.
  • Dockerfile một file cấu hình với cấu trúc để sinh ra images. Sử dụng file Dockerfile là cách tự động hóa việc tạo, chạy, sử dụng các container.
Hinh ảnh image
Hình ảnh container
Với hình ảnh trên, bạn có thể thấy hình thành cấu trúc như sau:
  • Xuất phát từ một Platform Image, chạy thành container, vậy đang hoạt động với cấu trúc gồm tầng Platform Image + tầng được phép ghi. Lúc này thêm các thành phần vào tầng được ghi, rồi commit thành image mới. Ở image mới này, tầng được phép ghi lưu thành một tầng chỉ đọc tên image1.
  • Quy trình như vậy bạn có thể tạo thành nhiều tầng image khác nhau. Mỗi tầng này là chỉ đọc, chỉ có container đang chạy có tầng được phép ghi.
  • Truy vấn thông tin về Image và Container

    Lệnh docker history - lịch sử

    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 name_or_id_of_image

    Ví dụ image có 91d

    docker inspect 91d
    
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    91dadee7afee        3 weeks ago         /bin/sh -c #(nop)  CMD ["mysqld"]               0B
                        3 weeks ago         /bin/sh -c #(nop)  EXPOSE 3306 33060            0B
                        3 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
                        3 weeks ago         /bin/sh -c ln -s usr/local/bin/docker-entryp…   34B
                        3 weeks ago         /bin/sh -c #(nop) COPY file:1667e4be6bef3129…   6.53kB
                        3 weeks ago         /bin/sh -c #(nop) COPY dir:478f098f3681084f7…   1.22kB
                        3 weeks ago         /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0B
                        3 weeks ago         /bin/sh -c {   echo mysql-community-server m…   362MB
                        3 weeks ago         /bin/sh -c echo "deb http://repo.mysql.com/a…   56B
                        3 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_VERSION=8.0.15-…   0B
                        3 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_MAJOR=8.0          0B
                        3 weeks ago         /bin/sh -c set -ex;  key='A4A9406876FCBD3C45…   27.8kB
                        3 weeks ago         /bin/sh -c apt-get update && apt-get install…   44.8MB
                        3 weeks ago         /bin/sh -c mkdir /docker-entrypoint-initdb.d    0B
                        3 weeks ago         /bin/sh -c set -x  && apt-get update && apt-…   4.44MB
                        3 weeks ago         /bin/sh -c #(nop)  ENV GOSU_VERSION=1.7         0B
                        3 weeks ago         /bin/sh -c apt-get update && apt-get install…   10.2MB
                        3 weeks ago         /bin/sh -c groupadd -r mysql && useradd -r -…   329kB
                        3 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B
                        3 weeks ago         /bin/sh -c #(nop) ADD file:5ea7dfe8c8bc87ebe…   55.3MB
    
    

    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 name_or_id_of_image_container

    Tham số name_or_id_of_image_container là tên hoặc ID của container hoặc Imgage. Ví dụ đang có container với tên c-php (hoặc ID là c4dd6ecd43b4), để truy vấn thông tin chi tiết về nó gõ

    docker inspect c-php
    Hoặc
    docker inspect c4dd6ecd43b4

    Kết quả thông tin có dạng (rất dài, đây chỉ là đoạn ngắn):

    [
    {
        "Id": "c4dd6ecd43b48d47653fed19bc7fea483c378f807bf08b6fda42ac7b7d35fcff",
        "Created": "2019-03-26T11:53:16.624300355Z",
        "Path": "docker-php-entrypoint",
        "Args": [
            "php-fpm"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 3313,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2019-03-27T01:41:53.107218Z",
            "FinishedAt": "2019-03-27T01:06:17.752159487Z"
        },
    ....
    

    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. Cú pháp lệnh

    docker diff container-name-or-id

    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).

    Ví dụ:

    docker diff c-php
    
    C /etc
    A /etc/nanorc
    C /etc/alternatives
    A /etc/alternatives/pico
    A /etc/alternatives/editor
    C /home
    A /home/phpcode
    C /usr
    C /usr/share
    C /usr/share/doc-base
    A /usr/share/doc-base/nano-faq
    A /usr/share/doc-base/nano
    C /usr/share/doc
    A /usr/share/doc/nano
    

    Lệnh docker logs

    Để đọc thông tin log của container (mà không phải vào terminal của container) thì dùng tới lệnh docker logs, cú pháp cơ bản như sau:

    docker logs container-name-or-id

    Ví dụ container có tên là c-php (với id là c4dd6ecd43b4):

    docker logs c-php
    # hoặc
    docker logs c4dd6ecd43b4
    
    172.18.0.3 -  26/Mar/2019:16:52:44 +0000 "GET /index.php" 200
    172.18.0.3 -  26/Mar/2019:16:53:03 +0000 "GET /index.php" 200
    172.18.0.3 -  26/Mar/2019:16:53:07 +0000 "GET /wp-login.php" 302
    172.18.0.3 -  26/Mar/2019:16:53:07 +0000 "GET /wp-login.php" 200
    172.18.0.3 -  26/Mar/2019:16:53:11 +0000 "GET /index.php" 200
    172.18.0.3 -  27/Mar/2019:00:11:39 +0000 "GET /index.php" 200
    172.18.0.3 -  27/Mar/2019:00:11:54 +0000 "GET /index.php" 200
    [27-Mar-2019 00:58:04] NOTICE: Terminating ...
    [27-Mar-2019 01:41:53] NOTICE: fpm is running, pid 1
    [27-Mar-2019 01:41:53] NOTICE: ready to handle connections
    

    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

    Đ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 container1, container2 ...

    Ví dụ:

    docker status c-php
    CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
    c4dd6ecd43b4        c-php               0.02%               20.74MiB / 1.952GiB   1.04%               2.86MB / 1.55MB     27.3MB / 0B         3
    

    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 www-net --name c-mysql -h mysql \
            -v "/mycode/db":/var/lib/mysql1 -e MYSQL_ROOT_PASSWORD=abc123 \
            --restart=always mysql
    
    Đăng ký theo dõi ủng hộ kênh