一、背景与运行环境说明
最近,项目中有需要通过制作Dockerfile来将项目放入docker容器中进行部署的需求,由于之前也没有相关的项目经验,因此也是踩了不少坑,特此做一下制作Dockerfile与部署项目的全流程记录。
本地python项目开发环境:win11系统。
部署Docker所在的宿主机运行环境:虚拟机Linux的CentOS7系统。
二、具体操作步骤与遇到的问题记录描述
步骤1:准备好项目源代码文件、Dockerfile、requirements.txt文件
相关文件目录资源的相对位置如下图所示:

最终,需要打入容器的核心文件内容如下图所示:

步骤2:调整准备好Dockerfile文件中的内容
FROM python:3.11-slim
# 更新包列表并安装vim等相关命令补充容器内部功能
RUN apt-get update && apt-get install -y vim
# 设置工作目录
WORKDIR /Mlti_Agents_Investment
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 复制依赖文件
COPY requirements.txt .
# 配置pip源
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目文件
COPY ./src/ /Mlti_Agents_Investment/src/
COPY ./shared/ /Mlti_Agents_Investment/shared/
COPY ./gtjaresearch/ /Mlti_Agents_Investment/gtjaresearch/
COPY ./agents/ /Mlti_Agents_Investment/agents/
COPY ./.env /Mlti_Agents_Investment/.env
COPY ./__init__.py /Mlti_Agents_Investment/__init__.py
COPY ./main_api.py /Mlti_Agents_Investment/main_api.py
# 创建数据目录
RUN mkdir -p data/models data/cache
# 设置环境变量
ENV PYTHONPATH=/Mlti_Agents_Investment
ENV OLLAMA_HOST=http://host.docker.internal:11434
# 暴露端口
EXPOSE 8000
# 设置启动脚本
CMD python /Mlti_Agents_Investment/main_api.py
说明:此处特别需要注意的是对基础镜像的下载,命令如下:
docker pull python:3.11-slim

由于一些网络隔离的原因,下载这个基础镜像会是一个相对缓慢甚至无法进行的过程;因此需要做一些提前的关于网络环境的前置准备工作,包括但不限于:科学上网,国内镜像源,国内加速引擎的设置等等。确保在本地环境,可以有这个基础镜像,以便于后续的容器部署工作。

步骤3:准备python项目所需要的requirements.txt文件
说明:在各自项目的开发的虚拟环境中,得到专属服务于项目本身的python依赖包信息,尽量做到精准,无需冗余的依赖包。
步骤4:将准备好的Dockerfile文件,项目文件,requirements.txt文件上传到虚拟机的指定目录下
上传完成后的效果如下图所示:

步骤5:在上传目标所在的文件目录下,执行针对Dockerfile的打包命令
docker build -f ./Dockerfile --network="host" -t app:1.1 .
说明:此处需要特别注意的是--network="host",这个选项表示用本地网络模式构建镜像。
如果缺少这个选项的话,在执行pip install命令时候会遇到超时报错等失败的情况,如下图所示:

或者:
Bridge模式限制:默认bridge网络下,容器需通过宿主机IP和映射端口访问,且宿主机需开启IP转发(net.ipv4.ip_forward=1) 在默认的"bridge"这个模式下,需要开启以下配置:
临时方案:
sudo sysctl -w net.ipv4.ip_forward=1
此修改会立即生效,但系统重启后失效
永久方案:
修改/etc/sysctl.conf文件,确保包含以下配置:
net.ipv4.ip_forward=1
使配置生效:
sudo sysctl -p
验证IP转发状态:
sysctl net.ipv4.ip_forward
若返回值为1,则表示已开启。
正常运行的情况图如下:

成功打包后,可以看到如下效果:

步骤6:通过build成功后的自制镜像,新建运行容器并做后台运行
docker run -di --network="host" -p 8000:8000 app:1.1
说明:此处需要特别注意的是--network="host",这个选项表示用本地网络模式构建镜像。
-p 8000:8000,这个选项访问宿主机的8000端口可以访问到容器内运行于8000端口的python应用服务,此外,还需要注意宿主机环境的防火墙需要对8000端口做对外开放访问。
或者:
已经设置了"bridge"模式下的IP转发的配置后,则此处的--network="host",不再需要额多外进行配置了。
步骤7:查看容器的运行状态与日志
docker ps

docker logs nostalgic_torvalds

步骤8:通过浏览器访问验证宿主机的对外暴露的端点


2148

被折叠的 条评论
为什么被折叠?



