Docker数据卷管理、卷插件
一、Docker数据卷管理
1.为什么要用数据卷
-
docker分层文件系统
- 性能差
- 生命周期与容器相同
-
docker数据卷
- mount到主机中,绕开分层文件系统
- 和主机磁盘性能相同,容器删除后依然保留
- 仅限本地磁盘,不能随容器迁移
-
docker提供了两种卷:
- bind mount
- docker managed volume
-
docker提供了两种卷: bind mount , docker managed volume
-
bind mount
-
是将主机上的目录或文件mount到容器里。
-
使用直观高效,易于理解。
-
使用 -v 选项指定路径
2.bind mount
[root@server1 ~]# mkdir /jwl
[root@server1 ~]# docker run -d --name demo -v /jwl:/usr/share/nginx/html nginx
e49819a700e5976278ec5eba49442eb50b17554c341b8729a96c7d5039a1ceea
[root@server1 ~]# echo www.westos.org > /jwl/index.html
[root@server1 ~]# curl 172.17.0.2
www.westos.org
[root@server1 ~]#
[root@server1 ~]# docker exec -it demo bash #进入demo容器交互界面
root@e49819a700e5:/# ls
bin docker-entrypoint.d home media proc sbin tmp
boot docker-entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
root@e49819a700e5:/# cd /usr/share/nginx/html/
root@e49819a700e5:/usr/share/nginx/html# ls
index.html
root@e49819a700e5:/usr/share/nginx/html# pwd
/usr/share/nginx/html
root@e49819a700e5:/usr/share/nginx/html# exit
[root@server1 ~]#
[root@server1 ~]# docker volume ls #查看逻辑卷
[root@server1 ~]# docker volume prune #清除多余的逻辑卷
[root@server1 ~]# docker volume create webdata #创建逻辑卷
webdata
[root@server1 ~]# docker rm -f demo
demo
[root@server1 ~]# docker run -d --name demo -v webdata:/usr/share/nginx/html nginx #将新建的逻辑卷挂载
11b0ae33a9579d574e775624eb4ee49c68e5881947a20321e7d9441ca5a9e387
[root@server1 ~]# cd /var/lib/docker/
[root@server1 docker]# ls
builder containers network plugins swarm trust
buildkit image overlay2 runtimes tmp volumes
[root@server1 docker]# cd volumes/
[root@server1 volumes]# ls
[root@server1 volumes]# cd webdata/
[root@server1 webdata]# ls
_data
[root@server1 webdata]# cd _data/
[root@server1 _data]# ls
50x.html index.html
[root@server1 _data]# cat index.html
3.挂载文件
[root@server1 ~]# docker run -it --rm -v /etc/yum.repos.d/westos.repo:/etc/yum.repos.d/westos.repo:ro rhel7 bash ## ro挂载文
件只读
bash-4.2# yum repolist
bash-4.2# cd /etc/yum.repos.d/
bash-4.2# ls
rhel7.repo westos.repo
bash-4.2# cat westos.repo
[wan]
name="wan"
baseurl=http://172.25.15.250/rhel7
gpgcheck=0
[docker]
name=docker
baseurl=ftp://172.25.15.250/pub/docs/docker/docker-ce
gpgcheck=0
bash-4.2# echo westos > westos.repo
bash: westos.repo: Read-only file system
bash-4.2#
[root@server1 ~]# docker rm -f demo
demo
[root@server1 ~]# docker run -d --name demo -v /usr/share/nginx/html nginx
a0cf32ca66c1510581ca4ca2dbb74617ebe229fb8ebbae444b9512cd371a7aac
[root@server1 ~]# docker inspect demo
[root@server1 ~]# cd /var/lib/docker/volumes/
[root@server1 volumes]# ls
[root@server1 volumes]# cd webdata/
[root@server1 webdata]# ls
_data
[root@server1 webdata]# cd _data/
[root@server1 _data]# ls
50x.html index.html
[root@server1 _data]# cd /var/lib/docker/volumes/4039fdaa052d8ba29acc13d5ffe92bd9c871d285c5c545b6fe4d533f7cc86ce7/_data
[root@server1 _data]# ls
50x.html index.html
[root@server1 _data]#
4.两个路径下的文件一样
二、卷插件
convoy卷插件实现
支持三种运行方式:devicemapper、NFS、EBS。
以下实验使用nfs方式。
convoy卷插件安装
1.跨节点数据同步
[root@server1 ~]# yum install -y nfs-utils.x86_64
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# vim /etc/exports
[root@server1 ~]# cat /etc/exports
/mnt/nfs *(rw,no_root_squash)
[root@server1 ~]# chmod 777 /mnt/nfs/
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# yum install -y nfs-utils.x86_64
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# mount 172.25.15.1:/mnt/nfs/ /mnt/nfs/ #挂载到server1/mnt/nfs/目录下
[root@server2 ~]# df
2.目录共享
3.创建卷 使用卷
##下载convoy
[root@server1 ~]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/docker/
lftp 172.25.15.250:/pub/docker> get convoy.tar.gz
11693031 bytes transferred
lftp 172.25.15.250:/pub/docker> exit
[root@server1 ~]# ls
auth docker harbor-offline-installer-v1.10.1.tgz rhel7.tar
busybox.tar game2048.tar mario.tar
convoy.tar.gz harbor nginx.tar
[root@server1 ~]# scp convoy.tar.gz 172.25.15.2:
root@172.25.15.2's password:
convoy.tar.gz 100% 11MB 86.9MB/s 00:00
[root@server1 ~]#
server1
[root@server1 ~]# tar zxf convoy.tar.gz 解压插件
[root@server1 ~]# cd convoy/
[root@server1 convoy]# mv convoy* /usr/local/bin/ 将convoy的二进制文件移动到系统的环境变量里
[root@server1 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs & 驱动
[root@server1 convoy]# mkdir -p /etc/docker/plugins/
[root@server1 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server1 convoy]# convoy create vol1 创建一个逻辑卷
[root@server1 convoy]# convoy list 查看信息
server2
[root@server2 ~]# tar zxf convoy.tar.gz
[root@server2 ~]# cd convoy/
[root@server2 convoy]# mv convoy* /usr/local/bin/
[root@server2 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[root@server2 convoy]# mkdir -p /etc/docker/plugins/
[root@server2 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server2 convoy]# convoy create vol1
[root@server2 convoy]# convoy list
server1上拉起容器同步数据到server2
[root@server1 convoy]# docker run -d --name demo -v vol1:/usr/share/nginx/html nginx
[root@server1 convoy]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf1fcff91138 nginx "/docker-entrypoint.…" 6 seconds ago Up 6 seconds 80/tcp demo
[root@server1 convoy]# cd /mnt/nfs/vol1/
[root@server1 vol1]# echo www.westos.org > index.html
[root@server1 vol1]# curl 172.17.0.2
www.westos.org
[root@server2 vol1]# cd /mnt/nfs/vol1/
[root@server2 vol1]# ls
50x.html index.html
[root@server2 vol1]# cat index.html
www.westos.org
删除piugins
[root@server2 volumes]# ps ax
[root@server2 vol1]# cd /etc/docker/plugins/
[root@server2 plugins]# ls
convoy.spec
[root@server2 plugins]# rm -fr *
[root@server2 plugins]# cd /var/lib/docker/
[root@server2 docker]# cd volumes/
[root@server2 volumes]# ls
metadata.db
[root@server2 volumes]# rm -rf metadata.db
[root@server2 volumes]# systemctl restart docker.service