Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | 51CTO学院 | CSDN程序员研修院 | OSChina 博客 | 腾讯云社区 | 阿里云栖社区 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏多维度架构

23.4. 容器

Flask 是一个轻量级Web应用框架,简单易用,可以很快速地创建web应用。我们用它来创建一个demo应用。

如果还没有安装Flask库,可以使用下面命令安装:

	
$ pip install flask	
	
	

创建 flask 项目

安装成功后,新建一个命名为flask的目录

	
cd workspace/python 
mkdir flask
cd flask 
	
	

然后在该目录下创建app.py文件。

	
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')	
	
	

运行项目

	
➜  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 可以正常运行。

	
➜  python git:(master) ✗ curl http://localhost:5000

  <h1>《Netkiller Python 手札》</h1>
  <p>这是一个运行在 Docker 容器中的演示程序.</p>	
	
	

23.4.1. 在 Docker 容器中运行 Python 项目

要在Docker上运行应用程序,首先必须使用 Dockerfile 脚本构建一个容器,而且必须包含使用的所有依赖项,包括 python 和 依赖库。

新建一个 requirements.txt 文件,包含所有依赖的 python 包,我们的例子中只有用到了一个 Flask。

		
flask==2.0.1		
		
		

创建 Dockerfile 文件用来构建映像

		
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" ]
		
		

构建镜像

		
docker build -t flask:0.0.1 .
		
		

启动容器

		
docker run --name flask -p 5000:5000 flask:0.0.1		
		
		

容器启动运行后,测试无误,上传docker镜像到仓库

		
➜  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		
		
		
		
		
		
		

23.4.2. 在 kubernetes 中部署项目

安装 kubernetes 测试环境

		
$ brew install minikube
$ brew install kubectl
		
		

启动 minikube

		
		
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"

		
		

创建密钥

		
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 被创建

		
		
➜  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 文件

		
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
		
		
		

部署

		
➜  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 |
|-------------|------------|--------------|---------------------------|
		
		

测试

		
➜  kubernetes git:(master) ✗ curl http://192.168.64.9:31000

  <h1>《Netkiller Python 手札》</h1>
  <p>这是一个运行在 Docker 容器中的演示程序.</p>
		
		

销毁

		
➜  kubernetes git:(master) ✗ kubectl delete -f flask.yaml 
service "flask" deleted
deployment.apps "flask" deleted