对于一个python工程,当我们希望他的部署和运行不依赖特定的环境,且具备较好的可移植性,那么采用docker的方式进行部署会很适合。具体有以下这些好处:
环境一致性:Docker允许你在开发、测试和生产环境中保持一致的环境配置。通过定义Dockerfile和其他配置文件,可以在不同阶段使用相同的设置,从而减少“在我的机器上可以运行”这类问题的发生。
易于部署和扩展:Docker容器可以快速启动和停止,非常适合微服务架构。同时,Docker支持集群管理和负载均衡工具(如Docker Swarm、Kubernetes),使得水平扩展变得简单。
资源隔离:每个Docker容器都有自己的文件系统、网络空间和其他系统资源,这意味着容器之间不会相互干扰。这有助于提高系统的安全性和稳定性。
......
具体地,在实践中怎么去构建呢?下面是一个简单的构建方式。
由于Python工程在运行时不需要编译,是可以直接运行的,所以构建一个包含有所有Python所需依赖的环境即可。然后在docker中运行包含程序入口点__main__所在的.py(通常可以命名为main.py)即可:
所需文件
requirements.txt:指定python项目所需的所有外部依赖库&版本号
Dockerfile:构建docker image的依据文件
deploy.sh:创建docker等操作(可以包含运行docker,或push到远程进行部署)
requiements.txt内容
这里就是写明所部署项目所需要的python外部依赖库
一个例子:
Django==3.2.5
numpy==1.21.2
pandas==1.3.3
requests==2.26.0
flask==2.0.2
sqlalchemy==1.4.23
利用pip可以根据这个文件内容进行安装,用法:
pip3 install -r requirements.txt
Dockerfile内容
对于python工程,我们在docker中需要指明python版本,然后根据requirements.txt去安装以来库,最后运行工程即可。
下面是一个示例:
# 使用官方的 Python 运行时作为父镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 将当前目录的内容复制到容器的工作目录中
COPY . /app
# 安装所需的 Python 包
RUN pip install --no-cache-dir -r requirements.txt
# 暴露服务端口(如果有的话)
EXPOSE 8080
# 命令来运行你的 Python 应用程序
CMD ["python", "main.py"]
depoly.sh脚本内容
为了一键创建docker并允许,我们常常会写一个脚本,这个脚本主要就是创建docker并运行了,其他功能需要根据具体需求添加。
示例:
# 设置一些变量
IMAGE_NAME="my-python-app"
CONTAINER_NAME="my-running-container"
# 构建 Docker 镜像
echo "Building Docker image..."
docker build -t $IMAGE_NAME .
# 运行 Docker 容器
echo "Running Docker container..."
docker run -d --name $CONTAINER_NAME -p 8080:8080 $IMAGE_NAME
# 输出容器ID以便后续操作
echo "Container ID: $(docker ps --format '{{.ID}}' | grep
$CONTAINER_NAME)
# 输出完成信息
echo "Done!"