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@node
2
tmp]
# touch a.txt
[root@node
2
tmp]
# ls
a.txt
# 在manager节点查看
# ls /data/nfs
a.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 \ > 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是差不多的,只不过需要指定目录路径。同样各个节点之间的数据不共享,每个容器只能使用本节点中数据卷中的内容。