随着容器化技术的兴起,Docker 成为了一种流行的应用部署方式。它通过将应用及其依赖环境打包在一起,解决了"在我机器上可以运行"的问题,使得应用能够在任何支持 Docker 的环境中无缝运行。本文将详细介绍如何将 Python 项目部署到 Docker 容器中。
【Python系列】Python 项目 Docker 部署指南-LMLPHP

一.基础介绍

1. Docker 简介

Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的运行环境到一个可移植的容器中。Docker 使用 Linux 容器(LXC)技术,但提供了比传统容器更加易用的工作流和用户界面。

2. 环境准备

在开始之前,请确保你的开发机器上已经安装了 Docker。你可以访问 Docker 官网下载并安装适合你操作系统的 Docker 版本。

3. 创建 Dockerfile

Dockerfile 是一个文本文件,包含了一系列的指令,用于自动化构建 Docker 镜像。以下是一个基本的 Python 项目的 Dockerfile 示例:

# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 将当前目录内容复制到工作目录
COPY . /app

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 暴露端口
EXPOSE 8000

# 运行应用
CMD ["python", "app.py"]

4. 构建 Docker 镜像

在 Dockerfile 所在的目录下打开终端,运行以下命令来构建 Docker 镜像:

docker build -t my-python-app .

这里 -t 参数用于给镜像指定一个标签,. 表示 Dockerfile 在当前目录。

5. 运行 Docker 容器

使用以下命令从镜像启动一个容器:

docker run -d -p 8000:8000 my-python-app

-d 参数表示后台运行容器,-p 参数用于端口映射,将容器的 8000 端口映射到宿主机的 8000 端口。

6. 访问应用

如果一切顺利,你现在可以通过浏览器访问 http://localhost:8000 来查看运行在 Docker 容器中的 Python 应用。

7. 数据持久化

在某些情况下,你可能需要持久化应用数据。Docker 提供了数据卷(volumes)来实现这一点。你可以使用以下命令来运行容器并挂载数据卷:

docker run -d -p 8000:8000 -v my-data:/app/data my-python-app

这里 -v 参数用于创建一个数据卷并将其挂载到容器内的 /app/data 目录。

8. 容器管理

Docker 提供了一系列命令来管理容器,例如:

  • docker ps:列出正在运行的容器。
  • docker stop <container_id>:停止指定的容器。
  • docker start <container_id>:启动已停止的容器。
  • docker logs <container_id>:查看容器的日志。

9. Docker Compose

对于复杂的应用,你可能需要同时运行多个容器。Docker Compose 允许你通过一个 YAML 文件来定义多个容器的配置,然后使用一个命令来启动或停止它们。创建一个 docker-compose.yml 文件:

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  redis:
    image: "redis:alpine"

使用以下命令启动所有服务:

docker-compose up -d

二.实现步骤

1.Dockerfile

FROM python:3.11.5-slim

WORKDIR /kg-qa/

COPY .env .env
COPY ./base ./base
COPY ./manager ./manager
COPY ./config/config.yaml ./config/config.yaml
COPY ./config/logger.ini ./config/
COPY ./base_run.sh ./ServerApp.py ./__init__.py ./
COPY ./requirements.txt ./requirements.txt

# 安装 Python 依赖
RUN pip install --upgrade pip
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 将应用代码复制到工作目录
COPY . /kg-qa/

ENTRYPOINT ["sh", "./base_run.sh"]

2.base_run.sh

#!/bin/sh

uvicorn ServerApp:app --host 0.0.0.0 --port 8080 --loop asyncio

3.启动脚本

#!/bin/sh

# 定义镜像名称和标签
IMAGE_NAME="kg-qa:latest"
CONTAINER_NAME="kg-qa"

# 切换到项目目录
cd /data/kg/kg-qa

# 切换到开发分支并拉取最新代码
echo "Checking out to development branch and pulling latest changes..."
git checkout dev
git pull

# 构建Docker镜像
echo "Building Docker image..."
docker build -t $IMAGE_NAME .

# 检查容器是否正在运行
if docker ps -a | grep -q $CONTAINER_NAME; then
    echo "Stopping and removing existing container..."
    docker stop $CONTAINER_NAME
    docker rm $CONTAINER_NAME
fi

# 启动Docker容器
echo "Starting container..."
docker run -d \
    --name $CONTAINER_NAME \
    -p 8080:8080 \
    --restart=always \
    --privileged=true \
    -e TZ=Asia/Shanghai \
    -v /etc/localtime:/etc/localtime:ro \
    -v /data/kg/config/env.properties:/kg-qa/.env \
    -v /data/kg/config:/kg-qa/config \
    $IMAGE_NAME

echo "Container started successfully!"

# 打印容器日志
echo "Container logs:"
docker logs -f $CONTAINER_NAME

【Python系列】Python 项目 Docker 部署指南-LMLPHP

三.总结

Docker 为 Python 项目提供了一种快速、一致且可移植的部署方式。通过本文的介绍,你应该已经了解了如何将 Python 项目部署到 Docker 容器中。ocker 的世界非常广阔,本文只是冰山一角,还有许多高级特性去探索和学习。

06-30 17:15