本文目录导读:

我来介绍几种用脚本自动配置Docker Compose的方法:
Bash脚本自动生成docker-compose.yml
#!/bin/bash
# 配置参数
PROJECT_NAME="myapp"
MYSQL_ROOT_PASSWORD="root123"
REDIS_PASSWORD="redis123"
# 生成docker-compose.yml
cat > docker-compose.yml << EOF
version: '3.8'
services:
# Web应用
app:
image: nginx:latest
container_name: ${PROJECT_NAME}-web
ports:
- "80:80"
- "443:443"
volumes:
- ./www:/usr/share/nginx/html
- ./nginx/conf.d:/etc/nginx/conf.d
networks:
- app-network
restart: always
# MySQL数据库
mysql:
image: mysql:8.0
container_name: ${PROJECT_NAME}-mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${PROJECT_NAME}
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
restart: always
# Redis缓存
redis:
image: redis:7-alpine
container_name: ${PROJECT_NAME}-redis
command: redis-server --requirepass ${REDIS_PASSWORD}
ports:
- "6379:6379"
volumes:
- redis-data:/data
networks:
- app-network
restart: always
networks:
app-network:
driver: bridge
volumes:
mysql-data:
redis-data:
EOF
# 创建必要的目录
mkdir -p ./www ./nginx/conf.d
# 启动服务
docker-compose up -d
echo "✅ Docker Compose 配置完成!"
echo "Web: http://localhost"
echo "MySQL: 端口 3306, 密码: ${MYSQL_ROOT_PASSWORD}"
echo "Redis: 端口 6379, 密码: ${REDIS_PASSWORD}"
交互式配置脚本
#!/bin/bash
# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${GREEN}Docker Compose 自动配置脚本${NC}"
echo "--------------------------------"
# 交互式配置
read -p "请输入项目名称 [myapp]: " PROJECT_NAME
PROJECT_NAME=${PROJECT_NAME:-myapp}
read -p "请输入Web端口 [80]: " WEB_PORT
WEB_PORT=${WEB_PORT:-80}
read -p "是否启用MySQL (y/n) [y]: " ENABLE_MYSQL
ENABLE_MYSQL=${ENABLE_MYSQL:-y}
if [ "$ENABLE_MYSQL" = "y" ]; then
read -p "MySQL端口 [3306]: " MYSQL_PORT
MYSQL_PORT=${MYSQL_PORT:-3306}
read -s -p "MySQL密码 [root123]: " MYSQL_PASSWORD
MYSQL_PASSWORD=${MYSQL_PASSWORD:-root123}
echo ""
read -p "MySQL数据库名 [${PROJECT_NAME}]: " MYSQL_DB
MYSQL_DB=${MYSQL_DB:-$PROJECT_NAME}
fi
read -p "是否启用Redis (y/n) [y]: " ENABLE_REDIS
ENABLE_REDIS=${ENABLE_REDIS:-y}
if [ "$ENABLE_REDIS" = "y" ]; then
read -p "Redis端口 [6379]: " REDIS_PORT
REDIS_PORT=${REDIS_PORT:-6379}
read -s -p "Redis密码 [redis123]: " REDIS_PASSWORD
REDIS_PASSWORD=${REDIS_PASSWORD:-redis123}
echo ""
fi
# 生成配置文件
generate_compose() {
cat > docker-compose.yml << EOF
version: '3.8'
services:
# Web应用
app:
image: nginx:latest
container_name: ${PROJECT_NAME}-web
ports:
- "${WEB_PORT}:80"
volumes:
- ./www:/usr/share/nginx/html
- ./nginx/conf.d:/etc/nginx/conf.d
networks:
- app-network
restart: always
EOF
# MySQL配置
if [ "$ENABLE_MYSQL" = "y" ]; then
cat >> docker-compose.yml << EOF
# MySQL数据库
mysql:
image: mysql:8.0
container_name: ${PROJECT_NAME}-mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DB}
ports:
- "${MYSQL_PORT}:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
restart: always
EOF
fi
# Redis配置
if [ "$ENABLE_REDIS" = "y" ]; then
cat >> docker-compose.yml << EOF
# Redis缓存
redis:
image: redis:7-alpine
container_name: ${PROJECT_NAME}-redis
command: redis-server --requirepass ${REDIS_PASSWORD}
ports:
- "${REDIS_PORT}:6379"
volumes:
- redis-data:/data
networks:
- app-network
restart: always
EOF
fi
# 网络和卷配置
cat >> docker-compose.yml << EOF
networks:
app-network:
driver: bridge
volumes:
EOF
if [ "$ENABLE_MYSQL" = "y" ]; then
echo " mysql-data:" >> docker-compose.yml
fi
if [ "$ENABLE_REDIS" = "y" ]; then
echo " redis-data:" >> docker-compose.yml
fi
}
# 执行配置
generate_compose
# 创建目录
mkdir -p ./www ./nginx/conf.d
echo -e "\n${GREEN}✅ 配置生成完成!${NC}"
echo "配置文件: docker-compose.yml"
echo "项目目录: $(pwd)"
echo ""
echo -e "${YELLOW}执行以下命令启动:${NC}"
echo "docker-compose up -d"
多环境配置脚本
#!/bin/bash
# 环境变量配置
ENV=${1:-dev}
case $ENV in
dev)
# 开发环境配置
cat > .env << EOF
COMPOSE_PROJECT_NAME=myapp-dev
APP_ENV=development
APP_PORT=8080
MYSQL_PORT=3307
REDIS_PORT=6380
MYSQL_PASSWORD=dev123
REDIS_PASSWORD=dev123
EOF
;;
staging)
# 预发布环境配置
cat > .env << EOF
COMPOSE_PROJECT_NAME=myapp-staging
APP_ENV=staging
APP_PORT=8088
MYSQL_PORT=3308
REDIS_PORT=6381
MYSQL_PASSWORD=staging123
REDIS_PASSWORD=staging123
EOF
;;
production)
# 生产环境配置
read -s -p "请输入MySQL密码: " MYSQL_PASSWORD
echo ""
read -s -p "请输入Redis密码: " REDIS_PASSWORD
echo ""
cat > .env << EOF
COMPOSE_PROJECT_NAME=myapp-prod
APP_ENV=production
APP_PORT=80
MYSQL_PORT=3306
REDIS_PORT=6379
MYSQL_PASSWORD=${MYSQL_PASSWORD}
REDIS_PASSWORD=${REDIS_PASSWORD}
EOF
;;
*)
echo "用法: $0 {dev|staging|production}"
exit 1
;;
esac
echo "✅ 环境 '${ENV}' 配置完成!"
自动化部署脚本
#!/bin/bash
# 完整的自动化部署脚本
set -e
echo "🚀 开始自动部署..."
# 1. 检查依赖
check_dependencies() {
echo "检查依赖..."
if ! command -v docker &> /dev/null; then
echo "❌ Docker 未安装"
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
echo "❌ Docker Compose 未安装"
exit 1
fi
}
# 2. 拉取最新代码
pull_latest_code() {
echo "拉取最新代码..."
if [ -d ".git" ]; then
git pull origin main
else
echo "⚠️ 不是Git仓库,跳过代码更新"
fi
}
# 3. 生成配置文件
generate_config() {
echo "生成配置文件..."
# 备份旧的配置文件
if [ -f "docker-compose.yml" ]; then
cp docker-compose.yml docker-compose.yml.bak
echo "备份旧的配置文件: docker-compose.yml.bak"
fi
# 使用环境变量生成新配置
envsubst < docker-compose.template.yml > docker-compose.yml
}
# 4. 清理旧容器和镜像
clean_old_containers() {
echo "清理旧容器..."
# 停止并删除旧容器
docker-compose down --remove-orphans
# 删除未被使用的镜像
docker image prune -f
# 删除未被使用的卷
docker volume prune -f
}
# 5. 构建和启动新服务
build_and_start() {
echo "构建新服务..."
# 构建镜像
docker-compose build --no-cache
# 启动服务
docker-compose up -d --remove-orphans
}
# 6. 健康检查
health_check() {
echo "执行健康检查..."
sleep 10
# 检查容器状态
docker-compose ps
# 检查服务是否正常运行
if docker-compose ps | grep -q "Up"; then
echo "✅ 服务启动成功!"
else
echo "❌ 服务启动失败,请检查日志"
docker-compose logs
exit 1
fi
}
# 7. 输出信息
show_info() {
echo ""
echo "========================================="
echo " 📋 部署信息"
echo "========================================="
echo " 部署时间: $(date)"
echo " 项目版本: $(git rev-parse --short HEAD 2>/dev/null || echo 'N/A')"
echo " 运行容器:"
docker-compose ps --services
echo "========================================="
}
# 主函数
main() {
check_dependencies
pull_latest_code
generate_config
clean_old_containers
build_and_start
health_check
show_info
echo ""
echo "🎉 部署完成!"
}
# 执行部署
main
使用Python脚本进行高级配置
#!/usr/bin/env python3
import os
import json
import yaml
from pathlib import Path
class DockerComposeGenerator:
def __init__(self):
self.config = {
'version': '3.8',
'services': {},
'networks': {
'app-network': {
'driver': 'bridge'
}
},
'volumes': {}
}
def add_web_service(self, name='app', port=80, image='nginx:latest'):
self.config['services'][name] = {
'image': image,
'container_name': f'{name}-web',
'ports': [f'{port}:80'],
'volumes': [
'./www:/usr/share/nginx/html',
'./nginx/conf.d:/etc/nginx/conf.d'
],
'networks': ['app-network'],
'restart': 'always'
}
def add_mysql_service(self, name='mysql', port=3306, password='root123', db='myapp'):
self.config['services'][name] = {
'image': 'mysql:8.0',
'container_name': f'{name}-mysql',
'environment': {
'MYSQL_ROOT_PASSWORD': password,
'MYSQL_DATABASE': db
},
'ports': [f'{port}:3306'],
'volumes': ['mysql-data:/var/lib/mysql'],
'networks': ['app-network'],
'restart': 'always'
}
self.config['volumes']['mysql-data'] = {}
def add_redis_service(self, name='redis', port=6379, password='redis123'):
self.config['services'][name] = {
'image': 'redis:7-alpine',
'container_name': f'{name}-redis',
'command': f'redis-server --requirepass {password}',
'ports': [f'{port}:6379'],
'volumes': ['redis-data:/data'],
'networks': ['app-network'],
'restart': 'always'
}
self.config['volumes']['redis-data'] = {}
def generate(self, filename='docker-compose.yml'):
with open(filename, 'w') as f:
yaml.dump(self.config, f, default_flow_style=False)
print(f'✅ 配置文件已生成: {filename}')
def deploy(self):
os.system('docker-compose up -d')
print('✅ 服务已启动')
# 使用示例
if __name__ == '__main__':
generator = DockerComposeGenerator()
# 添加服务
generator.add_web_service(port=8080)
generator.add_mysql_service(password='myapp123')
generator.add_redis_service(password='redis123')
# 生成配置并部署
generator.generate()
generator.deploy()
使用建议
-
权限设置:给脚本添加执行权限
chmod +x script.sh
-
版本控制:将脚本添加到Git仓库
git add script.sh git commit -m "添加自动部署脚本"
-
定时任务:配合crontab实现自动部署
# 每天凌晨2点执行 0 2 * * * /path/to/deploy.sh production
这些脚本可以根据你的具体需求进行定制和扩展。