发上等愿,结中等缘,享下等福;择高处立,就平处坐,向宽处行。
分类: 虚拟化
2019-09-24 13:37:22
volume 是将宿主级的目录映射到容器中,以实现数据持久化。
可以用两种方式来实现:
volume 默认模式:工作节点宿主机数据同步到容器内。
volume NFS 共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步到容器。
环境:
系统:Centos 7.4 x64
应用版本:Docker 18.09.0
管理节点:192.168.1.79
工作节点:192.168.1.78
工作节点:192.168.1.77
volume 默认模式
1、管理节点:创建服务并添加数据卷
docker service create \
--mount type=volume,src=test,dst=/data \
--name v-hello \
busybox ping
复制代码
# 创建服务
docker service create \
# 创建数据卷 type=volume,src=volume名称,dst=容器目录
--mount type=volume,src=test,dst=/data \
# 服务名
--name v-hello \
# 镜像
busybox
# 容器内执行指令
ping
复制代码
2、工作节点1或2:查看数据卷
命令:docker volume ls
DRIVER VOLUME NAME
local test
复制代码
命令:docker volume inspect test
[
{
"Driver": "local",
"Labels": null,
# 挂载宿主级目录
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": {},
"Scope": "local"
}
]
复制代码
3、工作节点1或2:进入容器查看已创建数据卷
命令:docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
019d6e42a364 busybox:latest "ping " 33 seconds ago Up 31 seconds v-hello.1.m22z2lmpk4c27a9nsji6q0mog
# 1、进入容器
docker exec -it 019d6e42a364 sh
# 2、容器内进入数据卷节点
/ # cd /data
/data #
# 3、容器外进入数据卷目录创建文件
cd /var/lib/docker/volumes/test/_data
touch a.txt
# 4、容器内测试data目录数据 完成测试!
/data # ls
a.txt
volume NFS共享存储模式(推荐)
一、搭建NFS服务与客户端
1、管理节点:安装nfs服务端、配置nfs主配置文件、添加权限、启动
yum install nfs-utils -y
vim /etc/exports
# 添加目录给相应网段访问并添加读写权限
/opt/docker/wwwroot 192.168.1.0/24(rw)
# 创建共享目录,添加权限
mkdir -p /opt/docker/wwwroot
chmod 777 /opt/docker/wwwroot/
配置文件说明:
/opt/docker/wwwroot 为共享目录
* 192.168.1.0/24 可以为一个网段,一个IP,也可以是域名,域名支持通配符 如: *.com
* rw:read-write,可读写;
* ro:read-only,只读;
* sync:文件同时写入硬盘和内存;
* async:文件暂存于内存,而不是直接写入内存;
* no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
* root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
* all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
* anonuid:匿名用户的UID值
* anongid:匿名用户的GID值。备注:其中anonuid=1000,anongid=1000,为此目录用户web的ID号,达到连接NFS用户权限一致。
* defaults 使用默认的选项。默认选项为rw、suid、dev、exec、auto nouser与async。
* atime 每次存取都更新inode的存取时间,默认设置,取消选项为noatime。
* noatime 每次存取时不更新inode的存取时间。
* dev 可读文件系统上的字符或块设备,取消选项为nodev。
* nodev 不读文件系统上的字符或块设备。
* exec 可执行二进制文件,取消选项为noexec。
* noexec 无法执行二进制文件。
* auto 必须在/etc/fstab文件中指定此选项。执行-a参数时,会加载设置为auto的设备,取消选取为noauto。
* noauto 无法使用auto加载。
* suid 启动set-user-identifier设置用户ID与set-group-identifer设置组ID设置位,取消选项为nosuid。
* nosuid 关闭set-user-identifier设置用户ID与set-group-identifer设置组ID设置位。
* user 普通用户可以执行加载操作。
* nouser 普通用户无法执行加载操作,默认设置。
* remount 重新加载设备。通常用于改变设备的设置状态。
* rsize 读取数据缓冲大小,默认设置1024。–影响性能
* wsize 写入数据缓冲大小,默认设置1024。
* fg 以前台形式执行挂载操作,默认设置。在挂载失败时会影响正常操作响应。
* bg 以后台形式执行挂载操作。
* hard 硬式挂载,默认设置。如果与服务器通讯失败,让试图访问它的操作被阻塞,直到服务器恢复为止。
* soft 软式挂载。服务器通讯失败,让试图访问它的操作失败,返回一条出错消息。这项功能对于避免进程挂在无关紧要的安装操作上来说非常有用。
* retrans=n 指定在以软方式安装的文件系统上,在返回一条出错消息之前重复发出请求的次数。
* nointr 不允许用户中断,默认设置。
* intr 允许用户中断被阻塞的操作并且让它们返回一条出错消息。
* timeo=n 设置请求的超时时间以十分之一秒为单位。
* tcp 传输默认使用udp,可能出现不稳定,使用proto=tcp更改传输协议。客户端参考mountproto=netid
# 开启rpc服务
systemctl start rpcbind
# 启动服务并设置开机自启
systemctl start nfs
2、工作节点:安装nfs客户端、启动服务
yum install nfs-utils -y
# 开启rpc服务
systemctl start rpcbind
# 启动服务并设置开机自启
systemctl start nfs
确认NFS服务器启动成功
[root@master opt]# rpcinfo -p
program vers proto port service
100024 1 udp 50813 status
100024 1 tcp 6021 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 35715 nlockmgr
100021 3 udp 35715 nlockmgr
100021 4 udp 35715 nlockmgr
100021 1 tcp 5350 nlockmgr
100021 3 tcp 5350 nlockmgr
100021 4 tcp 5350 nlockmgr
[root@master opt]# cat /var/lib/nfs/etab
/root/share 172.16.10.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
二、NFS创建共享数据卷
1、管理节点:使用NFS共享存储创建服务及数据卷
docker service create --mount 'type=volume,src=nfs-test,dst=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=192.168.1.79:/opt/docker/wwwroot,"volume-opt=o=addr=192.168.1.79,vers=4,soft,timeo=180,bg,tcp,rw"' -p 8888:80 --name nginx nginx:1.12
复制代码
# 存储类型
type=volume,
# volume名称,
src=
# 目标路径
dst=
# 官方配置
volume-driver=local,
# 服务类型
volumeopt=type=nfs,
# 官方配置参数
volume-opt=device=
"volume-opt=o=addr=
复制代码
2、工作节点1或2:查看创建volumes
docker volume inspect nfs-test
复制代码
[
{
"CreatedAt": "2018-11-08T15:16:35+08:00",
"Driver": "local",
"Labels": {},
# 工作节点宿主级:数据存放位置
"Mountpoint": "/var/lib/docker/volumes/nfs-test/_data",
"Name": "nfs-test",
"Options": {
# 管理几点共享存储位置,与工作节点共享
"device": "192.168.1.79:/opt/docker/wwwroot",
"o": "addr=192.168.1.79,vers=4,soft,timeo=180,bg,tcp,rw",
"type": "nfs"
},
"Scope": "local"
}
]
复制代码
3、工作节点1或2:测试数据卷同步
复制代码
# 管理节点:/opt/docker/wwwroot 目录下创建test文件
touch test
# 工作节点:查看宿主节点宿主是否同步
ls /var/lib/docker/volumes/nfs-test/_data
test
# 工作节点:进入容器节点查看容器是否同步
docker exec -it 7429f79519eb sh
ls /usr/share/nginx/html
test
二、使用 编排的方式发布service
docker compose文档
version: '3.3'
services:
nginx-test5:
image: nginx:latest
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
ports:
- "88:80"
networks:
my-overlay-network:
aliases:
- nginx-test5
volumes:
- "foo_new:/app/share"
volumes:
foo_new:
driver: local
driver_opts:
type: "nfs"
o: "addr=172.16.10.172,rw"
device: ":/root/share"
networks:
my-overlay-network:
driver: overlay
使用docker compose编排不需要分别在每一个主机上手动创建docker volume
发布服务
[root@master opt]# docker stack deploy -c docker-compose.yml app
Creating network app_my-overlay-network
Creating service app_nginx-test5
[root@master opt]# docker stack ls
NAME SERVICES ORCHESTRATOR
app 1 Swarm
rabbit 3 Swarm
[root@master opt]# docker stack services app
ID NAME MODE REPLICAS IMAGE PORTS
ighafroycq0c app_nginx-test5 replicated 3/3 nginx:latest *:88->80/tcp
[root@master opt]# docker service ps app_nginx-test5
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
54gdcmfxh218 app_nginx-test5.1 nginx:latest master Running Running 13 seconds ago
jt2v0mlgqwup app_nginx-test5.2 nginx:latest node2 Running Running 15 seconds ago
z039pxqu4sbl app_nginx-test5.3 nginx:latest node1 Running Running 14 seconds ago
[root@master opt]#
查看docker volume
[root@master opt]# docker volume ls
DRIVER VOLUME NAME
省略......
local app_foo_new
local foo33
local myvol2
local test-vol
[root@master opt]# docker volume inspect app_foo_new
[
{
"CreatedAt": "2019-01-15T11:13:45+08:00",
"Driver": "local",
"Labels": {
"com.docker.stack.namespace": "app"
},
"Mountpoint": "/var/lib/docker/volumes/app_foo_new/_data",
"Name": "app_foo_new",
"Options": {
"device": ":/root/share",
"o": "addr=172.16.10.172,rw",
"type": "nfs"
},
"Scope": "local"
}
]
[root@master opt]#
抽查一个看看node2
查看本机挂载:
[root@node2 ~]# docker volume ls
DRIVER VOLUME NAME
省略......
local app_foo_new
local foo2
local foo33
local myvol2
local test-vol
[root@node2 ~]# docker volume inspect app_foo_new
[
{
"CreatedAt": "2019-01-15T11:13:45+08:00",
"Driver": "local",
"Labels": {
"com.docker.stack.namespace": "app"
},
"Mountpoint": "/var/lib/docker/volumes/app_foo_new/_data",
"Name": "app_foo_new",
"Options": {
"device": ":/root/share",
"o": "addr=172.16.10.172,rw",
"type": "nfs"
},
"Scope": "local"
}
]
[root@node2 ~]# cd /var/lib/docker/volumes/app_foo_new/_data
[root@node2 _data]# ls
index.html
[root@node2 ~]#
查看容器:
[root@node2 _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e333092c3cf nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp app_nginx-test5.2.jt2v0mlgqwupvv5lag7epriwo
91d318ee2b04 rabbitmq:3-management "docker-entrypoint.s…" 7 weeks ago Up 7 weeks 4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp rabbit_rabbit2.1.ykbawm133w4c9rzsrmlm9mkhp
[root@node2 _data]# docker exec -it 7e333092c3cf bash
root@7e333092c3cf:/# cd app/share/
root@7e333092c3cf:/app/share# ls
index.html
root@7e333092c3cf:/app/share#