2025-11-21 Docker Compose實戰(zhàn)指南:從開發(fā)測試到生產(chǎn)環(huán)境部署

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)域不可或缺的重要工具。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容