python(43) : docker compose部署python服务

Docker Compose部署Python服务

1.前言

docker compose基于python镜像启动容器, 支持多实例

2.环境信息

系统: Alibaba Cloud Linux release 3 (OpenAnolis Edition)

架构: x86_64

docker版本: Docker version 26.1.3, build b72abbb

3.部署文件

3.1.Dockerfile

FROM python:3.10-slim

# 设置工作目录
WORKDIR /app

# 设置环境变量
ENV PYTHONPATH=/app
ENV PYTHONUNBUFFERED=1

# 复制应用代码(从项目根目录复制)
COPY . .

# 防止.env.prod不存在报错
RUN touch /app/.env.prod 
# 删除原有.env文件(如果存在),并将.env.prod重命名为.env
RUN rm -f /app/.env && \
    if [ -f /app/.env.prod ]; then mv /app/.env.prod /app/.env; fi

# 更新pip
RUN python -m pip install --upgrade pip  -i https://mirrors.aliyun.com/pypi/simple/ requests

# 根据requirements.txt文件安装依赖(可选)
RUN pip install --no-cache-dir -r requirements.txt  -i https://mirrors.aliyun.com/pypi/simple/ requests

# 安装其他依赖(可选)
#RUN pip install --upgrade Flask -i https://mirrors.aliyun.com/pypi/simple/ requests

# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone


# 创建日志目录
RUN mkdir -p /app/logs

# 设置非root用户
RUN useradd --create-home --shell /bin/bash app && \
    chown -R app:app /app
USER app

# 暴露端口(如果需要的话)
#EXPOSE 8888

# 启动命令
CMD ["python", "main.py"]

3.2.docker-compose.yml

{SERVER_CODE} 需要替换为服务编码

services:
  {SERVER_CODE}:
    build:
      context: .
      dockerfile: Dockerfile
    restart: unless-stopped
    volumes:
      - ./logs:/app/logs  # 挂载日志卷
    networks:
      - {SERVER_CODE}_network
    healthcheck:
      test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

networks:
  {SERVER_CODE}_network:
    driver: bridge

3.3.deploy.sh

#!/bin/bash

# 使用方法: ./deploy.sh [start|stop|restart|status|logs|scale]

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 服务名称
SERVER_NAME="xxx"
# 服务编码
SERVER_CODE="test_xxx"

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查Docker和Docker Compose是否安装
check_dependencies() {
    log_info "检查依赖..."
    
    if ! command -v docker &> /dev/null; then
        log_error "Docker未安装,请先安装Docker"
        exit 1
    fi
    
    if ! command -v docker compose &> /dev/null; then
        log_error "Docker Compose未安装,请先安装Docker Compose"
        exit 1
    fi
    
    log_success "依赖检查通过"
}


# 启动服务
start_services() {
    # 在 docker-compose.yml 所在目录执行
    mkdir -p ./logs
    # 775不行
    chmod 777 ./logs
    
    log_info "启动${SERVER_NAME}..."
    check_dependencies
    
    # 构建镜像
    log_info "构建Docker镜像..."
    docker compose build --no-cache
    
    # 启动服务
    log_info "启动服务..."
    docker compose up -d
    
    # 等待服务启动
    log_info "等待服务启动..."
    sleep 3
    
    log_success "服务启动完成!"
}

# 停止服务
stop_services() {
    log_info "停止${SERVER_NAME}..."
    docker compose down
    log_success "服务已停止"
}

# 重启服务
restart_services() {
    log_info "重启${SERVER_NAME}..."
    stop_services
    sleep 5
    start_services
}


# 显示服务状态
show_status() {
    log_info "${SERVER_NAME}状态:"
    docker compose ps
    
    echo ""
    log_info "${SERVER_NAME}日志 (最近50行):"
    docker compose logs --tail=50
}

# 显示实时日志
show_logs() {
    log_info "显示${SERVER_NAME}最新200行日志:"
    docker compose logs --tail=200 -f
}

