说明:下面利用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进行访问

七、环境复原¶
[root@master01 python-demoapp]# k delete -f deployment.yaml -f service.yaml -f ingress.yaml