
用docker封装python应用
docker保证了一致的运行环境,使得项目可以跨平台、跨设备运行。本文介绍用docker封装python项目的详细步骤,并给出了三个实践案例。
预期读者有一定的python基础,能使用pip或conda/mamba管理python环境,并对docker有一定了解。
Hello World
首先,新建文件夹,新建一个conda环境,安装python和演示用第三方包。
将环境依赖项保存为 requirements.txt
注意,此处python包的路径复用了conda本地缓存的安装包,显然容器内是使用不了的。将本地链接(@ file://xxx
)清理干净,得到
创建 src/main.py
,写入待执行的命令
创建 Dockerfile
,写入构建镜像的命令。意思是基于dockerhub的 python:3.12.2-alpine
镜像构建,容器内的应用目录是 /app
,将当前目录文件都复制到 /app
下,构建时执行 pip
安装环境。在镜像构建完毕、容器运行后,运行 main.py
脚本。
此时的目录结构是
根据 Dockerfile
构建docker镜像,并将tag指定为 bio-utils:v1
。可能需要等几分钟
当你看到类似下面的提示,就表明已经构建成功
查看镜像列表,可以看到
启动容器,可以得到输出
由于 main.py
只有一行代码,容器运行后就退出了。可以在 docker ps -a
全部容器中看到
持久运行的服务
大多数时候,我们需要封装一个持续在后台运行的服务。以python自带的HTTP服务器为例,我们将 Dockerfile
的 CMD
修改一下
然后构建镜像,创建并运行容器。注意设置端口转发
此时容器内的HTTP服务器就已经启动。在浏览器输入 localhost:9914
,即可看到容器内的文件
进入容器内部,可以看到 /app
目录下的文件
在容器内创建文件,将会实时在 localhost:9914
更新
简单的后端
我们刚刚安装的Fastapi是一个python Web框架,可以简便地创建一个后端服务。
例如,我们将 main.py
改写如下:
将 Dockerfile
改为执行 main.py
,启动后端服务
然后构建镜像,创建并运行容器。注意设置端口转发
打开浏览器,访问 localhost:7934
,即可使用 main.py
中我们编写的接口了
Fastapi还自动创建了接口文档,在 localhost:7934/docs
总结
以上,我们学习了如何用docker封装python项目。核心点是正确地将环境保存到 requirements.txt
,以及恰当地写下一个 Dockerfile
。
如果你愿意,你还可以注册一个dockerhub账号,使用 docker push
命令,将构建好的镜像上传到dockerhub,公开提供下载。
玩得开心!