编写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查看镜像和容器等相关截图

查看镜像

image

查看容器

image

 

查看容器logs输出

image

 

在容器内执行python命令

image

 

image

 相关命令查看

image

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

image

 

六、创建卷
  在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 文件会自动创建

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

posted @ 2025-11-11 00:26  jinzi  阅读(0)  评论(0)    收藏  举报