Docker Compose: Tổ chức dịch vụ, giải thích tham số quan trọng và giám sát bằng Portainer

Giới thiệu: Compose là công cụ dùng để định nghĩa và chạy ứng dụng Docker đa container. Qua Compose, người dùng sử dụng tệp YAML để cấu hình các dịch vụ cần thiết cho ứng dụng, thực hiện triển khai thống nhất cho ứng dụng đa dịch vụ.

  1. Lệnh排查 vấn đề trong container

Truy cập vào container: docker exec -it container-id sh/bash;

A. Kiểm tra kết nối mạng: ping ip;

B. Kiểm tra cổng container: nc -zv ip port;

  1. Cài đặt và gỡ bỏ

A. Tải công cụ docker-compose:

x86_64: curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

aarch64: curl -L https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose, phiên bản này không hỗ trợ kiến trúc arm

B. Gán quyền thực thi cho tệp docker-compose: chmod +x /usr/local/bin/docker-compose;

C. Kiểm tra cài đặt: docker-compose --version;

D. Gỡ bỏ: rm /usr/local/bin/docker-compose.

  1. Ba bước thực hiện

A. Sử dụng Dockerfile định nghĩa môi trường ứng dụng, xây dựng hình ảnh cho từng dịch vụ;

B. Sử dụng tệp docker-compose.yml định nghĩa các dịch vụ tạo thành ứng dụng, chúng chạy trong môi trường cô lập;

C. Chạy lệnh docker-compose up để khởi động ứng dụng, ví dụ: docker-compose -f file.yml up -d;

D. Dừng hoặc khởi động lại dịch vụ: docker-compose -f file.yml stop/restart.

  1. Tệp cấu hình docker-compose.yml
# Phiên bản
version: '3'
# Cấu hình mạng
networks:
    # Tên mạng
    my-net:
        # Mạng này được tạo bên ngoài Compose, docker-compose up sẽ không tạo
        external: true
    my-host:
        external: true
        # Chia sẻ mạng host
        name: host

# Đính kèm tập tin toàn cục
volumes:
    fdfs-data-1:

# Dịch vụ
services:
    # Tên dịch vụ
    web:
        # Tên hình ảnh: kho/chứa/phiên bản
        image: ruhuanxingyun.com:8701/fastdfs-nginx:latest
        # Mô hình triển khai
        deploy:
            # global: mỗi nút trong cụm chạy 1 container, replicated: số lượng bản sao
            mode: global
            # Giới hạn nút triển khai
            placement:
                constraints:
                    # Sử dụng docker node update --label-add role=nhãn tên để gán nhãn
                    - node.labels.rabbitmq == true
            restart_policy:
        # Lệnh chạy khi khởi động
        command: tracker
        # Thông số cổng (cổng máy chủ: cổng container)
        ports:
            # Ánh xạ cổng TCP
            - "22122:22122"
            # Ánh xạ cổng UDP
            - "22123:22123/udp"
        # Mạng sử dụng
        networks:
            - my-net
        # Thêm quyền hệ thống
        cap_add:
            - ALL
        # Thiết lập tham số Linux
        sysctls:
            - net.core.somaxconn=1024
            - net.ipv4.tcp_syncookies=1
        # Giới hạn số tập tin mở
        ulimits:
            nproc: 65535
            nofile:
                soft: 65535
                hard: 65535
        # Đính kèm thư mục (thư mục máy chủ: thư mục container)
        volumes:
            - /etc/localtime:/etc/localtime
            - /data/fastdfs:/etc/fdfs
        # Biến môi trường
        environment:
            TRACKER_SERVER: fdfs-tracker:22122
            GROUP_NAME: group

Cấu hình cổng linh hoạt:

  1. Tái sử dụng cấu hình

& <<:* cách dùng sẽ được bổ sung sau

B. Để đảm bảo thứ tự khởi động dịch vụ, docker cung cấp depends_on hoặc links, nhưng chỉ đảm bảo dịch vụ phụ thuộc được khởi động, không đảm bảo dịch vụ đó đã sẵn sàng. Giải pháp hiện tại là sử dụng script wait-for-it.sh;

  1. Tham số gỡ lỗi từ xa
-Xdebug -Xrunjdwp:transport=dt_socket,address=28080,suspend=n,server=y
  1. Chính sách khởi động lại (restart_policy): dựa trên trạng thái thoát của tiến trình (Container process exited) hoặc lỗi bộ nhớ (killed by out of memory);

A. Ba trạng thái của tham số condition

none: khởi động lại khi container thoát;

on-failure: khởi động lại khi container thoát không bình thường (trạng thái khác 0);

