Docker集群管理Swarm数据持久化
一、前言
和docker容器一样,Swarm集群中运行的服务也能够做数据持久化。我们可以通过volume、bind和nfs等方式来实现swarm集群应用数据的持久化。其实和docker数据持久化的形式是一样的。
二、系统环境
| 节点名称 | IP | 操作系统 | 内核版本 |
| manager | 172.16.60.95 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
| node-01 | 172.16.60.96 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
| node-02 | 172.16.60.97 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
| node-03 | 172.16.60.98 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
三、通过volume实现数据持久化
3.1 volume说明
卷是绕过联合文件系统的一个或多个容器内的特定目录。 卷被设计为保持数据,与容器的生命周期无关。 因此,Docker在删除容器时不会自动删除卷,也不会“垃圾收集”不再由容器引用的卷。 也称为:数据卷。
需要更详细了解volume可参考官方文档:https://docs.docker.com/storage/volumes/
3.2 使用格式
docker service create \
--replicas 1或2或3... \
--name SERVICE-NAME \
--mount type=volume,src=<VOLUME-NAME>,dst=<CONNTAINER-PATH> \
<IMAGE>
3.3 创建服务的volume
When you start a service and define a volume, each service container uses its own local volume.
None of the containers can share this data if you use the local volume driver, but some volume drivers do support shared storage.
Docker for AWS and Docker for Azure both support persistent storage using the Cloudstor plugin. 使用service的方式创建的volume数据卷,该service中的容器只会使用其所在节点服务器的中的volume。
当使用本地数据卷驱动时,所用的容器都无法共享其数据。
但是有一些数据卷驱动支持共享存储。
1)创建数据卷
[root@manager ~]# docker service create \
--replicas 5 \
--name my-web \
--mount type=volume,src=nginx-vol,dst=/data \
nginx nsrkogg0x5t617qszxylv6rfn
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged 参数说明: --replicas:创建5个nginx副本;
--name:自定义名称为my-web;
--mount:挂载类型为volume;
src:src挂载源为nginx-vol,相当于执行了docker volume nginx-vol;
dst:dst挂载目的路径为nginx容器中的路径/data;
nginx:通过nginx镜像来运行;
2)查看创建的副本
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
nsrkogg0x5t6 my-web replicated 5/5 nginx:latest
[root@manager ~]# docker service ps my-web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
sv6ho8p1ngoo my-web.1 nginx:latest manager Running Running 2 minutes ago
p601cxw8x5gr my-web.2 nginx:latest node-02 Running Running 2 minutes ago
qcgdyxkwzk00 my-web.3 nginx:latest node-03 Running Running 2 minutes ago
9adosd6zoaeb my-web.4 nginx:latest node-01 Running Running 2 minutes ago
jjv4if4glv4b my-web.5 nginx:latest manager Running Running 2 minutes ago
3)查看数据卷、挂载的数据
在每个有task节点上都会自动创建一个nginx-vol的数据卷 # manager 节点
[root@manager ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol # 工作节点
[root@node-02 ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
在通过docker volume inspect nginx-vol可以看到nginx-vol卷自动挂载到了/var/lib/docker/volumes/nginx-vol/_data目录下
[root@manager ~]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2018-04-11T18:08:32+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
4)本地数据卷驱动数据不能共享
本地数据卷驱动创建的数据卷nginx-vol,其持久化的数据只能被本节点上service中的容器使用。在不同节点的数据卷中新建不同的文件,查看每个容器读取文件的情况: # 在/var/lib/docker/volumes/nginx-vol/_data 新建文件 # manager: manager.txt
root@9590af9e71f5:/data# ls
manager.txt # node-01: node-01.txt
root@d5d785dbcdba:/data# ls
node-01.txt ...... 其余节点是一样的,所以每个容器只能使用本节点数据卷中的内容
四、Swarm 共享存储NFS
当构建一个有容错机制的应用时,有一些数据或文件需要共享到各个节点服务的容器中,有多种方法可以实现,其中一种就是外部存储系统,比如NFS或者Amazon S3。

4.1 安装nfs
所以节点安装 yum -y install nfs-utils # 在manager节点上启动nfs服务端
[root@manager ~]# systemctl enable nfs [root@manager ~]# systemctl start nfs # 工作节点上启动nfs客户端
systemctl start rpcbind
4.2 在manager节点上配置nfs
# 创建目录
[root@manager ~]# mkdir -p /data/nfs_vol # 设置nfs
vim /etc/exports # swarm nfs share volume
/data/nfs_vol 172.16.60.0/24(rw,sync,no_root_squash) /data/nfs_vol : 共享的目录
172.16.60.0/24 : 可以访问的主机网段
rw : 可读写权限,只读权限ro
sync : 同步,数据更安全,速度慢
async : 异步,速度快,效率高,安全性低
no_root_squash :NFS 服务共享的目录的属性, 如果用户是root, 对这个目录就有root的权限 # 重启nfs
[root@manager data]# systemctl restart nfs
4.3 测试挂载nfs共享目录
在node-01节点 [root@node-01 ~]# mount -t nfs 172.16.60.95:/data/nfs_vol /tmp
[root@node-01 tmp]# touch a.txt
[root@node-01 tmp]# ls
a.txt # 在manager节点查看
[root@manager ~]# ls /data/nfs_vol/
a.txt #可以,umount 掉
[root@node-01 ~]# umount /tmp
4.4 使用nfs volume创建服务
1)创建服务
[root@manager ~]# docker service create \
> --replicas 5 \
> --name my-nginx \
> -p 80:80 \
> --mount 'type=volume,src=nfs-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-nocopy=true,volume-opt=type=nfs,volume-opt=device=172.16.60.95:/data/nfs_vol,"volume-opt=o=addr=172.16.60.95,vers=4,soft,timeo=180,bg,tcp,rw"' \
> nginx
如果遇到报错:
1/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d…
2/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d…
3/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d…
4/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d…
5/5: failed to chmod on /var/lib/docker/volumes/nfs-vol/_data: chmod /var/lib/d… # 加一个参数
volume-nocopy=true
2)查看服务
[root@manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
7xfkk34fs23o my-nginx replicated 5/5 nginx:latest *:80->80/tcp
[root@manager ~]# docker service ps my-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
tmb0ifqwwiys my-nginx.1 nginx:latest manager Running Running 2 minutes ago
1899caz2mpuc my-nginx.2 nginx:latest node-01 Running Running 2 minutes ago
o25ssf6zsbzo my-nginx.3 nginx:latest node-03 Running Running 2 minutes ago
uhj1otbqw1ph my-nginx.4 nginx:latest node-03 Running Running 2 minutes ago
jna7v8v6k1vm my-nginx.5 nginx:latest node-02 Running Running 2 minutes ago
3)查看数据卷
[root@manager ~]# docker volume ls
DRIVER VOLUME NAME
local nfs-vol
和volume一样,每个分配task的节点上都会有这个nfs-vol的数据卷
4)测试共享性
#刚才将数据卷挂载到了nginx的默认web目录/usr/share/nginx/html,是可以直接访问其中静态文件的 1. 在manager节点/var/lib/docker/volumes/nfs-vol/_data 新建 a.txt 2. 在node-01 /var/.../_data 中修改a.txt
It's nfs volume test. 3.访问测试

