将 Python 项目部署到容器
Flask 是一个轻量级Web应用框架,简单易用,可以很快速地创建web应用。我们用它来创建一个demo应用。
如果还没有安装Flask库,可以使用下面命令安装:
代码语言:javascript复制$ pip install flask
创建 flask 项目
安装成功后,新建一个命名为flask的目录
代码语言:javascript复制cd workspace/python
mkdir flask
cd flask
然后在该目录下创建app.py文件。
代码语言:javascript复制from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return """
<h1>《Netkiller Python 手札》</h1>
<p>这是一个运行在 Docker 容器中的演示程序.</p>
"""
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0')
运行项目
代码语言:javascript复制➜ flask git:(master) ✗ python3 app.py
* Serving Flask app 'app' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on all addresses.
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://192.168.3.2:5000/ (Press CTRL C to quit)
* Restarting with watchdog (fsevents)
* Debugger is active!
* Debugger PIN: 211-304-394
然后在浏览器中访问 http://localhost:5000/ 确认 flask 可以正常运行。
代码语言:javascript复制➜ python git:(master) ✗ curl http://localhost:5000
<h1>《Netkiller Python 手札》</h1>
<p>这是一个运行在 Docker 容器中的演示程序.</p>
在 Docker 容器中运行 Python 项目
要在Docker上运行应用程序,首先必须使用 Dockerfile 脚本构建一个容器,而且必须包含使用的所有依赖项,包括 python 和 依赖库。
新建一个 requirements.txt 文件,包含所有依赖的 python 包,我们的例子中只有用到了一个 Flask。
代码语言:javascript复制flask==2.0.1
创建 Dockerfile 文件用来构建映像
代码语言:javascript复制FROM python
LABEL org.opencontainers.image.authors="netkiller@msn.com"
WORKDIR /
COPY ./requirements.txt /requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . /
ENTRYPOINT [ "python" ]
CMD [ "app.py" ]
构建镜像
代码语言:javascript复制docker build -t flask:0.0.1 .
启动容器
代码语言:javascript复制docker run --name flask -p 5000:5000 flask:0.0.1
容器启动运行后,测试无误,上传docker镜像到仓库
代码语言:javascript复制➜ flask git:(master) docker login --username netkiller
Password:
Login Succeeded
➜ flask git:(master) docker tag flask:0.0.1 netkiller/flask:latest
➜ flask git:(master) docker push netkiller/flask:latest
The push refers to repository [docker.io/netkiller/flask]
3591098640e3: Pushed
86c12f640351: Pushed
f4559c1df7ec: Pushed
cd6b2a9ae627: Pushed
84c97f2e3099: Pushed
b0cb6a43f300: Pushed
4b4c002ee6ca: Pushed
cdc9dae211b4: Pushed
7095af798ace: Pushed
fe6a4fdbedc0: Pushed
e4d0e810d54a: Pushed
4e006334a6fd: Pushed
latest: digest: sha256:c3be7315046aa8abe6851475658ea1b23ab1b44d411b0a5be650f38d2b197bc3 size: 2842
在 kubernetes 中部署项目
安装 kubernetes 测试环境
代码语言:javascript复制$ brew install minikube
$ brew install kubectl
启动 minikube
代码语言:javascript复制minikube start --memory 2048mb --cpus 2 --cache-images=true --driver=hyperkit
--image-mirror-country=cn --registry-mirror="https://registry.docker-cn.com,https://docker.mirrors.ustc.edu.cn" --insecure-registry="127.0.0.1:5000,192.168.3.0/24,192.168.64.0/24,172.17.0.0/16,10.10.0.0/24"
创建密钥
代码语言:javascript复制kubectl create secret docker-registry docker-hub
--docker-server=https://index.docker.io/v2/
--docker-username=netkiller
--docker-password=passw0rd
--docker-email=netkiller@msn.com
查看密钥,确保 docker-hub 被创建
代码语言:javascript复制➜ Python git:(master) ✗ kubectl get secret
NAME TYPE DATA AGE
default-token-lcmzw kubernetes.io/service-account-token 3 2m24s
docker-hub kubernetes.io/dockerconfigjson 1 35s
flask.yaml 文件
代码语言:javascript复制apiVersion: v1
kind: Service
metadata:
name: flask
namespace: default
labels:
app: flask
spec:
type: NodePort
ports:
- port: 5000
nodePort: 31000
selector:
app: flask
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask
spec:
replicas: 2
selector:
matchLabels:
app: flask
template:
metadata:
labels:
app: flask
spec:
containers:
- name: flask
image: netkiller/flask:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
imagePullSecrets:
- name: docker-hub
部署
代码语言:javascript复制➜ kubernetes git:(master) ✗ kubectl create -f flask.yaml
service/flask created
deployment.apps/flask created
➜ kubernetes git:(master) ✗ minikube service list
|-------------|------------|--------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-------------|------------|--------------|---------------------------|
| default | flask | 5000 | http://192.168.64.9:31000 |
| default | kubernetes | No node port |
| kube-system | kube-dns | No node port |
|-------------|------------|--------------|---------------------------|
测试
代码语言:javascript复制➜ kubernetes git:(master) ✗ curl http://192.168.64.9:31000
<h1>《Netkiller Python 手札》</h1>
<p>这是一个运行在 Docker 容器中的演示程序.</p>
销毁
代码语言:javascript复制➜ kubernetes git:(master) ✗ kubectl delete -f flask.yaml
service "flask" deleted
deployment.apps "flask" deleted