any: chính sách mặc định, không khởi động lại khi container thoát;

B. Mã thoát của container

0: container thoát bình thường, ví dụ: dừng container;

khác 0: container thoát bất thường (theo tiêu chuẩn chroot), ví dụ: lỗi khi chạy docker run;

125: lỗi của dịch vụ Docker;

126: lệnh mặc định không thể thực thi;

127: lệnh mặc định không tồn tại;

các mã khác: mã thoát của lệnh chạy trong container.

Kiểm tra mã thoát: docker inspect container-id -f "{{.State.ExitCode}}";

  1. Mối quan hệ phụ thuộc đa dịch vụ

Ví dụ: dịch vụ Nacos phụ thuộc MySQL, mặc dù phiên bản 2 có depends_on, nhưng việc container khởi động xong chưa đảm bảo ứng dụng đã sẵn sàng. Giải pháp là sử dụng script wait-for-it.sh hoặc công cụ dockerize;

  1. Portainer

A. Công cụ tạo mật khẩu: htpasswd -nb -B admin "your-password" | cut -d ":" -f 2, htpasswd là công cụ tạo tài khoản mật khẩu khi dùng xác thực basic, cần cài đặt httpd;

B. Lệnh triển khai, lưu ý ký tự $ cần escape, thêm $ trước mỗi $:

version: "3"

networks:
    rhxy-network:
        external: true

services:
    portainer:
        image: portainer/portainer
        container_name: portainer
        hostname: portainer
        restart: always
        command: --admin-password=$$1a$$05$$npdefc.1NzvQJL.gQ2whozusdf51TiaR0jk9fJa2YK2MS -H unix:///var/run/docker.sock
        ports:
            - 9000:9000
        networks:
            - rhxy-network
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - /data/portainer/data:/data
        environment:
            TZ: Asia/Shanghai
  1. Xuất nhật ký ứng dụng trong container ra console

A. Docker lưu nhật ký ở vị trí mặc định /var/lib/docker, mỗi container có tệp JSON riêng, ví dụ: /var/lib/docker/containers/iu622030.../iu622030...-json.log;

B. Ứng dụng thường có nhật ký riêng, ví dụ nginx access_log, để xem trong Portainer cần chuyển nhật ký sang STDOUT/STDERR, cách thực hiện khi xây dựng hình ảnh:

Chuyển yêu cầu và nhật ký lỗi sang bộ thu thập log của Docker

RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log Khi chạy container, mọi nhật ký ứng dụng tùy chỉnh đều được chuyển sang STDOUT và STDERR, sau đó dùng docker logs để xem.

  1. Kiểm tra sức khỏe container

A. Kiểm tra sức khỏe nhằm khắc phục hạn chế của chiến lược khởi động lại trước đó, ví dụ: container phụ thuộc dịch vụ chưa khởi động xong hoặc lỗi bộ nhớ vẫn không hoạt động, do đó cần kiểm tra chi tiết như kiểm tra cổng;

B. Trạng thái giám sát

starting: trạng thái ban đầu khi container khởi động;

healthy: nếu lệnh kiểm tra thành công, container khỏe mạnh;

unhealthy: nếu kiểm tra thất bại vượt quá số lần cho phép, container không khỏe mạnh, nhưng nếu lần kiểm tra sau thành công, trạng thái sẽ trở lại healthy.

C. Tham số cấu hình

interval: khoảng thời gian giữa các lần kiểm tra sức khỏe, mặc định 30s;

timeout: thời gian chờ lệnh kiểm tra, nếu vượt quá thời gian này, lần kiểm tra coi là thất bại, mặc định 30s;

retries: số lần thất bại liên tiếp để đánh giá container không khỏe mạnh, mặc định 3 lần;

start_period (chỉ hỗ trợ từ phiên bản 3.4): thời gian khởi động ứng dụng, trong giai đoạn này kiểm tra sức khỏe bị bỏ qua, mặc định 0s. Lưu ý nếu kiểm tra sức khỏe thành công trong giai đoạn khởi động, coi như container đã khởi động, các lần thất bại liên tiếp sẽ được tính vào số lần thử tối đa. Nếu các tham số này không hợp lý sẽ gây ra việc dịch vụ liên tục khởi động lại.

D. Cách sử dụng

Tham khảo: giải thích tham số trong tệp docker-compose.yml

Cách đính kèm thư mục docker volume

Nguyên lý docker logs

Trạng thái sức khỏe của container

Thẻ: Docker Compose Portainer Tổ chức container cấu hình mạng Kiểm tra sức khỏe

Đăng vào ngày 13 tháng 9 lúc 16:37