# 扩缩容
scale_services() {
    if [ -z "$2" ]; then
        log_error "请指定实例数量,例如: ./deploy.sh scale 3"
        exit 1
    fi
    
    local instances=$2
    log_info "扩缩容到 $instances 个实例..."
    
    # 更新环境变量
    if grep -q "WORKER_INSTANCES=" .env; then
        sed -i "s/WORKER_INSTANCES=.*/WORKER_INSTANCES=$instances/" .env
    else
        echo "WORKER_INSTANCES=$instances" >> .env
    fi
    
    # 重新启动服务
    docker compose down
    docker compose up -d --scale ${SERVER_CODE}=$instances
    
    log_success "扩缩容完成,当前实例数: $instances"
}

# 清理资源
cleanup() {
    log_info "清理Docker资源..."
    docker compose down -v
    docker system prune -f
    log_success "清理完成"
}

# 显示帮助信息
show_help() {
    echo "${SERVER_NAME}部署脚本"
    echo ""
    echo "使用方法:"
    echo "  $0 start     - 启动服务"
    echo "  $0 stop      - 停止服务"
    echo "  $0 restart   - 重启服务"
    echo "  $0 status    - 查看服务状态"
    echo "  $0 logs      - 查看实时日志"
    echo "  $0 scale N   - 扩缩容到N个实例"
    echo "  $0 cleanup   - 清理Docker资源"
    echo "  $0 help      - 显示帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 start                    # 启动服务"
    echo "  $0 scale 5                  # 扩容到5个实例"
    echo "  $0 logs                     # 查看日志"
}

# 主函数
main() {
    case "${1:-help}" in
        start)
            start_services
            ;;
        stop)
            stop_services
            ;;
        restart)
            restart_services
            ;;
        status)
            show_status
            ;;
        logs)
            show_logs
            ;;
        scale)
            scale_services "$@"
            ;;
        cleanup)
            cleanup
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            log_error "未知命令: $1"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"

3.4.deploy_readme.md

# AI图像超高清中转服务部署文档

## 项目概述

这是一个基于Docker的AI图像超高清处理服务,提供图像上传、处理和结果查询的REST API接口。服务使用Flask框架构建,支持文件上传、任务调度和结果查询功能。

## 服务信息

- **服务名称**: xxx
- **服务代码**: test_xxx
- **端口**: 5000
- **基础镜像**: python:3.10-slim

## 系统要求

### 必需依赖
- Docker (最新版本)
- Docker Compose (最新版本)
- 至少 2GB 可用内存
- 至少 1GB 可用磁盘空间

### 检查依赖
```bash
# 检查Docker是否安装
docker --version

# 检查Docker Compose是否安装
docker compose version
```

## 快速开始

### 1. 克隆项目
```bash
git clone <repository-url>
cd test_xxx
```

### 2. 启动服务
```bash
# 给脚本执行权限
chmod +x deploy.sh

# 启动服务
./deploy.sh start
```

### 3. 验证服务
```bash
# 检查服务状态
./deploy.sh status

# 查看服务日志
./deploy.sh logs
```

## 部署脚本使用说明

### 基本命令

| 命令 | 描述 | 示例 |
|------|------|------|
| `start` | 启动服务 | `./deploy.sh start` |
| `stop` | 停止服务 | `./deploy.sh stop` |
| `restart` | 重启服务 | `./deploy.sh restart` |
| `status` | 查看服务状态 | `./deploy.sh status` |
| `logs` | 查看实时日志 | `./deploy.sh logs` |
| `scale N` | 扩缩容到N个实例 | `./deploy.sh scale 3` |
| `cleanup` | 清理Docker资源 | `./deploy.sh cleanup` |
| `help` | 显示帮助信息 | `./deploy.sh help` |

### 详细使用说明

#### 启动服务
```bash
./deploy.sh start
```
- 检查Docker和Docker Compose依赖
- 创建日志目录并设置权限
- 构建Docker镜像(无缓存)
- 启动服务容器
- 等待服务启动完成

