博主使用的配置都在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
本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。