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时,宿主机上的一个文件或目录被挂载到容器上。 

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 123... \
--name SERVICE-NAME \
--mount type=bind,src=<VOLUME-NAME>,dst=<CONNTAINER-PATH> \
<IMAGE>
 
2.只读挂载格式
 
#docker service create \
--replicas 123... \
--name SERVICE-NAME \
--mount type=bind,src=<VOLUME-NAME>,dst=<CONNTAINER-PATH>,ro  \
<IMAGE>

  5.3 创建服务

  1)创建挂载目录 

1
2
# 在每个节点上创建
 mkdir -/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 \
-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是差不多的,只不过需要指定目录路径。同样各个节点之间的数据不共享,每个容器只能使用本节点中数据卷中的内容。

posted on 2018-04-21 05:38  彼de潘  阅读(301)  评论(0编辑  收藏  举报