说明:下面利用Dockerfile打镜像需要在外网环境中进行

已在外网环境编译完成的镜像:registry.cn-hangzhou.aliyuncs.com/abroad_images/python:v1-aming

需求:Python项目,需要安装组件,运行项目。

一、思路分析

  • 安装组件包:使用Python基础镜像;

二、打包镜像并上传

#上传项目包
[root@master01 5]# cd python-demoapp/
[root@master01 python-demoapp]# ls
build  CONTRIBUTING.md  deploy  deployment.yaml  Dockerfile  ingress.yaml  LICENSE  makefile  README.md  service.yaml  src  tests

#原始包需要修改requirements.txt,主要添加werkzeug==2.2.2
[root@master01 5]# vim python-demoapp/src/requirements.txt
Flask==2.1.0
py-cpuinfo==7.0.0
psutil==5.8.0
gunicorn==20.1.0
black==20.8b1
flake8==3.9.0
pytest==6.2.5
werkzeug==2.2.2

#如果不进行上面修改直接build,会发生如下报错
[root@master01 python-demoapp]# docker logs -f 2eb27c745cd1
...
...
ImportError: cannot import name 'url_quote' from 'werkzeug.urls' (/usr/local/lib/python3.9/site-packages/werkzeug/urls.py)

#查看Dockerfile文件
[root@master01 python-demoapp]# cat Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/abroad_images/python:3.9-slim-buster
LABEL Name="Python Flask Demo App" Version=1.4.2
ARG srcDir=src
WORKDIR /app
COPY $srcDir/requirements.txt .
#RUN pip install --no-cache-dir -r requirements.txt
RUN pip install --no-cache-dir --default-timeout=1000 --retries=10 -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY $srcDir/run.py .
COPY $srcDir/app ./app

EXPOSE 5000

CMD ["gunicorn", "-b", "0.0.0.0:5000", "run:app"]

#编译镜像
[root@master01 python-demoapp]# docker build -t python:v1 .

#后台起容器
[root@master01 python-demoapp]# docker run -it --rm -p 5000:5000 python:v1

#验证
[root@master01 python-demoapp]# curl localhost:5000 -i
HTTP/1.1 200 OK
Server: gunicorn
Date: Thu, 06 Apr 2023 08:53:54 GMT
...
...

#重新定义标签
[root@master01 python-demoapp]# docker tag python:v1 harbor.zhang-qing.com/demo/python:v1

#推送镜像
[root@master01 python-demoapp]# docker push harbor.zhang-qing.com/demo/python:v1

三、创建deployment.yaml资源

[root@master01 python-demoapp]# cat deployment.yaml
# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pythondemo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pythondemo
  template:
    metadata:
      labels:
        app: pythondemo
    spec:
      containers:
      - name: pythondemo
        image: harbor.zhang-qing.com/demo/python:v1
        resources:
          limits:
            memory: "2Gi"
            cpu: "1"
          requests:
            memory: "1Gi"
            cpu: "500m"
        ports:
          - containerPort: 5000
            name: web
        livenessProbe:
          httpGet:
            port: web
            path: /
          timeoutSeconds: 2       # 表示容器必须在2s内做出相应反馈给probe否则视为探测失败
          periodSeconds: 30       # 探测周期每30s探测一次
        readinessProbe:
          tcpSocket:
            port: web
          initialDelaySeconds: 10 # 容器启动后10s开始探测

#应用
[root@master01 python-demoapp]# kaf deployment.yaml

四、创建service资源

控制器资源创建无误后,接下来我们部署service资源,然后就可以通过clusterIP+端口方式访问服务

[root@master01 python-demoapp]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
  name: pythondemo
spec:
  type: ClusterIP
  selector:
    app: pythondemo
  ports:
  - name: http
    port: 5000
    protocol: TCP
    targetPort: 5000

#应用
[root@master01 python-demoapp]#  kaf service.yaml

五、创建ingress资源

[root@master01 python-demoapp]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    konghq.com/https-redirect-status-code: "301"
    konghq.com/protocols: http
    konghq.com/regex-priority: "1000"
  name: python-ing
spec:
  ingressClassName: nginx
  rules:
  - host: python-test.zhang-qing.com
    http:
      paths:
      - backend:
          service:
            name: pythondemo
            port:
              number: 5000
        path: /
        pathType: ImplementationSpecific

#应用
[root@master01 python-demoapp]#  kaf ingress.yaml

##配置hosts
在阿里云域名做A记录
10.0.0.11 python-test.zhang-qing.com

六、测试验证

打开浏览器输入http://python-test.zhang-qing.com/monitor进行访问

image-20250330173214295

七、环境复原

[root@master01 python-demoapp]# k delete -f deployment.yaml -f service.yaml  -f ingress.yaml