Docker快速部署项目,极速搭建分布式

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Docker快速部署项目,极速搭建分布式

使用Docker搭建集群,快速部署


随着项目的成长,业务的需要。集群\分布式\负载均衡便是必不可少。以前的单机“玩具”,也一去不复返了。那么改如何快速部署,搭建集群、实时更新。相信是你,当然也是我非常关心的问题。


那么该如何去做呢?


  • 建议:


拥有一定的Docker基础,查阅本文一定会收获的更多。


同时我也希望能与你探讨相关问题


环境准备


  • 两台或多台服务器。(当然虚拟机也可,注意需要两台或多台以上)


  • 均以完成docker、docker-compose 安装。


  • 验证docker安装


docker run hello-world


640 (1).jpg


单机Dockerfile


编写业务代码


新建文件夹-webDemo, 并进入


编辑业务代码 -> app.py


# mkdir webDemo && cd webDemo
vim app.py


业务代码如下


from flask import Flaskfrom redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)@app.route('/')def hello():
    count = redis.incr('hits')    return 'Hello World! I have been seen {} times.\n'.format(count)if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)


编写requirements.txt


由于容器中为干净的目录,仅有基础的Linux镜像


requirements.txt 如下


flask        # python 中 web框架redis        # 数据库Redis远程字典,此项目中用于web做缓存


编写Dockerfile


FROM python:3.7-alpine     # 基于 python:3.7-alpine 容器
ADD . /code    # 将本目录下所有的文件复制到容器中code目录下(code目录若不存在则自动创建)
WORKDIR /code    # 将工作目录设为code
RUN pip install -r requirements.txt    # 安装所需第三方包(构建容器时运行)
CMD ["python", "app.py"]    # 容器启动时运行


构建、运行、验证


# 构建容器名为 webDemo的容器 docker build -t webdome .# 运行 -d 为后台运行, --name web 此次运行webdemo容器的服务备注webdocker build -d -p 8000:8000 -name web  webdemo


构建效果如下


640 (2).jpg


运行效果如下


640 (3).jpg


当然,你也可以定制端口


单机测试-docker-compose


Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。


在原有的文件夹中新增docker-compse.yaml


docker-compse.yaml 内容如下


version: "3.3"
services:
  web:
    image: webdemo    # 镜像名
    build: .
    ports:
      - "8000:8000"
  redis:
    image: redis:alpine


构建、运行、验证

image.gif

单机多台


主要改写如下,

deploy:

    replicas: 5

单机部署5⃣️台


version: "3.3"
services:
  web:
    image: webdemo    # 镜像名
    build: .
    deploy: 
      replicas: 5
    ports:
      - "8000:8000"
  redis:
    image: redis:alpine


为什么需要使用分布式、集群、负载均衡?


单机局限性


单台服务器的性能毕竟有限,综合利用多个节点的处理能力,才能提高整体的服务能力


只要是满足指定的是交互协议,各模块可以根据各自的业务特点,选择不同的处理方式


为什么需要使用分布式?


高可用、高性能、高可脱


海量、多样、实时


分布式系统与集群的关系


分布式:不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题


集群:同一个业务部署在多台机器上,提高系统可用性


分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起,实现同一业务。


分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。


分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率


请思考 分布式、集群、分布式之间的枢纽是什么?,如何保证他们的“共同作战”?


Docker swarm


Docker Swarm是Docker自带的一个集群管理模块。他能够实现Docker集群的创建和管理。


它主要的包含两个部署模块


  • service create


  • stack


分别是依赖于Dockerfile,以及docker-compose


初始化节点-创建Manager节点


docker swarm init 
docker swarm init  --advertise-addr string # 多个网卡需加advertise-addr指定网卡


创建manager节点完成,并获取到了join-token,直接将自己生成的token复制到其他集群上,即可加入


(若不小心clear掉了之后,只需在manager节点上一下命令即可获取。注请在manager节点上进行操作)


# 获取加入管理节点令牌
docker swarm join-token manager
# 获取加入工作节点令牌
docker swarm join-token worker


加入完成后,效果如下


640 (4).jpg


构建私有仓库(可选)


建议构建私人仓库,理由如下


  • 保证源码安全


  • 极速动态更新(加速项目构建、迭代)


创建
 docker service create --name registry --publish published=5000,target=5000 registry:2
 验证
 docker service ls 
 curl http://localhost:5000/v2/


640 (5).jpg


docker service 部署


  • 注意


如果您要在本地开发环境中尝试操作,则可以使用来将引擎置于群集模式docker swarm init


