Docker结合Python构建服务器容器
前言
最近在使用一些 MCP 制作工具的时候,需要设计一些 python 创建的服务器用于本地大模型来调用接口,若直接用用 python 启动服务的话,并不方便管理,但最近使用 docker 部署一些服务的时候发现 docker 管理这些服务独立且可便于观察各个服务的状态。于是就有突发奇想,用 python 编译的服务是否也可以用 docker 来管理。最近刚好在 GitHub 上找到一个简单实例,这里拿来学习使用一下。
参考链接:kangarooking/fastgpt-dify-adapter: dify外接fastgpt知识库的工具
Docker 介绍
Docker 是一个工具和平台,允许开发者将应用程序及其所有依赖(如库、系统工具、代码等)打包到一个轻量级容器中。这个容器可以在任何支持 Docker 的环境中运行,无需担心环境差异导致的问题。
基本概念
(1)镜像(Image)
- 定义:Docker 镜像是一个静态模板,包含运行应用所需的所有文件、依赖和配置。
 - 特点:
 - 由 Dockerfile 构建而成。
 - 例如:
python:3.10-slim是一个 Python 3.10 的基础镜像。 - 作用:镜像是容器的“蓝图”,容器是镜像的运行实例。
 
(2)容器(Container)
- 定义:容器是镜像的运行实例,是一个独立的、可执行的进程。
 - 特点:
 - 容器是轻量级的,启动速度快(秒级)。
 - 每个容器相互隔离,互不影响。
 - 作用:运行应用,例如启动一个 Web 服务。
 
(3)Dockerfile
- 定义:一个文本文件,包含一系列指令,用于构建镜像。
 - 示例:
 
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
- 作用:自动化构建镜像,确保环境一致性。
 
(4)Docker Hub
- 定义:Docker 的公共仓库,存储和分享镜像。
 - 特点:
 - 提供官方镜像(如 
nginx、mysql)。 - 支持私有镜像仓库。
 - 作用:开发者可以拉取他人镜像或上传自己的镜像。
 
常见命令
| 命令 | 说明 | 
|---|---|
docker images | 
列出本地所有镜像 | 
docker ps | 
列出正在运行的容器 | 
docker ps -a | 
列出所有容器(包括已停止的) | 
docker build -t <name> . | 
根据 Dockerfile 构建镜像 | 
docker run <image> | 
运行一个容器 | 
docker stop <container> | 
停止指定容器 | 
docker rm <container> | 
删除指定容器 | 
项目分析
项目十分简单主要包含一下文件:
app.pydocker-compose.ymldocker-compose-aliyun.ymlDockerfileREADME.mdrequirements.txt
Python 源代码是app.py,requirements.txt为该 Python 代码所项目依赖的 Python 包列表。Dockerfile 主要用于构建本地镜像,docker-compose.yml用来启动 docker 服务docker-compose-aliyun.yml是使用云端镜像进行部署。
如何构建本地镜像
分析一下 Dockerfile 文件,文件主要内容如下:
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--access-logfile", "-", "--error-logfile", "-", "app:app"]
1. FROM python:3.10-slim
- 作用:指定基础镜像。
 - 解释:
 python:3.10-slim是一个轻量级的 Python 3.10 镜像(slim表示精简版,去除了部分开发工具和依赖,体积更小)。- 所有后续指令都基于这个基础镜像构建。
 
2. WORKDIR /app
- 作用:设置工作目录。
 - 解释:
 - 将容器内的工作目录设置为 
/app。 - 后续的 
COPY、RUN等指令都会基于此路径执行(例如COPY requirements.txt .会将文件复制到/app目录下)。 
3. COPY requirements.txt .
- 作用:复制文件到容器中。
 - 解释:
 - 将本地的 
requirements.txt文件复制到容器的当前工作目录(即/app)。 requirements.txt通常包含项目依赖的 Python 包列表(如flask、gunicorn等)。
4. RUN pip install --no-cache-dir -r requirements.txt
- 作用:安装依赖。
 - 解释:
 RUN指令在镜像构建阶段执行命令。pip install安装requirements.txt中列出的所有依赖。--no-cache-dir禁用 pip 缓存,减少镜像体积。-r requirements.txt表示从文件中读取依赖列表。
5. COPY . .
- 作用:复制当前目录下的所有文件到容器中。
 - 解释:
 - 将本地当前目录(Dockerfile 所在目录)下的所有文件和子目录复制到容器的 
/app目录。 - 注意:这会包含项目源代码、配置文件等(需确保 
.dockerignore文件排除不必要的内容,如.git、__pycache__等)。 
6. EXPOSE 5000
- 作用:声明容器运行时监听的端口。
 - 解释:
 - 告诉 Docker 容器在运行时会使用 
5000端口(例如 Web 服务的端口)。 - 注意:
EXPOSE只是文档作用,实际运行时需通过docker run -p 5000:5000映射端口。 
7. CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--access-logfile", "-", "--error-logfile", "-", "app:app"]
- 作用:指定容器启动时默认执行的命令。
 - 解释:
 - 使用 
gunicorn(一个 WSGI 服务器)启动 Python Web 应用。 - 参数说明:
 --bind 0.0.0.0:5000:将服务绑定到所有网络接口的5000端口(允许外部访问)。--access-logfile "-":将访问日志输出到标准输出(便于 Docker 日志系统捕获)。--error-logfile "-":将错误日志输出到标准输出。app:app:指定 WSGI 应用入口(app是 Python 模块名,app是应用实例名,例如app.py中的app = Flask(__name__))。
建立 docker 服务
建立 docker 的服务虽然可以通过 docker 的命令直接开启一个服务,但是有时开启 docker 需要伴随一些环境变量,还有部分 docker 的设置,所以就个人而言,我更倾向于利用 docker-compose 来开启服务。Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它通过一个 YAML 文件(docker-compose.yml)来配置服务、网络、卷等,简化了多容器应用的管理。
version: '3'
services:
 fastgpt-dify-adapter:
 build: .
 ports:
 - "5000:5000"
 environment:
 - FASTGPT_BASE_URL=http://host.docker.internal:3000
 # 问题优化配置
 - DATASET_SEARCH_USING_EXTENSION=true
 - DATASET_SEARCH_EXTENSION_MODEL=Deepseek-chat
 - DATASET_SEARCH_EXTENSION_BG=
 # 重排序配置
 - DATASET_SEARCH_USING_RERANK=true
 restart: unless-stopped
build: . 就可以一键将该路径下的 docker 打包完成并部署。
部署完成后就可以在 docker 界面中看到了。
本文来自博客园,作者:一月一星辰,转载请注明原文链接:https://www.cnblogs.com/tangwc/p/18943363

        构建docker服务,以Python服务器来构建搭建一个容器为例进行说明。
    
                
            
        
浙公网安备 33010602011771号