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]# 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
时,宿主机上的一个文件或目录被挂载到容器上。
警告:使用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是差不多的,只不过需要指定目录路径。同样各个节点之间的数据不共享,每个容器只能使用本节点中数据卷中的内容。