如果您已经在运行多节点群集,请记住,所有 命令docker stackdocker service命令都必须从管理器节点运行。


新建一个文件夹(demo),由于之前以及做过一次了,此次快速完成


# mkdir webDemo && cd webDemo
vim app.py


业务代码如下


from flask import Flaskfrom redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)@app.route('/')def hello():
    count = redis.incr('hits')    return 'Hello World! I have been seen {} times.\n'.format(count)if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)


编写requirements.txt


由于容器中为干净的目录,仅有基础的Linux镜像


requirements.txt 如下


flask        # python 中 web框架redis        # 数据库Redis远程字典,此项目中用于web做缓存


编写Dockerfile


FROM python:3.7-alpine     # 基于 python:3.7-alpine 容器
ADD . /code    # 将本目录下所有的文件复制到容器中code目录下(code目录若不存在则自动创建)
WORKDIR /code    # 将工作目录设为code
RUN pip install -r requirements.txt    # 安装所需第三方包(构建容器时运行)
CMD ["python", "app.py"]    # 容器启动时运行


⚠️构建,推送


docker build -t 127.0.0.1:5000/demo:1 .
docker push 127.0.0.1:5000/demo:1


创建服务


docker service create --name crawler  127.0.0.1:5000/demo:1 # 查看服务docker service ls


640 (6).jpg


动态扩所容


# 五十台机器的分布式集群搭建完成docker service scale crawler=50# 停止docker service scale crawler=0# 更新推送新版本内容至127.0.0.1:5000例如:docker push 127.0.0.1:5000/demo:2# 方法一:docker service scale crawler=0docker service update --image 127.0.0.1:5000/demo:2 crawler
docker service scale =3# 方法二:docker service update --image 127.0.0.1:5000/demo:2 crawler# 二者的区别是,直接执行更新命令时,正在运行的容器会一个一个更新。


docker stack 部署


新增docker-compose.yaml


version: "3.3"                                                                                                               
services:                                                                                                                    
  web:                                                                                                                       
    image: 127.0.0.1:5000/stackdemo                                                                                          
    build: .                                                                                                                 
    ports:                                                                                                                   
      - "8000:8000"                                                                                                          
  redis:                                                                                                                     
    image: redis


运行测试一台机器


docker-compose up -d# 停止并保存docker-compose down --volumes    # docker-compose.yaml中已经制定了images,所以它是直接推送到私有仓库中到# 推送至私有仓库docker-compose push


部署


docker stack deploy --compose-file docker-compose.yaml stackdemo# 查看运行状态docker stack services stackdemo# 五十台机器的分布式集群搭建完成docker service scale stackdemo=50# 停止docker service scale stackdemo=0# 更新推送新版本内容至127.0.0.1:5000例如:docker-compose push 127.0.0.1:5000/stackdemo:2# 方法一:docker service scale stackdemo=0docker service update --image 127.0.0.1:5000/stackdemo:2docker service scale =3# 方法二:docker service update --image 127.0.0.1:5000/stackdemo:2# 二者的区别是,直接执行更新命令时,正在运行的容器会一个一个更新。


一键退出


docker stack rm stackdemo
docker service rm registry


分布式、集群、的枢纽是什么,如何保证他们的“共同作战”?


关于这两个问题个人认为


枢纽是当然是网络啦,


保证”共同作战“的核心为统一的信号量


集群:多个人在一起做同样的事 。


分布式 :多个人在一起做不同的事 。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
|
5天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
152 91
|
6天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
8天前
|
安全 开发工具 git
git分布式版本控制系统及在码云上创建项目并pull和push
通过本文的介绍,我们详细讲解了Git的基本概念和工作流程,并展示了如何在码云上创建项目及进行pull和push操作。Git作为一种分布式版本控制系统,为开发者提供了强大的工具来管理代码变更和协作开发。希望本文能帮助您更好地理解和使用Git及码云,提高开发效率和代码质量。
29 16
|
9天前
|
安全 开发工具 git
git分布式版本控制系统及在码云上创建项目并pull和push
通过本文的介绍,我们详细讲解了Git的基本概念和工作流程,并展示了如何在码云上创建项目及进行pull和push操作。Git作为一种分布式版本控制系统,为开发者提供了强大的工具来管理代码变更和协作开发。希望本文能帮助您更好地理解和使用Git及码云,提高开发效率和代码质量。
37 18
|
13天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
72 44
|
21天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
25天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
58 23
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
49 22