编写python web程序,手工编写Dockerfile部署到docker
环境如下:
1.windows docker desktop
docker 安装请参考: htsps://www.cnblogs.com/aozhejin/p/19203952
2.本机已安装python 3.14.0
https://www.python.org/downloads/
3.git 客户端
一、测试例子app.py
本例子来自
git clone https://github.com/prakhar1989/docker-curriculum.git
from flask import Flask, render_template import os import random app = Flask(__name__) # list of cat images images = [ "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F0.gif?alt=media&token=0fff4b31-b3d8-44fb-be39-723f040e57fb", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F1.gif?alt=media&token=2328c855-572f-4a10-af8c-23a6e1db574c", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F10.gif?alt=media&token=647fd422-c8d1-4879-af3e-fea695da79b2", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F11.gif?alt=media&token=900cce1f-55c0-4e02-80c6-ee587d1e9b6e", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F2.gif?alt=media&token=8a108bd4-8dfc-4dbc-9b8c-0db0e626f65b", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F3.gif?alt=media&token=4e270d85-0be3-4048-99bd-696ece8070ea", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F4.gif?alt=media&token=e7daf297-e615-4dfc-aa19-bee959204774", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F5.gif?alt=media&token=a8e472e6-94da-45f9-aab8-d51ec499e5ed", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F7.gif?alt=media&token=9e449089-9f94-4002-a92a-3e44c6bd18a9", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F8.gif?alt=media&token=80a48714-7aaa-45fa-a36b-a7653dc3292b", "https://firebasestorage.googleapis.com/v0/b/docker-curriculum.appspot.com/o/catnip%2F9.gif?alt=media&token=a57a1c71-a8af-4170-8fee-bfe11809f0b3", ] @app.route("/") def index(): url = random.choice(images) return render_template("index.html", url=url) if __name__ == "__main__": app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
二、编写Dockerfile
# 使用 Python 官方镜像作为基础镜像 FROM python:3.14.0 # 设置工作目录 WORKDIR /usr/src/app # copy所有文件到容器内 COPY . . # 安装 Python 依赖 # 如果有额外的依赖,将它们添加到 requirements.txt 中并使用以下命令安装 RUN pip install --no-cache-dir -r requirements.txt # tell the port number the container should expose,访问的端口 EXPOSE 5000 # 指定应用程序入口 CMD ["python", "./app.py"]
把所有的库信息加入requirements.txt ,你可以通过手工创建或用命令执行创建
PS D:\makemysql> pip freeze > requirements.txt
blinker==1.9.0 click==8.3.0 colorama==0.4.6 Flask==3.1.2 gunicorn==23.0.0 itsdangerous==2.2.0 Jinja2==3.1.6 MarkupSafe==3.0.3 numpy==2.3.4 packaging==25.0 pywin32==311 tornado==6.5.2 Werkzeug==3.1.3
三、项目目录结构
PS C:\Users\king\docker-curriculum\flask-app> tree /f 卷 Windows 的文件夹 PATH 列表 卷序列号为 F023-2216 C:. │ app.py │ Dockerfile │ Dockerrun.aws.json │ requirements.txt │ └─templates index.html
说明:
requirements.txt 是要默认pip要安装的库列表
四、构建docker镜像
PS C:\Users\king\docker-curriculum\flask-app> docker build -t my-python-app:latest . [+] Building 100.6s (9/9) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 359B 0.0s => [internal] load metadata for docker.io/library/python:3.14.0 4.3s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/4] FROM docker.io/library/python:3.14.0@sha256:97aa8cc0b87a4a312a294d2d4d7b20f6e2a21ed6d4e64ef08c03088c4aa9890f 89.4s => => resolve docker.io/library/python:3.14.0@sha256:97aa8cc0b87a4a312a294d2d4d7b20f6e2a21ed6d4e64ef08c03088c4aa9890f 0.0s => => sha256:149075fcccd1b52406789bff7063813f1c14baf10b165df0e1e00fcb0ca415e5 248B / 248B 0.7s => => sha256:2fbf02c04055ee28543076a502ce51fa41895e386e4462739fb1526dc371425e 29.23MB / 29.23MB 23.6s => => sha256:8f5fb10be9d4525dc6941af4e2a587d1d3edbbb7442cdad0eebb1a3806b183dd 6.09MB / 6.09MB 6.2s => => sha256:23d55a674b2e3641a37b7f2053f00af6fe4f2a89576ffb917d4b7b4deaf24591 235.94MB / 235.94MB 84.4s => => sha256:72e8e93b0d018b135d833207c6feaba205653ac52e0a80d214477ec0de239dee 67.78MB / 67.78MB 49.8s => => sha256:e3143549f2b8b3ad8d79efdc47824641c6771796b3770f3c637a38aabd2b3462 25.62MB / 25.62MB 21.4s => => sha256:13cc39f8244ac66bf1dd9149e1da421ab1bbc80d612dc14fe368753e7be17b33 49.29MB / 49.29MB 24.1s => => extracting sha256:13cc39f8244ac66bf1dd9149e1da421ab1bbc80d612dc14fe368753e7be17b33 1.1s => => extracting sha256:e3143549f2b8b3ad8d79efdc47824641c6771796b3770f3c637a38aabd2b3462 0.5s => => extracting sha256:72e8e93b0d018b135d833207c6feaba205653ac52e0a80d214477ec0de239dee 1.6s => => extracting sha256:23d55a674b2e3641a37b7f2053f00af6fe4f2a89576ffb917d4b7b4deaf24591 4.1s => => extracting sha256:8f5fb10be9d4525dc6941af4e2a587d1d3edbbb7442cdad0eebb1a3806b183dd 0.2s => => extracting sha256:2fbf02c04055ee28543076a502ce51fa41895e386e4462739fb1526dc371425e 0.6s => => extracting sha256:149075fcccd1b52406789bff7063813f1c14baf10b165df0e1e00fcb0ca415e5 0.0s => [internal] load build context 0.0s => => transferring context: 4.00kB 0.0s => [2/4] WORKDIR /usr/src/app 0.2s => [3/4] COPY . . 0.0s => [4/4] RUN pip install --no-cache-dir -r requirements.txt 5.7s => exporting to image 0.8s => => exporting layers 0.5s => => exporting manifest sha256:3642839069911de1af665da101a89f395785b18a314c133b6629fb40f4d886f6 0.0s => => exporting config sha256:fcc3a0ebad9db9d31089ebd9d9ce391381106f23397a5c9cb17c26086b14a176 0.0s => => exporting attestation manifest sha256:d3a164d409a19da8a3d9fb2f7f4d1642699468473bc68801700a331890570713 0.0s => => exporting manifest list sha256:e39599ba8fa053ea68e115d6222b782847a6d7d6a5a56d4438bbc8526a2afcfd 0.0s => => naming to docker.io/library/my-python-app:latest 0.0s => => unpacking to docker.io/library/my-python-app:latest 0.2s PS C:\Users\king\docker-curriculum\flask-app>
该镜像比较大,1.6g,包含了python项目运行的环境.实际docker镜像就是一个小型的linux系统,构建时已把python相关的环境安装上了
六、启动容器
D:\makemysql> docker run --name run-python-app -p 5002:5000 -it my-python-image:latest python app.py
说明
--name 表示容器的名称
-p 5001:5000 (5001是宿主机的端口,我们访问也是http://localhost:5001访问,5000表示的是容器开放的端口)
-it 指定的是容器使用的镜像
python app.py 默认的执行的命令
C:\Users\king\docker-curriculum\flask-app>docker run --name run-python-app -p 5002:5000 -it my-python-app:latest python app.py
* Serving Flask app 'app'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000 #这里是容器内的端口
* Running on http://172.17.0.4:5000
Press CTRL+C to quit
172.17.0.1 - - [12/Nov/2025 12:17:11] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [12/Nov/2025 12:17:13] "GET /favicon.ico HTTP/1.1" 404 -
172.17.0.1 - - [12/Nov/2025 12:17:14] "GET / HTTP/1.1" 200 -
五、利用docker desktop查看镜像和容器等相关截图
查看镜像

查看容器

查看容器logs输出

在容器内执行python命令


相关命令查看

在宿主机的网页上访问 http://localhost:5002 查看结果

六、创建卷
在Docker中,容器使用的数据默认存储在Docker的内部存储区域,这意味着当你删除容器时,除非你使用了卷(Volumes)或绑定挂载(Bind Mounts),否则这些数据也会被删除。为了持久化存储数据,你可以使用Docker Volumes
C:\Users\king\docker-curriculum\flask-app>docker run --name run-python-app -p 5002:5000 -v d:\datafile:/datafile -it my-python-app:latest python app.py
d:\datafile 文件会自动创建

当我们执行删除容器和镜像操作之后,会看到宿主机下的目录和文件会保留下来,并不会一起被删除, 但是容器内数据都会销毁。

浙公网安备 33010602011771号