Nginx 的 Swarm 化

这个题目可能显得比较不严谨,但是也想不到什么好的名字。这篇主要就是实现,在一个 Swarm 集群里面的 Nginx 的服务部署。且实现可以很快的进行 文件变更以及配置变更的统一提交。

这里至于之前的对于Swarm 的服务功能的测试不同了,更加偏向应用。再往后一部分,将会使用stack 来实现一个真正可用的服务架构。

正文

使用Swarm 很容易的实现了一个服务:

docker service create \
--replicas 2 \  # 两个副本(一共)
--network ngx_net \     # 虚拟网络
--name my-test \        # 服务名
-p 80:80 nginx          # 端口映射(本地到容器)

但是实际上要对这些服务进行以下内容的变更,就需要挂载外部卷了。

外部卷的挂载

在创建服务的时候,可以使用以下,命令进行 一个数据卷的创建,以及挂载。而且在服务被创建的时候,这些容器会被拷贝到多个节点上去,命令如下

# 创建一个挂载卷
docker volume create --name myvolume
# 在容器内挂载卷
docker service create \
--replicas 2 \
--network ngx_net \
--mount type=volume,src=myvolume,dst=/wangshibo \
--name test-nginx nginx

但是问题来了,如果部署完成之后,对配置文件进行变更,这文件并不会同步到每个节点上。这里打算使用 NFS 进行部署

NFS 的部署

为了实现多节点的配置文件的同步,以及数据卷的统一管理,这里就直接使用NFS

使用 apt 直接进行服务的安装 :

apt-get install nfs-common      # 这个在所有节点进行安装
apt-get install nfs-kernel-server   # 这里是NFS的服务,安装在服务节点上

配置共享目录 /etc/exports ,添加新行。

/srv/nfs/  bgb1(rw,sync)  bgb2(rw,sync)  bgb3(rw,sync)

重启服务端的nfs服务,并且尝试挂载:

> service nfs-kernel-server start
# b 主机上进行挂载
> mount bgb0:/srv/nfs /mnt/
> chmod a+x /srv/nfs -R

测试完成,NFS 部署完成。

NFS 共享卷挂载

为了实现多个节点之间的文件共享。这里遇到了很坑的问题,不知道是自己的理解问题还是BUG什么,具体症状是 NFS卷 不进行自动的挂载

新建一个NFS的卷,下面命令进行参数修改即可。

docker volume create --driver local \
--opt type=nfs4 \
--opt o=addr=,rw \
--opt device=: \
share

由于上面的问题折腾了很久的时间,只好暂时使用手动进行挂载,后面再进行逐步的研究。

mount bgb0:/srv/nfs /var/lib/docker/volumes/share/_data
# 用作页面 /usr/share/nginx/html/
mount bgb0:/srv/nfs/nginx/html /var/lib/docker/volumes/Nginx_html/_data
# 用作配置 /etc/nginx/
mount bgb0:/srv/nfs/nginx/conf /var/lib/docker/volumes/Nginx_conf/_data

和第一部分的创建服务一样,这里直接使用Portainer来进行创建各个节点的卷,然后手动执行上面的命令,进行NFS的挂载,没有美感

(应该又是一个 BUG ,在创建服务的时候初始配置,如果直接使用了当前的卷,其默认的的是新建新的卷。而不是对原有的卷来进行拷贝,这点待会可能去提个 Issue 。)需要在服务创建之后,后面进行第二次的挂载,才能正确的挂载 nginx_html 这个卷

当全部进行手动挂载之后,所有的配置文件都可可以从NFS主机处获取。实现配置的统一管理


记得映射 80 和 443 完成主机功能配置。

Nginx 配置

当前面的基于 NFS 的共享配置完成之后,可以直接对之前的配置进行平行迁移即可,(copy-paste)。

完成配置文件的迁移之后,可以直接在终端里面进行平滑升级。

docker service update WebTest

frpc 的部署

这里这里可以直接在 DockerHub上面找到相应的镜像,前面还以为没有,打算自己写 Dockerfile的,现在既然遇上了就直接使用了。

xddxdd/frpc 这个是 frpc 的image ,里面刚好有 armv7 的版本 。

entry point     /usr/bin/frpc
working Dir     /frp

这里,直接 bind 绑定 host 的目录,到容器内部

--mount type=bind,src=/conf,dst=/frp

主机目录配置文件 frpc.ini ,其配内容如下

[common]
server_addr = *******
server_port = 7000
token = *******

[web_swarm]
type = tcp
local_ip = 192.168.***.***
local_port = 443
remote_port = ******

之后直接对容器进行重启即可。

这里是在云服务器上使用 Nginx 做一个 upstream , 具体的细节前面有讲 不在赘述。至此功能测试完毕。

后面将会使用 Stack 和 network 功能, 实现结构的整体部署。还得解决 NFS 的不自动挂载的问题

是不是每个人年轻的时候都有这样一段日子,鸿鹄志高却难遂,迷茫地过着,昏昏噩噩地耗,最终不是妥协泯然众人,就是找不到出口被生活围困。这时候家人朋友,看在眼里,哪怕不说,心里想的也是“小镇青年何必心怀远方”这样的想法吧。(J·M·库切《青春》)

留下点什么吧