Giới thiệu
Docker Compose là một công cụ của Docker giúp định nghĩa và quản lý các ứng dụng Docker đa container. Với việc sử dụng một tệp YAML duy nhất, bạn có thể xác định tất cả các dịch vụ cần thiết cho ứng dụng và khởi chạy chúng chỉ bằng một lệnh đơn giản. Docker Compose rất phù hợp cho kiến trúc vi dịch vụ hoặc bất kỳ ứng dụng nào yêu cầu chạy trên nhiều container.
Các lệnh cơ bản của Docker Compose:
# Khởi động dịch vụ
docker compose up
# Khởi động dịch vụ ở chế độ nền
docker compose up -d
# Dừng dịch vụ
docker compose stop
# Khởi động lại dịch vụ
docker compose restart
# Dừng và xóa tất cả dịch vụ, volume
docker compose down
# Xem nhật ký dịch vụ
docker compose logs
# Theo dõi nhật ký thời gian thực
docker compose logs -f
# Xem nhật ký của dịch vụ cụ thể
docker compose logs <tên_dịch_vụ>
# Mở rộng dịch vụ
docker compose scale <tên_dịch_vụ>=<số_lượng_thực_đệ>
# Chạy một dịch vụ đơn lẻ
docker compose run <tên_dịch_vụ> <lệnh>
# Liệt kê hình ảnh
docker compose images
# Kéo hình ảnh
docker compose pull
# Xóa dịch vụ đã dừng
docker compose rm
Cài đặt nerdctl:
wget https://github.com/containerd/nerdctl/releases/download/v1.7.7/nerdctl-1.7.7-linux-amd64.tar.gz
tar -zxf nerdctl-1.7.7-linux-amd64.tar.gz -C /usr/local/bin
Cơ sở dữ liệu
MySQL
MYSQL_USER và MYSQL_PASSWORD là tùy chọn:
services:
mysql:
image: mysql:8.4.1
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: demo_db
MYSQL_USER: demo_user
MYSQL_PASSWORD: 123456
ports:
- "3306:3306"
volumes:
- ./volumes/mysql_data:/var/lib/mysql
PostgreSQL
services:
db:
image: postgres
restart: always
shm_size: 128mb
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 123456
TZ: Asia/Shanghai
ports:
- "5432:5432"
volumes:
- ./volumes/pg_data:/var/lib/postgresql/data
Weaviate
Để cấu hình số lượng replica tối thiểu trong trường hợp không chỉ định khi tạo collection, bạn có thể sử dụng biến môi trường REPLICATION_MINIMUM_FACTOR. Ngoài ra, việc không chỉ định hostname sẽ gây ra vấn đề với giao thức Raft.
services:
weaviate:
hostname: weaviate-node
command:
- --host
- 0.0.0.0
- --port
- '8080'
- --scheme
- http
image: semitechnologies/weaviate:1.26.7
ports:
- 8080:8080
- 50051:50051
volumes:
- ./volumes/weaviate_data:/var/lib/weaviate
- ./volumes/weaviate_backup:/var/lib/weaviate_backup
restart: on-failure:0
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none'
ENABLE_MODULES: backup-filesystem
BACKUP_FILESYSTEM_PATH: /var/lib/weaviate_backup
ENABLE_TOKENIZER_GSE: 'true'
AUTHENTICATION_APIKEY_ENABLED: 'true'
AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih'
AUTHENTICATION_APIKEY_USERS: 'admin'
AUTHORIZATION_ADMINLIST_ENABLED: 'true'
AUTHORIZATION_ADMINLIST_USERS: 'admin'
CLUSTER_HOSTNAME: 'node1'
CLUSTER_IN_LOCALHOST: true
CLUSTER_GOSSIP_BIND_PORT: 7100
CLUSTER_DATA_BIND_PORT: 7101
RAFT_BOOTSTRAP_EXPECT: 1
RAFT_BOOTSTRAP_TIMEOUT: '1800'
RAFT_ENABLE_ONE_NODE_RECOVERY: true
deploy:
resources:
limits:
cpus: '16'
memory: 128gb
reservations:
cpus: '8'
memory: 64gb
Cluster Mode
Weaviate sử dụng thuật toán Raft để đồng bộ hóa metadata giữa các nút trong cluster. Tất cả các thay đổi về metadata đều được gửi đến node leader, sau đó lan truyền đến các node follower.
Ví dụ cấu hình multi-node:
version: '3.1'
services:
weaviate-master:
hostname: weaviate-master
network_mode: "host"
command:
- --host
- 0.0.0.0
- --port
- '8080'
- --scheme
- http
image: semitechnologies/weaviate:1.26.11
restart: always
volumes:
- /data/weaviate:/var/lib/weaviate
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none'
AUTHENTICATION_APIKEY_ENABLED: 'true'
AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'your_api_key'
AUTHENTICATION_APIKEY_USERS: 'api_user'
AUTHORIZATION_ADMINLIST_ENABLED: 'true'
AUTHORIZATION_ADMINLIST_USERS: 'api_user'
ENABLE_TOKENIZER_GSE: 'true'
CLUSTER_HOSTNAME: 'master'
CLUSTER_GOSSIP_BIND_PORT: 7100
CLUSTER_DATA_BIND_PORT: 7101
RAFT_JOIN: 'master,follower1,follower2'
RAFT_BOOTSTRAP_EXPECT: 3
RAFT_BOOTSTRAP_TIMEOUT: 1800
deploy:
resources:
limits:
cpus: '16'
memory: 256gb
reservations:
cpus: '8'
memory: 64gb
Elasticsearch và Kibana
Tạo thư mục lưu trữ
mkdir -p /data/esdata01
mkdir -p /data/kibana-data01
chown 1000:1000 /data/esdata01
chown 1000:1000 /data/kibana-data01
Elasticsearch
services:
es01:
container_name: es-01
image: harbor.qihoo.net/finloan-dev/elasticsearch:8.11.3
volumes:
- /data/esdata01:/usr/share/elasticsearch/data
ports:
- 9200:9200
environment:
node.name: es01
ELASTIC_PASSWORD: 123456
bootstrap.memory_lock: false
discovery.type: single-node
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false
cluster.routing.allocation.disk.watermark.low: 5gb
cluster.routing.allocation.disk.watermark.high: 3gb
cluster.routing.allocation.disk.watermark.flood_stage: 2gb
TZ: Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:9200"]
interval: 10s
timeout: 10s
retries: 120
restart: always
deploy:
resources:
limits:
cpus: '16'
memory: 30gb
reservations:
cpus: '8'
memory: 16gb
Kibana
services:
kibana01:
container_name: kibana-01
image: harbor.qihoo.net/finloan-dev/kibana:8.11.3
ports:
- 80:5601
environment:
SERVER_NAME: kibana01
ELASTICSEARCH_HOSTS: http://es01:9200
ELASTICSEARCH_USERNAME: kibana_system
ELASTICSEARCH_PASSWORD: 123456
TZ: Asia/Shanghai
volumes:
- /data/kibana-data01:/usr/share/kibana/data
healthcheck:
test:
[
"CMD-SHELL",
"curl -s -I http://kibana:5601 | grep -q 'HTTP/1.1 302 Found'",
]
interval: 10s
timeout: 10s
retries: 30
ulimits:
memlock:
soft: -1
hard: -1
restart: always
networks:
- es_default
deploy:
resources:
limits:
cpus: '16'
memory: 30gb
reservations:
cpus: '8'
memory: 16gb
MinIO
MinIO là một giải pháp lưu trữ đối tượng nguồn mở cung cấp API tương thích với AWS S3.
services:
minio:
image: minio/minio:latest
container_name: minio-1
hostname: minio-1
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: root
MINIO_ROOT_PASSWORD: 123456
volumes:
- ./volumes/data:/data