Docker数据卷管理及优化
一、基础概念
1.docker数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存在宿主机上。
2.docker数据卷的作用:
数据持久化:即使容器被删除或重建数据卷中的数据仍然存在
数据共享:多个容器可以同时挂载同一个数据卷实现数据的共享和交互
独立于容器生命周期:数据卷的生命周期独立于容器,不受容器的启动、停止和删除的影响。
3.使用数据卷的原因:
docker分层文件系统:
性能差并且生命周期和容器相同
docker提供两种卷:
bind mount
docker managed volume
4.bind mount数据卷:
将主机的目录文件或文件mount到容器里
使用-v选项指定路径,如果-v指定的路径不存在挂载时会自动创建
示例:
[root@docker ~]# docker run -it --rm \
-v /tmp/data1:/data1 \
-v /tmp/data1:/data2:ro \
-v /etc/passwd:/data/passwd:ro busybox
/ # tail -n 3 /data/passwd
lee:x:1000:1000:lee:/home/lee:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
nginx:x:1001:1001::/home/nginx:/sbin/nologin
/ # touch /data1/leefile1
/ # touch /data2/leefile1
touch: /data2/leefile1: Read-only file system
5.docker managed数据卷:
bind mount必须指定host文件系统路径限制了移植性
docker managed volume不需要指定mount源,docker自动为容器创建数据卷目录
默认创建的数据卷目录都在/var/lib/docker/volumes中
如果挂载时指向容器内已有的目录,原有数据会被复制到volume中
示例:
[root@docker volumes]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD='lee'
mysql:5.7
[root@docker volumes]# ls -l /var/lib/docker/volumes
总用量 0
drwx-----x 3 root root 19 8月 20 16:34
ad74662b8d6bb6fdcc6e82925ae9942b94bac5f9da4bd52b0a14ac451ae9ef75
[root@docker volumes]# touch
ad74662b8d6bb6fdcc6e82925ae9942b94bac5f9da4bd52b0a14ac451ae9ef75/_data/leefile
[root@docker volumes]# docker exec -it mysql bash
bash-4.2# cd /var/lib/mysql
bash-4.2# ls
auto.cnf client-cert.pem ib_logfile0 ibtmp1 mysql.sock
public_key.pem sys
ca-key.pem client-key.pem ib_logfile1 leefile performance_schema server-
cert.pem
ca.pem ib_buffer_pool ibdata1 mysql private_key.pem server-
key.pem
bash-4.2# pwd
docker volume prune:清理未使用的docker数据卷
建立数据卷:
docker volume create test,这条命令执行会在默认的数据卷目录下(/var/lib/docker/volumes/)创建test目录,并在该目录下创建_data目录
查看数据卷:
docker volume ls,执行这条命令会查看到上述创建的数据卷
使用建立的数据卷:
docker run -d --name web1 -p 80:80 -v test:/usr/share/nginx/html nginx
6.数据卷容器:
是docker中一种特殊的容器,主要方便的在多个容器之间共享数据卷。
建立数据卷容器:
[root@docker ~]# docker run -d --name datavol \
-v /tmp/data1:/data1:rw \
-v /tmp/data2:/data2:ro \
-v /etc/resolv.conf:/etc/hosts busybox
使用数据卷容器:
docker run -it --name test --rm --volumes-from datavol busybox
7.bind mount数据卷和docker managed数据卷对比:
相同点:两者都是host文件系统中的某个路径
不同点:
8.备份与迁移数据卷:
建立容器并指定使用卷要备份的容器:
docker run --volumes-from datavol -v `pwd`:/backup busybox tar zcf /backup/data1.tar.gz /data1 将当前目录挂载到本地容器中用于和容器交互保存要备份的容器,备份数据到本地
数据恢复:
docker run -it --name test -v leevol1:/data1 -v `pwd`:/backup busybox /bin/sh -
c "tar zxf /backup/data1.tar.gz;/bin/sh"