文章目录
Docker数据卷管理
- 为什么要用数据卷?
docker 原生使用的是 联合文件系统 性能差 生命周期与容器相同 - 数据卷的 优点
1, 直接mount到容器中 绕开了分层文件系统
2, 性能和主机磁盘相同,并且不会因容器删除而删除
3, 修改方便,不用进入容器内部,对容器 侵入小
docker managed volume
在dockerfile中使用VOLUME 关键字 声明 挂载 称为 docker管理卷
VOLUME ["<路径1>", "<路径2>"...]
bind mount
在 docker run 中 加上 -v 选项 挂载 称为 bind mount
-v <host path>:<container path>
挂载nginx html
[root@server1 ~]# tree html/
html/
└── index.html
0 directories, 1 file
[root@server1 ~]# docker run -d --name web -v /root/html:/usr/share/nginx/html nginx
[root@server1 ~]# curl 172.17.0.2
hello world
部署nginx和php
- 下载nginx和php镜像
- 创建存储卷
[root@server1 ~]# docker volume create html
[root@server1 ~]# docker volume create conf
- 启动容器
[root@server1 ~]# docker run -d --name web -v conf:/etc/nginx/conf.d -v html:/usr/share/nginx/html -p 80:80 nginx
82559c72a99e8c28a49e70659d92d7667a0259e4e19862b9a44193f6b1fede94
[root@server1 ~]# docker run -d --name php -v html:/usr/share/nginx/html php-fpm
52973c4cd2bd6ee725b51c6dab56126fac7f166da4293704929cc2d95c422406
- 访问
Docker卷插件
docker卷默认使用的是local类型的驱动,只能存在于宿主机,跨主机的volume就需要第三方驱动。
docker官方只提供了插件api,开发者可以根据实际需求定制插件驱动。
convoy 插件
配置nfs
在server1
[root@server1 ~]# yum install -y nfs-utils.x86_64
[root@server1 ~]# systemctl start rpcbind
[root@server1 ~]# cat /etc/exports
nfsdata *(rw,sync,no_root_squash)
[root@server1 ~]# mkdir /nfsdata
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# exportfs -rv
在server2
[root@server2 ~]# yum install -y nfs-utils.x86_64
[root@server2 ~]# systemctl start rpcbind
[root@server2 ~]# mkdir /nfsdata
[root@server2 ~]# showmount -e server1
Export list for server1:
/nfsdata *
[root@server2 ~]# mount server1:/nfsdata /nfsdata
[root@server2 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 8374272 1942564 6431708 24% /
devtmpfs 495252 0 495252 0% /dev
tmpfs 507368 0 507368 0% /dev/shm
tmpfs 507368 6944 500424 2% /run
tmpfs 507368 0 507368 0% /sys/fs/cgroup
/dev/vda1 1038336 135272 903064 14% /boot
tmpfs 101476 0 101476 0% /run/user/0
server1:/nfsdata 8374272 6077184 2297088 73% /nfsdata
配置convoy 插件
[root@server1 ~]# tar xzf convoy.tar.gz
[root@server1 ~]# cd convoy/
[root@server1 convoy]# cp convoy convoy-pdata_tools /usr/local/bin/
[root@server1 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/nfsdata &
[1] 10734
[root@server1 convoy]# DEBU[0000] Creating config at /var/lib/rancher/convoy pkg=daemon
DEBU[0000] driver=vfs driver_opts=map[vfs.path:/nfsdata] event=init pkg=daemon reason=prepare root=/var/lib/rancher/convoy
DEBU[0000] driver=vfs event=init pkg=daemon reason=complete
DEBU[0000] Registering POST, /volumes/umount pkg=daemon
DEBU[0000] Registering POST, /snapshots/create pkg=daemon
DEBU[0000] Registering POST, /backups/create pkg=daemon
DEBU[0000] Registering POST, /volumes/create pkg=daemon
DEBU[0000] Registering POST, /volumes/mount pkg=daemon
DEBU[0000] Registering DELETE, /backups pkg=daemon
DEBU[0000] Registering DELETE, /volumes/ pkg=daemon
DEBU[0000] Registering DELETE, /snapshots/ pkg=daemon
DEBU[0000] Registering GET, /volumes/ pkg=daemon
DEBU[0000] Registering GET, /snapshots/ pkg=daemon
DEBU[0000] Registering GET, /backups/list pkg=daemon
DEBU[0000] Registering GET, /backups/inspect pkg=daemon
DEBU[0000] Registering GET, /info pkg=daemon
DEBU[0000] Registering GET, /volumes/list pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Create pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Remove pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Mount pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Unmount pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Path pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Get pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.List pkg=daemon
DEBU[0000] Registering plugin handler POST, /Plugin.Activate pkg=daemon
[root@server1 convoy]# mkdir /etc/docker/plugins
[root@server1 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server1 convoy]# ll /etc/docker/plugins/convoy.spec
-rw-r--r-- 1 root root 35 Sep 10 18:12 /etc/docker/plugins/convoy.spec
在不同主机间共享卷
创建卷:
[root@server1 plugins]# convoy create vol1
DEBU[0340] Calling: POST, /volumes/create, request: POST, /v1/volumes/create pkg=daemon
DEBU[0340] event=create object=volume opts=map[VolumeType: VolumeIOPS:0 PrepareForVM:false Size:0 BackupURL: VolumeName:vol1 VolumeDriverID:] pkg=daemon reason=prepare volume=vol1
DEBU[0340] Created volume event=create object=volume pkg=daemon reason=complete volume=vol1
DEBU[0340] Response: vol1 pkg=daemon
vol1
[root@server1 plugins]# convoy list
{
"vol1": {
"Name": "vol1",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Thu Sep 10 19:28:47 +0800 2020",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/nfsdata/vol1",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Thu Sep 10 19:28:47 +0800 2020",
"VolumeName": "vol1"
},
"Snapshots": {}
}
}
运行nginx
docker run -d --name web -v vol1:/usr/share/nginx/html nginx
写入测试页:
[root@server1 plugins]# echo hello world > /nfsdata/vol1/index.html
[root@server1 plugins]# curl localhost
hello world
共享vol1
[root@server2 packages]# curl localhost
hello world
假如server1 docker宕掉 server2 数据不受影响 可以无损迁移容器
清理存储
在server2中:
convoy delete vol1 #先删除所有占用存储的容器
umount /nfsdata # 卸载磁盘
[root@server2 packages]# convoy delete vol1
DEBU[1284] Calling: DELETE, /volumes/, request: DELETE, /v1/volumes/ pkg=daemon
DEBU[1284] event=delete object=volume pkg=daemon reason=prepare volume=vol1
DEBU[1284] Cleaning up /nfsdata/vol1 for volume vol1 pkg=vfs
DEBU[1284] event=delete object=volume pkg=daemon reason=complete volume=vol1
[root@server2 packages]# umount /nfsdata/
[root@server2 packages]# convoy list
{}
[root@server2 packages]# docker volume ls
DEBU[1321] Handle plugin list volume: POST /VolumeDriver.List pkg=daemon
DEBU[1321] Successfully got volume list for docker. pkg=daemon
DEBU[1321] Response: {} pkg=daemon
DRIVER VOLUME NAME
在server1中:
[root@server1 plugins]# convoy list
{}
[root@server1 plugins]# docker volume ls
DEBU[1578] Handle plugin list volume: POST /VolumeDriver.List pkg=daemon
DEBU[1578] Successfully got volume list for docker. pkg=daemon
DEBU[1578] Response: {} pkg=daemon
DRIVER VOLUME NAME
[root@server1 plugins]# fg
convoy daemon --drivers vfs --driver-opts vfs.path=/nfsdata (wd: ~)
^CCaught signal interrupt: shutting down.
DEBU[1586] Cleaning up environment... pkg=daemon
ERRO[1586] http server erroraccept unix /var/run/convoy/convoy.sock: use of closed network connection pkg=daemon