Docker Swarm 集群探索笔记
2020-2-29
| 2023-3-27
Words 2312Read Time 6 min
type
Post
status
Published
date
Feb 29, 2020
slug
Docker-Swarm
summary
学校服务器要负载均衡,根据隔壁 TARI TARI 所说,就要搞双 Nginx 冗余服务器,加上两个后端服务器用来跑 PHP 程序,同时将学校服务器的程序都跑在 Docker 上以便管理,根据 U2 推荐,使用 Swarm 进行集群搭建,一共准备六台服务器。 由于是第一次使用 Docker Swarm,操作起来并不熟练,如果文章有哪里出现错误和问题麻烦大佬们在评论区指出,谢谢 QvQ
tags
开发
工具
Docker
category
技术分享
icon
password

前言

学校服务器要负载均衡,根据隔壁 TARI TARI 所说,就要搞双 Nginx 冗余服务器,加上两个后端服务器用来跑 PHP 程序,同时将学校服务器的程序都跑在 Docker 上以便管理,根据 U2 推荐,使用 Swarm 进行集群搭建,一共准备六台服务器。
由于是第一次使用 Docker Swarm,操作起来并不熟练,如果文章有哪里出现错误和问题麻烦大佬们在评论区指出,谢谢 QvQ
注:本篇文章由 TARI TARI 和 果果 共同创作

开始

先别管那么多,只要你是 CentOS,防火墙先安排上,不然服务从外面(指 Docker 外面)是连不通的。(一个个端口关太鬼麻烦了,先把防火墙关了以便后续操作,这玩意坑了老久)
如果你用 iptable 前方左转 Google

准备材料

  • Docker_Master
  • CentOS7-Worker-Haproxy * 2
  • CentOS-Worker-Web * 2
  • Ubuntu-Worker-DB

给各台主机修改 Hostname

为避免主机在之后的操作中难以识别的情况,先给每台主机修改 Hostname,确保主机名唯一

安装 Docker

在 CentOS 的五台服务器上运行(嫌麻烦的用 Ansible)
来都来了,那顺便把 docker-compose 给安排了吧

对 Swarm 主机进行初始化

执行命令前,给 Master 主机防火墙开启 2377(tcp)端口
给其余的节点主机和 Master 主机开启 7946(tcp & udp)、4789(udp)端口
同时做作地把 80、443 端口打开以免之后出现的问题
参考资料:
在 Swarm 主机上,执行命令
然后在其他主机(节点)上运行这段命令,就是中间 docker swarm join 这行

给节点贴标签

特定节点办特定事,给节点都贴上标签

部署 Portainer

为了方便观察和管理,这里用了 portainer
在 Master 主机上,放置 docker-compose.yml
运行 docker-compose up -d ,打开 http://xxx.xxx.xx.xxx:9000 进行配置

新建一个内网使用

docker默认网段 10.* , 然后本机如果是 10.*,则 docker 里 IP 可能会和咱内网冲突,导致无法访问到内网其他设备。 为了更方便管理,于是新建一个空闲网段
之后在docker-compose.yml 里面加入改网段就好了

Docker Stack 的启动

这里用到 metowolf/docker-lemp
放在 Master 机器上
同样,我也不知道这个是不是正确的食用方法,稍微改改
(此处 /var/www 放在 /home 是因为机器上分区就给 /home 挂了个较大容量的分区,不知道怎么想的(小声
(同时 /etc/php-fpm 就直接栽到 /etc 文件夹,避免其他人上来不知道丢哪了
输入
给 role 为 web 的两个节点分配任务
注:这么分配完了以后,由于 nginx.conf 写的是请求 php-fpm:9000 ,php-fpm 此时有两个host,所以nginx会选择性地去请求这两个其中的一个
注注:这里不用分配 80 和 443 端口,nginx 和 haproxy 的沟通通过 swarm 网络,将 haproxy 和 nginx 放在同一个 swarm 网络即可
然后到此时我感觉我 swarm 的用法是不是搞错了(小声嘀咕
 

部署Haproxy

在 Master 主机上,放置 docker-compose.yml
haproxy 服务器上
注意 用证书要把两个证书合并
可以在控制台运行
合并证书。

配置 Nginx 进行自我缓存(不建议)

参考资料:https://juejin.im/post/5af38e0c518825670c45ef6e (作者:我是leon)
本来是可以用 HaProxy + Vanish 来搭建缓存服务器的,闲太麻烦就直接用 nginx 搞了(
在 nginx.conf 中添加以下设置
(这里为了能够外部调用删除缓存写在 PHP 和 nginx 的公共目录下
 

部署 Syncthing

注意:此处不能按照此方法用swarm分配任务,或者你在 docker-compose 单独写两个 services 也行,并且将两个 services 分别分配到不同的端口,否则连接到 Syncthing 控制台时将会产生混乱。
原因:这里分配完端口后,会向 swarm 网络的所有节点打开端口,然后在任意节点上尝试连接该端口就会自动转发到对应的节点上。
为了让两台 Web 服务器的文件同步,同时也方便查看,这里使用 syncthing
先给所有服务器创建 /etc/syncthing 文件夹
我本来是想用 swarm 派的,结果发现创建完了以后,一台服务器的syncthing GUI总是喜欢去连接一下另一台,另一台总是喜欢去连接一下这台,瞎搞
编辑 docker-compose.yml
 

安装WordPress

配置 nginx, 先把 原来的 https 证书搬过来,换上
解析 网站根目录至 /var/www/wordpress
虽然物理主机上网站根目录的 /home/www 目录下, 但 docker 里的逻辑卷于 /var/www/
 

配置 nfs

此处配置 nfs 以便文件同步(?)
 

rsync 同步

(注:如果上面 Syncthing 不好用的话那还是用这个吧(
主服务器 以及 从服务器文件
 

数据库服务器允许新ip访问

如果是通过更换 ip 的方式迁移数据库这一步就不需要了
 

时间同步

 
关闭所有 debug 信息
配置好 nginx 把域名解析到新服务器ip应该问题不大了。

乱七八糟的问题

ailed to chown socket at step GROUP: No such process

解决方法:
添加docker用户组
 

Haproxy dns 解析问题

notion image
这里理论上是不应该出现的,出现这个问题先去看一下 开始 / 对 Swarm 主机进行初始化 这里是否配置正确
先进容器试试能不能 ping 通nginx,如果不能,关掉防火墙。
也有可能是 haproxy 版本问题,好像 ≤ 1.6 是没有 dns 解析功能的。
还是无法解决右转 Google
 
 
  • 开发
  • 工具
  • Docker
  • 计算机网络原理实验三──三层交换机基本配置使用 Python 登录校园网的一次探索
    Loading...