博主使用的配置都在github上面, 大家拉下来即可使用
swarm简单介绍
我们先说一下docker
集群之一的swarm集群
, 先说一下集群这个东西, 它并不适用于任何项目, 他是为了解决架构中高性能的。将单节点的负载转移到多节点身上, 但是多节点中存在很多问题, 例如节点的状态、通信、调度、任务分配等等, 我们自己来弄的话十分麻烦、相当复杂, 但是使用了docker集群
, 它已经帮我们做好了这些工作, 甚至做的更多。
swarm
和docker-compose
一样, 都是声明yml
文件来创建应用服务
那么我们知道, 集群就是多台机器进行工作, 肯定要有master
和worker
,
来看看集群架构图
多master
, 多worker
, 已经是比较比较复杂了。最少master
得有一个,我们这边先弄一个,你们后期可以自己扩展
然后我们再说一下swarm
里面的一些概念:
- services
swarm service
是一个抽象的概念,它只是一个对运行在swarm
集群上的应用服务,所期望状态的描述。它就像一个描述了下面物品的清单列表一样:
- 服务名称
- 使用哪个镜像来创建容器
- 要运行多少个副本
- 服务的容器要连接到哪个网络上
- 应该映射哪些端口
- 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
因为博主这边docker
是18.09
, 所以我编写version
为最新版3.7
的yml
文件, 大家可以对应Docker Engine
来编写对应version
的yml
- 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
查看一下服务咋样了
都启动完了, 可以查看访问每个节点的ip了, 都没有问题,数据表没有建立,所以抛的异常, redis
已经OK
在 Swarm
集群管理节点新建该文件,其中的 visualizer
服务提供一个可视化页面(就是yml里面声明的那个visualizer),我们可以从浏览器中很直观的查看集群中各个服务的运行节点。来看看效果
结束语
swarm
集群功能挺强大,博主不再做过多介绍,资料都在github上, 大家拉取下来看看即可。希望大家多看看文档,实践,下次我们说说k8s