1. volume
# 创建数据卷
docker service create \
--mount type=volume src=<VOLUME-NAME>,dst=<CONTAINER-PATH> \
--name myservice \
<IMAGE>
# 查看数据卷详细信息
docker volume inspect <VOLUME-NAME>
# 使用NFS共享存储作为数据卷
docker service create \
--mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-
opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-
address>,vers=4,soft,timeo=180,bg,tcp,rw"‘ \
--name myservice \
<IMAGE>
[root@node1 ~]# docker volume ls DRIVER VOLUME NAME
创建数据卷
[root@node1 ~]# docker service create --replicas 3 --name apache --mount type=volume,src=test,dst=/data/web/ httpd:2.4
f3hgfbfosh53kqkghd8246dmi
参数说明:
--replicas:创建3个httpd副本;--name:自定义名称为apache;--mount:挂载类型为volume;src:src挂载源为test,相当于执行了docker volume test;dst:dst挂载目的路径为apache容器中的路径/data/web/;nginx:通过nginx镜像来运行;
在通过docker volume inspect test可以看到卷自动挂载到了/var/lib/docker/volumes/nginx-vol/_data目录下
[root@node1 web]# docker volume inspect test [ { "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/test/_data", "Name": "test", "Options": {}, "Scope": "local" } ]
本地数据卷驱动数据不能共享
本地数据卷驱动创建的数据卷nginx-vol,其持久化的数据只能被本节点上service中的容器使用。在不同节点的数据卷中新建不同的文件,查看每个容器读取文件的情况:
在 ‘/var/lib/docker/volumes/test/_data’ 新建文件 [root@node1 _data]# ls manager.txt [root@node2 ~]# ll /var/lib/docker/volumes/test/_data total 0
其余节点是一样的,所以每个容器只能使用本节点数据卷中的内容
Swarm 共享存储NFS
当构建一个有容错机制的应用时,有一些数据或文件需要共享到各个节点服务的容器中,有多种方法可以实现,其中一种就是外部存储系统,比如NFS或者Amazon S3。
安装nfs
所以节点安装
yum -y install nfs-utils
# 在manager节点上启动nfs服务端
# systemctl enable nfs
# systemctl start nfs
# 工作节点上启动nfs客户端systemctl start rpcbind
在manager节点上配置nfs
# 创建目录 # mkdir -p /data/nfs # 设置nfs vim /etc/exports # swarm nfs share volume /data/nfs 192.168.3.0/24(rw,sync,no_root_squash) /data/nfs : 共享的目录 192.168.3.0/24 : 可以访问的主机网段 rw : 可读写权限,只读权限ro sync : 同步,数据更安全,速度慢 async : 异步,速度快,效率高,安全性低 no_root_squash :NFS 服务共享的目录的属性, 如果用户是root, 对这个目录就有root的权限 # 重启nfs # systemctl restart nfs
测试挂载nfs共享目录
在node-02节点
[root@node2 ~]# mount -t nfs 192.168.3.245:/data/nfs /tmp[root@node2 tmp]# touch a.txt[root@node2 tmp]# lsa.txt# 在manager节点查看# ls /data/nfsa.txt#可以,umount 掉[root@node-01 ~]# umount /tmp
使用nfs volume创建服务
[root@node1 ~]# 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=192.168.3.245:/data/nfs,"volume-opt=o=addr=192.168.3.245,vers=4,soft,timeo=180,bg,tcp,rw"' nginx
查看服务

查看数据卷

测试共享性
[root@node1 nfs]# touch /data/nfs/a.txt
[root@node1 nfs]# docker volume inspect nfs-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nfs-vol/_data",
"Name": "nfs-vol",
"Options": {
"device": "192.168.3.245:/data/nfs",
"o": "addr=192.168.3.245,vers=4,soft,timeo=180,bg,tcp,rw",
"type": "nfs"
},
"Scope": "local"
}
]



如果遇到报错:
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
bind说明
Docker早期就支持这个特性。与volumes相比,Bind mounts支持的功能有限。使用bind mounts时,宿主机上的一个文件或目录被挂载到容器上。
使用格式
1. 读写挂载格式 #docker service create \ --replicas 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>
创建服务
创建挂载目录
# 在每个节点上创建 mkdir -p /data/bind_vol
使用bind形式创建服务
# docker service create \ > --replicas 3 \ > --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
bind说明
Docker早期就支持这个特性。与volumes相比,Bind mounts支持的功能有限。使用bind mounts时,宿主机上的一个文件或目录被挂载到容器上。
|
1
2
|
警告:使用Bind mounts的一个副作用是,容器中运行的程序可以修改宿主机的文件系统, 包括创建,修改,删除重要的系统文件或目录。这个功能可能会有安全问题。 |
详细了解可参考官方文档:https://docs.docker.com/storage/bind-mounts/
5.2 使用格式
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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)创建挂载目录
|
1
2
|
# 在每个节点上创建 mkdir -p /data/bind_vol |
2)使用bind形式创建服务
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[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 \> nginxyt7gsouyw6zcdp13tay3f5eu4overall progress: 5 out of 5 tasks1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged |
整个形式和volume是差不多的,只不过需要指定目录路径。同样各个节点之间的数据不共享,每个容器只能使用本节点中数据卷中的内容。
浙公网安备 33010602011771号