Docker Swarm集群部署lnmp+redis

2022-10-05 12:15:49

博主使用的配置都在github上面, 大家拉下来即可使用

swarm简单介绍

我们先说一下docker集群之一的swarm集群, 先说一下集群这个东西, 它并不适用于任何项目, 他是为了解决架构中高性能的。将单节点的负载转移到多节点身上, 但是多节点中存在很多问题, 例如节点的状态、通信、调度、任务分配等等, 我们自己来弄的话十分麻烦、相当复杂, 但是使用了docker集群, 它已经帮我们做好了这些工作, 甚至做的更多。

swarmdocker-compose一样, 都是声明yml文件来创建应用服务

那么我们知道, 集群就是多台机器进行工作, 肯定要有masterworker,

来看看集群架构图

集群架构图

master, 多worker, 已经是比较比较复杂了。最少master得有一个,我们这边先弄一个,你们后期可以自己扩展

然后我们再说一下swarm里面的一些概念:

  • services
    swarm service是一个抽象的概念,它只是一个对运行在swarm集群上的应用服务,所期望状态的描述。它就像一个描述了下面物品的清单列表一样:
  1. 服务名称
  2. 使用哪个镜像来创建容器
  3. 要运行多少个副本
  4. 服务的容器要连接到哪个网络上
  5. 应该映射哪些端口
  • task
    Docker Swarm中,task是一个部署的最小单元,task与容器是一对一的关系。
  • stack
    stack是描述一系列相关services的集合。我们通过在一个YAML文件中来定义一个stack。简而言之就是一个应用 包括了什么数据库 框架等,一个服务 = 多个容器

swarm基本操作命令

  • 创建应用
docker stack deploy -c docker-compose.yml laravel
 
 # -c 指定yml文件 后面跟的是应用名
  • 删除应用
docker stack rm laravel
  • 查看应用
docker stack ps laravel
  • 查看所有服务
docker service ls

小试牛刀-搭建lnmp

因为博主这边docker18.09, 所以我编写version为最新版3.7yml文件, 大家可以对应Docker Engine来编写对应versionyml

  • docker-compose.yml
version: "3.7"   # 声明yml文件版本

services: 
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=1234567
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=1234567


# redis服务被限制为使用不超过50M的内存和0.50(不超过单个内核的50%)可用处理时间(CPU),并且具有保留20M的内存和0.25CPU时间(始终可用)。
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      

# 构建一个镜像(利用docker-compose执行此文件);如果在集群模式下部署,将忽略此项,docker stack仅仅接受预先构建好的镜像。 

  php-fpm:
    image: wearemobedia/php-fpm:latest
    volumes:
       - ./www:/application
    working_dir: /application  
    environment: 
      - APP_ENV=local
      - APP_DEBUG=true
      - APP_TIMEZONE=UTC
      - DB_CONNECTION=mysql # 设置为服务名 别搞错了 重点
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_DATABASE=test
      - DB_USERNAME=test
      - DB_PASSWORD=1234567
      - CACHE_DRIVER=redis
      - QUEUE_DRIVER=redis
      - REDIS_HOST=redis
      - REDIS_PORT=6379
   
    deploy:
      mode: replicated # 默认
      replicas: 1 # 副本数量一个



  webserver:
      image: nginx:alpine
      labels: # 指定标签
        com.example.description: "This label will appear on all containers for the web service"
      volumes:
        - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      ports:
        - "80:80"

      depends_on: # 依赖于mysql redis
        - php-fpm

  visualizer: # 可视化的东西
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      restart_policy:  # 配置是否以及如何在退出容器时重新启动容器
        condition: on-failure # 条件
        delay: 1s # 延时
        max_attempts: 3 # 重新启动次数
        window: 120s # 决定重新启动是否成功之前要等待的时间
      placement:
        constraints: [node.role == manager]

进入从github上拉下来的仓库,利用编写好的yml创建应用

sudo docker stack deploy -c docker-compose.yml laravel

查看一下服务咋样了

service-ls

都启动完了, 可以查看访问每个节点的ip了, 都没有问题,数据表没有建立,所以抛的异常,redis已经OK

效果

Swarm 集群管理节点新建该文件,其中的visualizer 服务提供一个可视化页面(就是yml里面声明的那个visualizer),我们可以从浏览器中很直观的查看集群中各个服务的运行节点。来看看效果

集群分布情况

结束语

swarm集群功能挺强大,博主不再做过多介绍,资料都在github上, 大家拉取下来看看即可。希望大家多看看文档,实践,下次我们说说k8s

  • 作者:憧憬blog
  • 原文链接:https://blog.csdn.net/qq_24694139/article/details/107539949
    更新时间:2022-10-05 12:15:49
Copyright © 2022 忙忙碌碌网 

把实用的技术和经验,分享给最需要的读者,希望每一位来访的朋友都能有所收获!