测试表明节点间可以通过nfs volume实现数据共享。
五、使用bind方式持久化数据
5.1 bind说明
Docker早期就支持这个特性。与volumes相比,Bind mounts支持的功能有限。使用bind mounts时,宿主机上的一个文件或目录被挂载到容器上。
警告:使用Bind mounts的一个副作用是,容器中运行的程序可以修改宿主机的文件系统,
包括创建,修改,删除重要的系统文件或目录。这个功能可能会有安全问题。
详细了解可参考官方文档:https://docs.docker.com/storage/bind-mounts/
5.2 使用格式
1. 读写挂载格式 #docker service create \
--replicas 1或2或3... \
--name SERVICE-NAME \
--mount type=bind,src=<VOLUME-NAME>,dst=<CONNTAINER-PATH> \
<IMAGE> 2.只读挂载格式 #docker service create \
--replicas 1或2或3... \
--name SERVICE-NAME \
--mount type=bind,src=<VOLUME-NAME>,dst=<CONNTAINER-PATH>,ro \
<IMAGE>
5.3 创建服务
1)创建挂载目录
# 在每个节点上创建
mkdir -p /data/bind_vol
2)使用bind形式创建服务
[root@manager ~]# docker service create \
> --replicas 5 \
> --name my-web \
> -p 80:80 \
> --mount type=bind,src=/data/bind_vol,dst=/usr/share/nginx/html \
> nginx
yt7gsouyw6zcdp13tay3f5eu4
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
整个形式和volume是差不多的,只不过需要指定目录路径。同样各个节点之间的数据不共享,每个容器只能使用本节点中数据卷中的内容。
Docker集群管理Swarm数据持久化的更多相关文章
- Docker集群管理(一)—— 基础docker+swarm+shipyard
目的 学习docker的集群管理,摸索出高可用的docker微服务架构方案.本篇文章只初步的了解下swarm(docker新版已集成了swarm)的使用,了解docker的发现服务的基础方法(dock ...
- docker集群管理之kubernetes
一.简介 kubernetes又叫做k8s,是Google开发的一款开源的docker集群管理工具,在这里对它的“发家史”,我不做过多的阐述,有时间大家可以自己去百度一下: 下面我要讲的就是容易混淆的 ...
- docker集群管理
docker集群管理 ps:docker machine docker swarm docker compose 在Docker Machine发布之前,你可能会遇到以下问题: ...
- 基于zookeeper+mesos+marathon的docker集群管理平台
参考文档: mesos:http://mesos.apache.org/ mesosphere社区版:https://github.com/mesosphere/open-docs mesospher ...
- Docker集群管理(三)—— docker swarm mode基础教程
docker从1.12版(及后续版本)集成了swarmkit.可以方便的实现docker集群.它有哪些特点呢: 集成了集群功能 分散设计:manager和worker两种节点. 声明式服务模式 可伸缩 ...
- Docker集群管理(二)—— docker+swarm+etcd+shipyard
引言 前一篇介绍如何简单的搭建一个可视化管理的docker集群,本篇将在此基础之上引入etcd发现服务. 目的 使用etcd发现服务解决swarm内置发现服务的不稳定问题.etcd采用raft算法,这 ...
- docker集群管理之swarm
一.简介 docker集群管理工具有swarm.k8s.mesos等,我所用到的是swarm和k8s,这篇文章主要介绍swarm:swarm是docker集成的原生 管理工具,只要你安装上docker ...
- Docker集群管理工具 - Kubernetes 部署记录 (运维小结)
一. Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...
- Centos下安装Docker集群管理工具Shipyard
一. Docker Shipyard是什么 ? shipyard是一个开源的docker管理平台,其特性主要包括: 支持镜像管理.容器管理. 支持控制台命令 容器资源消耗监控 支持集群swarm,可以 ...
随机推荐
- JSBridge实现示例
前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 Hybrid APP架构设计思路 marcuswestin/WebViewJavascriptBridge 楔子 本文介绍JSBridge的完整 ...
- 面向对象OO第5-7次作业总结
面向对象OO第5-7次作业总结 学习OO七周了,深切的感受到了这门课程的不友好.前三次作业能够算是勉强地通过了,但是从第五次作业开始就完全GG了.这三次作业,从多线程电梯开始,然后文件监控,然后到出租 ...
- The Begining
学习记录之旅,就此开始.软件工程,Java神马的统统到我碗里来.
- 《UML大战需求分析》-读后感二
活动图将流成分解为一个一个的活动,通过活动的先后顺序来展示流程,而状态机图是从某个事物的状态是如何转变的角度来展示流程,首先确定事物,然后找出状态,状态之间的箭头叫转换,箭头上的文字说明了是什么事情导 ...
- static 继承
静态方法大家应该都比较熟悉,在这里主要谈一下静态方法在继承时的一些注意事项. 1.父类方法如果是静态方法,子类不能覆盖为非静态方法: 2.父类方法如果是非静态方法,子类不能覆盖为静态方法: 3.父类静 ...
- Beta后续感想/吐槽
感想 磨人的软工实践终于结束了 艰难的度过了一学期,还是写点什么纪念一下吧. 大一大二的时候就听说软工实践是魔鬼般的锻炼,于是当年不知天高地厚的我是很期待的,终于,我大三了. 后来,我长大了. alp ...
- notepad++ 安装go插件
1. 想学习go语言 使用notepad++ 但是发现无法安装 gonpp的插件 花了很长时间. 发现问题为: 前几天将notepad++ 升级到了 7.6 的版本 然后使用 plugin manag ...
- WDS迁移注意事项
先说背景:公司使用WDS来部署操作系统,目前DHCP和WDS都安装在同一台服务器上,但是此服务器已过保,所以筹划迁移,将WDS和DHCP分别迁移到两台服务器上.迁移计划是保持WDS暂时不动,DHCP先 ...
- mybaits入门(含实例教程和源码) http://blog.csdn.net/u013142781/article/details/50388204
前言:mybatis是一个非常优秀的存储过程和高级映射的优秀持久层框架.大大简化了,数据库操作中的常用操作.下面将介绍mybatis的一些概念和在eclipse上的实际项目搭建使用. 一.mybati ...
- hdu4285-circuits
题意 一个 \(n\times m\) 的方格纸,有一些格子不能走.给出一个 \(k\) ,求有多少种方案,用 \(k\) 个不相交,不嵌套 的环覆盖所有可以走的格子.\(n,m\le 12\) . ...