#### 停止服务
```bash
./deploy.sh stop
```
- 停止所有相关容器
- 清理容器资源

#### 重启服务
```bash
./deploy.sh restart
```
- 先停止服务
- 等待5秒
- 重新启动服务

#### 查看服务状态
```bash
./deploy.sh status
```
- 显示容器运行状态
- 显示最近50行日志

#### 查看实时日志
```bash
./deploy.sh logs
```
- 实时显示服务日志
- 按Ctrl+C退出

#### 服务扩缩容
```bash
./deploy.sh scale 5
```
- 扩容到5个实例
- 自动更新环境变量
- 重新启动服务

#### 清理资源
```bash
./deploy.sh cleanup
```
- 停止并删除容器
- 清理Docker系统资源
- 删除未使用的镜像和卷

## 服务配置

### Docker配置
- **工作目录**: `/app`
- **时区**: Asia/Shanghai
- **用户**: app (非root用户)
- **健康检查**: 每30秒检查一次
- **重启策略**: unless-stopped

### 环境变量
```bash
PYTHONPATH=/app
PYTHONUNBUFFERED=1
TZ=Asia/Shanghai
```

### 网络配置
- **网络名称**: test_xxx_network
- **网络类型**: bridge
- **端口映射**: 5000:5000


## 日志管理

### 日志位置
- **容器内**: `/app/logs`
- **宿主机**: `./logs`

### 日志权限
```bash
chmod 777 ./logs
```

### 查看日志
```bash
# 查看服务日志
./deploy.sh logs

# 查看Docker日志
docker compose logs

# 查看特定容器日志
docker logs <container_name>
```

## 故障排除

### 常见问题

#### 1. Docker未安装
```bash
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install docker.io docker-compose

# CentOS/RHEL
sudo yum install docker docker-compose
```

#### 2. 权限问题
```bash
# 添加用户到docker组
sudo usermod -aG docker $USER
# 重新登录或执行
newgrp docker
```

#### 3. 端口冲突
```bash
# 检查端口占用
netstat -tulpn | grep 5000
# 或修改docker-compose.yml中的端口映射
```

#### 4. 内存不足
```bash
# 检查系统资源
free -h
df -h
# 清理Docker资源
./deploy.sh cleanup
```

### 调试命令

#### 查看容器状态
```bash
docker compose ps
```

#### 进入容器
```bash
docker compose exec test_xxx bash
```

#### 查看容器资源使用
```bash
docker stats
```

#### 查看详细日志
```bash
docker compose logs --tail=100 -f
```

## 生产环境部署

### 安全配置
1. 修改OSS配置中的密钥
2. 设置防火墙规则
3. 使用HTTPS证书
4. 配置反向代理

### 性能优化
1. 调整容器资源限制
2. 配置负载均衡
3. 使用CDN加速
4. 优化数据库连接

### 监控告警
1. 配置健康检查
2. 设置日志监控
3. 配置资源告警
4. 设置自动重启

## 维护操作

### 定期维护
```bash
# 清理未使用的资源
./deploy.sh cleanup

# 更新镜像
docker compose pull
./deploy.sh restart

# 备份数据
docker compose exec test_xxx tar -czf /tmp/backup.tar.gz /app/uploads
```

### 版本升级
```bash
# 停止服务
./deploy.sh stop

# 更新代码
git pull

# 重新构建并启动
./deploy.sh start
```

## 联系支持

如遇到问题,请检查:
1. 系统日志: `./deploy.sh logs`
2. 服务状态: `./deploy.sh status`
3. 系统资源使用情况
4. 网络连接状态

---

**注意**: 请确保在生产环境中修改所有默认配置,包括OSS密钥、数据库连接等敏感信息。

4.启动

sh deploy.sh start

5.停止

sh deploy.sh stop

6.重启

sh deploy.sh restart

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值