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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
目录
相关文章
|
9天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
29 3
实战~如何组织一个多容器项目docker-compose
|
1月前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
173 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
1月前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
760 12
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
24天前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
29 2
|
1月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
1月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
143 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
1月前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
43 3
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
1月前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
1月前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
62 1