Docker Compose作為容器編排的重要工具,極大地簡化了多容器應(yīng)用的管理和部署。本文將全面介紹Docker Compose的使用方法,從基礎(chǔ)概念到企業(yè)級部署實踐。
## Docker Compose基礎(chǔ)概念
### Compose文件結(jié)構(gòu)解析
Docker Compose的核心是docker-compose.yml文件,它定義了多容器應(yīng)用的架構(gòu)。
```yaml
# docker-compose.yml 基礎(chǔ)結(jié)構(gòu)
version: '3.8'
services:
? # 服務(wù)定義開始
? web:
? ? build: .
? ? ports:
? ? ? - "8000:8000"
? ? environment:
? ? ? - DATABASE_URL=postgresql://user:pass@db:5432/app
? ? depends_on:
? ? ? - db
? ? volumes:
? ? ? - .:/app
? ? networks:
? ? ? - app-network
? db:
? ? image: postgres:13
? ? environment:
? ? ? POSTGRES_DB: app
? ? ? POSTGRES_USER: user
? ? ? POSTGRES_PASSWORD: pass
? ? volumes:
? ? ? - postgres_data:/var/lib/postgresql/data
? ? networks:
? ? ? - app-network
? redis:
? ? image: redis:6-alpine
? ? networks:<"rat.maicaixia.cn">
? ? ? - app-network
# 網(wǎng)絡(luò)定義
networks:
? app-network:
? ? driver: bridge
# 卷定義
volumes:
? postgres_data:
```
### 基礎(chǔ)命令操作
掌握Docker Compose的核心命令是使用的第一步。
```bash
# 啟動所有服務(wù)
docker-compose up
# 后臺啟動服務(wù)
docker-compose up -d
# 指定compose文件
docker-compose -f docker-compose.prod.yml up -d
# 查看服務(wù)狀態(tài)
docker-compose ps
# 查看服務(wù)日志
docker-compose logs
docker-compose logs -f web? # 跟蹤web服務(wù)日志
# 停止服務(wù)
docker-compose down
# 停止服務(wù)并刪除卷
docker-compose down -v
# 重啟服務(wù)
docker-compose restart
# 擴(kuò)展服務(wù)實例
docker-compose up -d --scale web=3
# 執(zhí)行命令
docker-compose exec web bash
docker-compose exec db psql -U user app
```
## 開發(fā)環(huán)境配置
### 完整的開發(fā)環(huán)境示例
為開發(fā)團(tuán)隊提供標(biāo)準(zhǔn)化的開發(fā)環(huán)境。
```yaml
# docker-compose<"high.maicaixia.cn">.dev.yml
version: '3.8'
services:
? frontend:
? ? build:
? ? ? context: ./frontend
? ? ? dockerfile: Dockerfile.dev
? ? ports:
? ? ? - "3000:3000"
? ? volumes:
? ? ? - ./frontend:/app
? ? ? - /app/node_modules
? ? environment:
? ? ? - NODE_ENV=development
? ? ? - REACT_APP_API_URL=http://localhost:8000/api
? ? depends_on:
? ? ? - backend
? ? networks:
? ? ? - app-network
? backend:
? ? build:
? ? ? context: ./backend
? ? ? dockerfile: Dockerfile.dev
? ? ports:
? ? ? - "8000:8000"
? ? volumes:
? ? ? - ./backend:/app
? ? ? - /app/__pycache__
? ? environment:
? ? ? - DEBUG=True
? ? ? - DATABASE_URL=postgresql://devuser:devpass@db:5432/devdb
? ? ? - REDIS_URL=redis://redis:6379/0
? ? depends_on:
? ? ? - db
? ? ? - redis
? ? networks:
? ? ? - app-network
? db:
? ? image: postgres:13
? ? environment:
? ? ? POSTGRES_DB: devdb
? ? ? POSTGRES_USER: devuser
? ? ? POSTGRES_PASSWORD: devpass
? ? ports:
? ? ? - "5432:5432"? # 方便本地連接
? ? volumes:
? ? ? - postgres_data:/var/lib/postgresql/data
? ? ? - ./init.sql:/docker-entrypoint-initdb.d/init.sql
? ? networks:
? ? ? - app-network
? redis:
? ? image: redis:6-alpine
? ? ports:
? ? ? - "6379:6379"
? ? networks:
? ? ? - app-network
? # 開發(fā)工具
? mailhog:
? ? image: mailhog/mailhog<"neixit.maicaixia.cn">
? ? ports:
? ? ? - "1025:1025"? # SMTP
? ? ? - "8025:8025"? # Web UI
? ? networks:
? ? ? - app-network
volumes:
? postgres_data:
networks:
? app-network:
? ? driver: bridge
```
### 開發(fā)環(huán)境啟動腳本
```bash
#!/bin/bash
# dev-setup.sh
set -e
echo "=== 開發(fā)環(huán)境設(shè)置 ==="
# 檢查Docker是否運行
if ! docker info > /dev/null 2>&1; then
? ? echo "錯誤: Docker守護(hù)進(jìn)程未運行"
? ? exit 1
fi
# 創(chuàng)建環(huán)境文件
if [ ! -f .env.dev ]; then
? ? cat > .env.dev << EOF
# 開發(fā)環(huán)境配置
COMPOSE_PROJECT_NAME=myapp_dev
DEBUG=True
DATABASE_URL=postgresql://devuser:devpass@db:5432/devdb
REDIS_URL=redis://redis:6379/0
EOF
? ? echo "創(chuàng)建 .env.dev 文件"
fi
# 構(gòu)建并啟動服務(wù)
echo "構(gòu)建和啟動開發(fā)環(huán)境..."
docker-compose -f docker-compose.dev.yml up -d --build
echo "等待服務(wù)啟動..."
sleep 10
# 檢查服務(wù)狀態(tài)
echo "服務(wù)狀態(tài):"
docker-compose <"note.maicaixia.cn">-f docker-compose.dev.yml ps
# 運行數(shù)據(jù)庫遷移
echo "運行數(shù)據(jù)庫遷移..."
docker-compose -f docker-compose.dev.yml exec backend python manage.py migrate
echo "開發(fā)環(huán)境就緒!"
echo "前端: http://localhost:3000"
echo "后端API: http://localhost:8000"
echo "郵件測試: http://localhost:8025"
```
## 生產(chǎn)環(huán)境配置
### 生產(chǎn)級Compose配置
生產(chǎn)環(huán)境需要關(guān)注性能、安全和可靠性。
```yaml
# docker-compose.prod.yml
version: '3.8'
services:
? nginx:
? ? image: nginx:1.21-alpine
? ? ports:
? ? ? - "80:80"
? ? ? - "443:443"
? ? volumes:
? ? ? - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
? ? ? - ./ssl:/etc/nginx/ssl:ro
? ? ? - static_volume:/app/static
? ? ? - media_volume:/app/media
? ? depends_on:
? ? ? - web
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
? web:
? ? build:
? ? ? context: .
? ? ? dockerfile: Dockerfile.prod
? ? environment:
? ? ? - DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
? ? ? - REDIS_URL=redis://redis:6379/0
? ? ? - DEBUG=False
? ? ? - SECRET_KEY<"ill.maicaixia.cn">=${SECRET_KEY}
? ? volumes:
? ? ? - static_volume:/app/static
? ? ? - media_volume:/app/media
? ? depends_on:
? ? ? - db
? ? ? - redis
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
? ? deploy:
? ? ? replicas: 3
? ? ? update_config:
? ? ? ? parallelism: 1
? ? ? ? delay: 10s
? ? ? restart_policy:
? ? ? ? condition: on-failure
? ? ? ? delay: 5s
? ? ? ? max_attempts: 3
? ? ? ? window: 120s
? celery_worker:
? ? build:
? ? ? context: .
? ? ? dockerfile: Dockerfile.prod
? ? command: celery -A app worker -l info
? ? environment:
? ? ? - DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
? ? ? - REDIS_URL=redis://redis:6379/0
? ? depends_on:
? ? ? - db
? ? ? - redis
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
? ? deploy:
? ? ? replicas: 2
? celery_beat:
? ? build:
? ? ? context: .
? ? ? dockerfile: Dockerfile.prod
? ? command: celery -A app beat -l info
? ? environment:
? ? ? - DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
? ? ? - REDIS_URL=redis://redis:6379/0
? ? depends_on:
? ? ? - db
? ? ? - redis
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
? db:
? ? image: postgres:13
? ? environment:
? ? ? POSTGRES_DB: ${DB_NAME}
? ? ? POSTGRES_USER: ${DB_USER}
? ? ? POSTGRES_PASSWORD: ${DB_PASSWORD}
? ? volumes:
? ? ? - postgres_data:/var/lib/postgresql/data
? ? ? - ./backups:/backups
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
? ? command: >
? ? ? postgres
? ? ? -c shared_preload<"buzzword.maicaixia.cn">_libraries=pg_stat_statements
? ? ? -c pg_stat_statements.track=all
? ? ? -c max_connections=200
? redis:
? ? image: redis:6-alpine
? ? command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
? ? volumes:
? ? ? - redis_data:/data
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
volumes:
? postgres_data:
? redis_data:
? static_volume:
? media_volume:
networks:
? app-network:
? ? driver: bridge
```
### 生產(chǎn)環(huán)境部署腳本
```bash
#!/bin/bash
# deploy-prod.sh
set -e
ENV_FILE=".env.prod"
COMPOSE_FILE="docker-compose.prod.yml"
echo "=== 生產(chǎn)環(huán)境部署 ==="
# 檢查環(huán)境文件
if [ ! -f "$ENV_FILE" ]; then
? ? echo "錯誤: 找不到環(huán)境文件 $ENV_FILE"
? ? exit 1
fi
# 加載環(huán)境變量
export $(grep -v '^#' $ENV_FILE | xargs)
# 創(chuàng)建必要的目錄
mkdir -p nginx/ssl backups
# 生成SSL證書(如果不存在)
if [ ! -f nginx/ssl/cert.pem ]; then
? ? echo "生成自簽名SSL證書..."
? ? openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
? ? ? ? -keyout nginx/ssl/key.pem \
? ? ? ? -out nginx/ssl/cert.pem \
? ? ? ? -subj "/C=US/ST<"iron.maicaixia.cn">=State/L=City/O=Org/CN=example.com"
fi
# 停止現(xiàn)有服務(wù)
echo "停止現(xiàn)有服務(wù)..."
docker-compose -f $COMPOSE_FILE down
# 拉取最新鏡像
echo "拉取最新鏡像..."
docker-compose -f $COMPOSE_FILE pull
# 啟動服務(wù)
echo "啟動服務(wù)..."
docker-compose -f $COMPOSE_FILE up -d
# 健康檢查
echo "執(zhí)行健康檢查..."
sleep 30
# 檢查服務(wù)狀態(tài)
echo "服務(wù)狀態(tài):"
docker-compose -f $COMPOSE_FILE ps
# 檢查Web服務(wù)健康
if curl -f http://localhost/health > /dev/null 2>&1; then
? ? echo "? 應(yīng)用健康檢查通過"
else
? ? echo "? 應(yīng)用健康檢查失敗"
? ? exit 1
fi
echo "生產(chǎn)環(huán)境部署完成!"
```
## 多環(huán)境配置管理
### 環(huán)境特定配置
使用擴(kuò)展文件管理不同環(huán)境的配置。
```yaml
# docker-compose.base.yml - 基礎(chǔ)配置
version: '3.8'
services:
? web:
? ? build: .
? ? environment:
? ? ? - DATABASE_URL=${DATABASE_URL}
? ? ? - REDIS_URL=${REDIS_URL}
? ? networks:
? ? ? - app-network
? ? healthcheck:
? ? ? test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
? ? ? interval: 30s
? ? ? timeout: 10s
? ? ? retries: 3
? db:
? ? image: postgres:13
? ? environment:
? ? ? POSTGRES_DB: ${DB_NAME}
? ? ? POSTGRES_USER: ${DB_USER}
? ? ? POSTGRES_PASSWORD: ${DB_PASSWORD}
? ? volumes:
? ? ? - postgres_data:/var/lib/postgresql/data
? ? networks:
? ? ? - app-network
networks:
? app-network:
volumes:
? postgres_data:
```
```yaml
# docker-compose.override.yml - 開發(fā)環(huán)境擴(kuò)展
version: '3.8'
services:
? web:
? ? build:
? ? ? context: .
? ? ? dockerfile: Dockerfile.dev
? ? ports:
? ? ? - "8000:8000"
? ? volumes:
? ? ? - .:/app
? ? environment:
? ? ? - DEBUG=True
? ? ? - RELOAD=True
? db:
? ? ports:
? ? ? - "5432:5432"
```
```yaml
# docker-compose.prod.yml<"snake.maicaixia.cn"> - 生產(chǎn)環(huán)境擴(kuò)展
version: '3.8'
services:
? web:
? ? build:
? ? ? context: .
? ? ? dockerfile: Dockerfile.prod
? ? restart: unless-stopped
? ? deploy:
? ? ? replicas: 3
? nginx:
? ? image: nginx:1.21-alpine
? ? ports:
? ? ? - "80:80"
? ? ? - "443:443"
? ? volumes:
? ? ? - ./nginx.conf:/etc/nginx/nginx.conf:ro
? ? depends_on:
? ? ? - web
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
```
### 環(huán)境配置腳本
```bash
#!/bin/bash
# env-setup.sh
ENVIRONMENT=${1:-dev}
case $ENVIRONMENT in
? ? dev)
? ? ? ? ENV_FILE=".env.dev"
? ? ? ? COMPOSE_FILES="-f docker-compose.base.yml -f docker-compose.override.yml"
? ? ? ? ;;
? ? staging)
? ? ? ? ENV_FILE=".env.staging"
? ? ? ? COMPOSE_FILES="-f docker-compose.base.yml -f docker-compose.staging.yml"
? ? ? ? ;;
? ? prod)
? ? ? ? ENV_FILE=".env.prod"
? ? ? ? COMPOSE_FILES="-f docker-compose.base.yml -f docker-compose.prod.yml"
? ? ? ? ;;
? ? *)
? ? ? ? echo "用法: $0 {dev|staging|prod}"
? ? ? ? exit 1
? ? ? ? ;;
esac
if [ ! -f "$ENV_FILE" ]; then
? ? echo "錯誤: 找不到環(huán)境文件 $ENV_FILE"
? ? echo "請從模板創(chuàng)建: cp .env.example $ENV_FILE"
? ? exit 1
fi
# 設(shè)置環(huán)境變量
export COMPOSE_PROJECT_NAME="myapp_${ENVIRONMENT}"
export $(grep -v '^#' $ENV_FILE | xargs)
echo "環(huán)境: $ENVIRONMENT"
echo "項目: $COMPOSE_PROJECT_NAME"
# 執(zhí)行docker-compose命令
shift
docker-compose $COMPOSE_FILES "$@"
```
## 企業(yè)級部署實踐
### 高可用架構(gòu)
構(gòu)建支持高可用的生產(chǎn)環(huán)境。
```yaml
# docker-compose.ha.yml
version: '3.8'
services:
? haproxy:
? ? image: haproxy:2.4
? ? ports:
? ? ? - "80:80"
? ? ? - "443:443"
? ? volumes:
? ? ? - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
? ? ? - ./ssl:/etc/ssl:ro
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
? ? deploy:
? ? ? replicas: 2
? web:
? ? build: .
? ? environment:
? ? ? - DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
? ? ? - REDIS_URL=redis://redis:6379/0
? ? networks:
? ? ? - app-network
? ? restart: unless-<"tree.maicaixia.cn">stopped
? ? deploy:
? ? ? replicas: 5
? ? ? update_config:
? ? ? ? parallelism: 2
? ? ? ? delay: 10s
? ? ? ? order: start-first
? ? ? rollback_config:
? ? ? ? parallelism: 0
? ? ? ? order: stop-first
? ? ? restart_policy:
? ? ? ? condition: any
? ? ? ? delay: 5s
? ? ? ? max_attempts: 3
? ? ? ? window: 120s
? ? ? resources:
? ? ? ? limits:
? ? ? ? ? cpus: '1'
? ? ? ? ? memory: 1G
? ? ? ? reservations:
? ? ? ? ? cpus: '0.5'
? ? ? ? ? memory: 512M
? db:
? ? image: postgres:13
? ? environment:
? ? ? POSTGRES_DB: ${DB_NAME}
? ? ? POSTGRES_USER: ${DB_USER}
? ? ? POSTGRES_PASSWORD: ${DB_PASSWORD}
? ? volumes:
? ? ? - postgres_data:/var/lib/postgresql/data
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
? ? deploy:
? ? ? placement:
? ? ? ? constraints:
? ? ? ? ? - node.role == manager
? redis:
? ? image: redis:6-alpine
? ? command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
? ? volumes:
? ? ? - redis_data:/data
? ? networks:
? ? ? - app-network
? ? restart: unless-stopped
? ? deploy:
? ? ? replicas: 3
volumes:
? postgres_data:
? ? driver: local
? redis_data:
? ? driver: local
networks:
? app-network:
? ? driver: overlay
? ? attachable: true
```
### 監(jiān)控和日志管理
集成監(jiān)控和日志收集。
```yaml
# docker-compose.monitoring.yml
version: '3.8'
services:
? prometheus:
? ? image: prom/prometheus
? ? ports:
? ? ? - "9090:9090"
? ? volumes:
? ? ? - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
? ? ? - prometheus_data:/prometheus
? ? command:
? ? ? - '--config.file=/etc/prometheus/prometheus.yml'
? ? ? - '--storage.tsdb.path=/prometheus'
? ? ? - '--web.console.libraries=/etc/prometheus/console_libraries'
? ? ? - '--web.console.templates=/etc/prometheus/console_templates'
? ? ? - '--storage.tsdb.retention.time=200h'
? ? ? - '--web.enable-lifecycle'
? ? networks:
? ? ? - monitoring
? ? restart: unless-stopped
? grafana:
? ? image: grafana/grafana
? ? ports:
? ? ? - "3000:3000"
? ? environment:
? ? ? - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
? ? volumes:
? ? ? - grafana_data:/var/lib/grafana
? ? ? - ./grafana/dashboards:/etc/grafana/provisioning/dashboards
? ? ? - ./grafana/datasources:/etc/grafana/provisioning/datasources
? ? networks:
? ? ? - monitoring
? ? restart: unless-stopped
? ? depends_on:
? ? ? - prometheus
? node-exporter:
? ? image: prom/node-exporter
? ? volumes:
? ? ? - /proc:/host/proc:ro
? ? ? - /sys:/host/sys:ro
? ? ? - /:/rootfs:ro
? ? command:
? ? ? - '--path.procfs=/host/proc'
? ? ? - '--path.sysfs=/host/sys'
? ? ? - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
? ? networks:
? ? ? - monitoring
? ? restart: unless-stopped
? ? deploy:
? ? ? mode: global
? cadvisor:
? ? image: gcr.io/cadvisor/cadvisor
? ? volumes:
? ? ? - /:/rootfs:ro
? ? ? - /var/run:/var/run:ro
? ? ? - /sys:/sys:ro
? ? ? - /var/lib/docker/:/var/lib/docker:ro
? ? ? - /dev/disk/:/dev/disk:ro
? ? ports:
? ? ? - "8080:8080"
? ? networks:
? ? ? - monitoring
? ? restart: unless<"fomo.maicaixia.cn">-stopped
? ? deploy:
? ? ? mode: global
volumes:
? prometheus_data:
? grafana_data:
networks:
? monitoring:
? ? driver: overlay
```
## 安全最佳實踐
### 安全加固配置
```yaml
# docker-compose.secure.yml
version: '3.8'
services:
? web:
? ? build: .
? ? user: "1000:1000"? # 非root用戶
? ? read_only: true
? ? security_opt:
? ? ? - no-new-privileges:true
? ? tmpfs:
? ? ? - /tmp
? ? ? - /var/tmp
? ? cap_drop:
? ? ? - ALL
? ? cap_add:
? ? ? - CHOWN
? ? ? - SETGID
? ? ? - SETUID
? ? environment:
? ? ? - DB_USER_FILE=/run/secrets/db_user
? ? ? - DB_PASSWORD_FILE=/run/secrets/db_password
? ? secrets:
? ? ? - db_user
? ? ? - db_password
? ? networks:
? ? ? - app-network
? db:
? ? image: postgres:13
? ? user: "999:999"? # postgres用戶
? ? read_only: false
? ? security_opt:
? ? ? - no-new-privileges:true
? ? environment:
? ? ? POSTGRES_DB: myapp
? ? ? POSTGRES_USER_FILE: /run/secrets/db_user
? ? ? POSTGRES_PASSWORD_FILE: /run/secrets/db_password
? ? secrets:
? ? ? - db_user
? ? ? - db_password
? ? volumes:
? ? ? - postgres_data:/var/lib/postgresql/data
? ? networks:
? ? ? - app-network
secrets:
? db_user:
? ? file: ./secrets/db_user.txt
? db_password:
? ? file: ./secrets/db_password.txt
volumes:
? postgres_data:
networks:
? app-network:
? ? driver: bridge
```
### 安全部署腳本
```bash
#!/bin/bash
# secure-deploy.sh
set -e
echo "=== 安全部署檢查 ==="
# 檢查敏感文件權(quán)限
check_file_permissions() {
? ? local file=$1
? ? if [ -f "$file" ]; then
? ? ? ? local perm=$(stat -c "%a" "$file")
? ? ? ? if [ "$perm" -gt 600 ]; then
? ? ? ? ? ? echo "警告: $file 權(quán)限過寬 ($perm)"
? ? ? ? ? ? return 1
? ? ? ? fi
? ? fi
}
# 檢查環(huán)境變量
check_env_vars() {
? ? local env_file=$1
? ? if grep -q "PASSWORD\|SECRET\|KEY" "$env_file"; then
? ? ? ? echo "警告: $env_file 包含敏感信息"
? ? ? ? echo "建議使用Docker Secrets"
? ? fi
}
# 檢查鏡像簽名
check_image_security() {
? ? local image=$1
? ? if ! docker trust inspect "$image" > /dev/null 2>&1; then
? ? ? ? echo "警告: $image 未簽名"
? ? fi
}
# 執(zhí)行檢查
check_file_permissions ".env.prod"
check_env_vars ".env.prod"
echo "安全檢查完成"
```
## 持續(xù)集成與部署
### CI/CD集成示例
```yaml
# .gitlab-ci.yml
stages:
? - test
? - build
? - deploy
variables:
? DOCKER_HOST: tcp://docker:2375
? DOCKER_DRIVER: overlay2
services:
? - docker:dind
before_script:
? - apk add --no-cache docker-compose
test:
? stage: test
? script:
? ? - docker-compose -f docker-compose.test.yml up -d
? ? - docker-compose -f docker-compose.test.yml exec web pytest
? ? - docker-compose -f docker-compose.test.yml down
build:
? stage: build
? script:
? ? - docker-compose -f docker-compose.prod.yml build
? ? - docker tag myapp_web:latest registry.example.com/myapp/web:${CI_COMMIT_SHA}
? ? - docker push registry.example.com/myapp/web:${CI_COMMIT_SHA}
? only:
? ? - main
deploy:
? stage: deploy
? script:
? ? - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
? ? - docker-compose -f docker-compose.prod.yml pull
? ? - docker-compose -f docker-compose.prod.yml up -d
? ? - docker-compose -f docker-compose.prod.yml exec web python manage.py migrate
? environment:
? ? name: production
? ? url: https://example.com
? only:
? ? - main
```
## 結(jié)語
Docker Compose作為容器化應(yīng)用部署的重要工具,從簡單的開發(fā)環(huán)境到復(fù)雜的企業(yè)級生產(chǎn)部署都能提供有力支持。通過合理的配置管理、安全加固和自動化部署,可以構(gòu)建出穩(wěn)定、可靠、易維護(hù)的容器化應(yīng)用架構(gòu)。
掌握Docker Compose的進(jìn)階特性,結(jié)合企業(yè)實際需求制定合適的部署策略,將顯著提升應(yīng)用交付的效率和質(zhì)量。隨著云原生技術(shù)的發(fā)展,Docker Compose仍然是容器編排領(lǐng)域不可或缺的重要工具。