前言
对于前端开发者而言,最常见的部署方式当然是将代码部署至云服务提供商如 AWS、Azure、阿里云等等。然而,这种方式常常会使开发者被复杂的网络环境、不同系统的相互冲突等问题所困扰,阻碍了项目的推进和迭代速度。因此,现在越来越多的开发者和公司开始转向容器化技术。
本文将您带入 Docker 和 Kubernetes 的世界,探讨如何快速的满足前端团队的部署需求,进而探讨容器部署在前端领域的推广,指导意义深远。
Docker
Docker 是一种开放源代码软件,用于快速构建、测试和交付应用程序。与虚拟机技术不同,容器化技术只是在主机操作系统中创建一个容器,容器的运行速度更快、更加便携,同时也更加灵活。
在 Docker 上线之前,有一种常见的部署方式就是在 deploy 服务器上安装环境并部署服务,不过这个方式在集群容错、便携性等方面都存在问题。而 Docker 则通过对所需要的应用及其依赖进行打包(称之为 image)和发布,将业务由应用所在环境中解耦出来,从而具备了更高的可靠性和可移植性。
在一个 Docker 容器中,会包含一个完整的文件系统,以及其中运行的应用程序、依赖项、传递参数等各个方面。
考虑以下例子,该例子演示了如何使用 Docker 打包并运行一个含有 Node.js 应用程序的容器。首先,您可以创建一个 Dockerfile 文件:
// javascriptcn.com 代码示例 # 基础镜像 FROM node:14-alpine # 镜像描述 LABEL maintainer="yourname@email.com" # 添加代码目录 WORKDIR /app COPY . . # 安装依赖项 RUN npm install # 暴露端口 EXPOSE 3000 # 运行应用程序 CMD [ "npm", "start" ]
Dockerfile 是一个包含构建 Docker 镜像的脚本文件,其中定义了基于哪个镜像以及所需的安装包、配置、运行指令等。
接下来,您可以在 Node.js 应用程序的根目录中创建 .dockerignore 文件,以排除无关信息,例如 node_modules、log 文件等:
node_modules npm-debug.log
最后,使用以下命令构建 Docker 镜像:
docker build -t myapp .
-t 参数是给镜像指定名称、标签(tag),之后您可以使用该名称运行该镜像。
运行容器是通过以下命令完成的:
docker run -p 3001:3000 -d myapp:latest
-d 参数是指定容器在后台运行;-p 3001:3000 参数指定主机上的端口映射到容器端口。
Kubernetes
Kubernetes 是一个用于自动部署、扩展和管理容器化应用程序的开源容器编排引擎,它解决了 Docker 单机环境的缺点,可以在分布式环境中自动扩缩容,并具备很高的可伸缩性和容错能力。
Kubernetes 中的基本概念:
- Pod:最小部署单元,它是 Kubernetes 中部署应用程序的基本策略。
- ReplicaSet:一个 Pod 的副本组,用于实现自动化部署、扩容和缩容。
- Deployment:ReplicaSet 对象的控制器,主要用于管理 Pod 副本。
- Service:Pod 的一种抽象,提供了一种负载均衡机制,可以使多个 Pod 共享一个统一的 IP。
以下示例基于一个菜单服务的实际应用程序。
首先,您可以在应用程序中定义菜单,例如:
// javascriptcn.com 代码示例 { "name": "Pizza", "description": "Delicious pizza", "price": 12 }, { "name": "Spaghetti", "description": "Fresh spaghetti", "price": 8 }
接下来,创建使用 Flask 框架和 pyyaml 库,为菜单服务创建 RESTful API。菜单服务包含两个文件:menu.py 和 Dockerfile。
menu.py
// javascriptcn.com 代码示例 from flask import Flask, jsonify import yaml app = Flask(__name__) with open('menu.yaml') as f: data = yaml.load(f, Loader=yaml.FullLoader) @app.route('/menu') def get_menu(): return jsonify(data) if __name__ == '__main__': app.run(debug=True, host='0.0.0.0')
Dockerfile
FROM python:3.7 COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./menu.py" ]
创建完 Dockerfile 之后,您需要构建镜像:
docker build -t menu:1.0 .
对于 Kubernetes,您需要使用运行容器的 Yaml 文件(menu.yaml)来定义菜单服务的部署和服务。menu.yaml 如下:
// javascriptcn.com 代码示例 apiVersion: apps/v1 kind: Deployment metadata: name: menu-deployment labels: app: menu spec: replicas: 4 selector: matchLabels: app: menu template: metadata: labels: app: menu spec: containers: - name: menu image: menu:1.0 ports: - containerPort: 5000 --- apiVersion: v1 kind: Service metadata: name: menu-service spec: selector: app: menu ports: - name: http port: 80 targetPort: 5000 type: LoadBalancer
Deployment 对象定义了需要运行的副本数和 Pod 的容器内容。例如,该 YAML 文件中定义了一个名为 menu-deployment 的 Deployment,它的 pod 副本数为 4。
Service 对象定义了如何对外开放内部应用程序,例如,定义了一个名为 menu-service 的 Service,使其将 Pod 中的 5000 端口映射到 80 端口,从而在容器内的菜单服务中使用此端口。
最后,您可以使用 kubectl 命令启动 Kubernetes Deployment:
kubectl apply -f menu.yaml
经过几分钟的等待之后,使用以下命令,您可以查看 Kubernetes 集群中部署的服务状态:
kubectl get service
命令会输出一些信息,其中包括菜单服务的 IP 地址。现在,您就可以通过浏览器访问 IP 地址,从浏览器检查是否成功运行了菜单服务。
总结
Docker 和 Kubernetes 极大地增强了软件开发、部署和测试过程的灵活性和便携性,提高了开发人员的工作效率和项目发布速度。对于一些特殊场景,例如服务器资源有限,开发周期短等,在前端领域中推广容器化技术是一个明智的选择。
希望本文能够让您深入了解 Docker 和 Kubernetes 的特性和优势,并掌握丰富的容器部署技能,从而更好地为前端开发提供支持。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652ba35c7d4982a6ebd6c594