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ụ.
- 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;
- 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.
- 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.
- 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:
- 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;
- Tham số gỡ lỗi từ xa
-Xdebug -Xrunjdwp:transport=dt_socket,address=28080,suspend=n,server=y
- 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}}";
- 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;
- 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
- 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.
- 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