Tìm hiểu cấu trúc hình thành nên container, các truy vấn và đo lường quá trình hoạt động thay đổi của container trong Docker
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ỗicontainer
đều được tạo dựa trên mộtimage
(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ớpimage
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ộtimage
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.
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ầngPlatform 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ấnCTRL+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