返回介绍

23.4. 容器

发布于 2024-02-10 15:26:30 字数 5239 浏览 0 评论 0 收藏 0

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                          		

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文