Docker-docker数据卷
1. Docker数据卷管理
1.1 为什么要用数据卷
• docker 分层文件系统
• 性能差
• 生命周期与容器相同
• docker 数据卷
• mount 到主机中,绕开分层文件系统
• 和主机磁盘性能相同,容器删除后依然保留
• 仅限本地磁盘,不能随容器迁移
1.2 docker提 供 了 两 种 卷 : ( https://docs.docker.com/storage/)
• bind mount
• docker managed volume
1.3 选择 -v 或 –mount 标志:
• 通常 -v or –volume 标志用于独立容器,而 –mount 标志用于集群服务,从 Docker 17.06 开始也
可以使用 –mount 于独立容器。
1.4 -v 或 –volume :由三个字段组成,以冒号( : )分隔。
• 第一个字段是主机上文件或目录的路径。
• 第二个字段是文件或目录在容器中的安装路径。
• 第三个字段是可选的,并且是用逗号分隔的选项。
1.5 –mount :包含多个键值对,以逗号分隔,每个键值对都由一个 <key>=<value> 元组组成。
• type :其可以是 bind , volume 。
• source :指 Docker 主机上文件或目录的路径。可以指定为 source 或 src 。
• destination :指定的文件或目录是在容器的路径。可以指定为 destination , dst 或 target 。
• readonly :(如果存在)以只读方式安装到容器中。
• –mount 标志不支持 z 或 Z 修改 SELinux 的标签选项。
2. bind mount的使用
• 是将主机上的目录或文件mount到容器里。
• 使用直观高效,易于理解。
• bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
• -v 选项指定的路径,如果不存在,挂载时会自动创建。
2.1 运行容器。指定不存在的目录/www/挂载到nginx镜像的/usr/share/nginx/html默认发布目录里
[root@tidb1 ~]# docker run -d --name web -v /www:/usr/share/nginx/html nginx
de40d5c3abb79a5165d9efa6b605f892ab99136fc8b2e312a08cd02939a7dfb4
2.2 访问nginx发生403报错,这是因为默认发布目录已经挂载到了自动创建的/www/目录里
[root@tidb1 ~]# cd /www/ ##自动创建/www/目录
[root@tidb1 www]# ls ##里面什么也没有
[root@tidb1 www]# curl 172.17.0.2 ##因为运行容器时指定了默认发布目录挂载到了/www/下,所以报错403
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.23.0</center>
</body>
</html>
[root@tidb1 www]# echo www.westos.org > index.html
[root@tidb1 www]# curl 172.17.0.2
www.westos.org
[root@tidb1 www]# docker inspect web ##查看挂载
.........
"Mounts": [
{
"Type": "bind",
"Source": "/www",
"Destination": "/usr/share/nginx/html", ##/usr/share/nginx/html挂载到了主机的/www/里
"Mode": "",
"RW": true,
"Propagation": "rprivate"
........
2.3 往/www/里编辑一个nginx的默认发布目录,访问nginx
[root@tidb1 www]# echo www.westos.org > index.html
[root@tidb1 www]# curl 172.17.0.2 ##访问到了我们自己编辑的nginx发布目录
www.westos.org
2.4 自动创建的/www/目录容器之间也是可以相互共用的
[root@tidb1 ~]# docker run -it --rm -v /www:/www centos
[root@2efdc3b0aa69 /]# cd www/
[root@2efdc3b0aa69 www]# ls
index.html
[root@2efdc3b0aa69 www]# cat index.html
www.westos.org
www.redhat.com
[root@2efdc3b0aa69 www]# curl 172.17.0.2
www.westos.org
www.redhat.com
[root@2efdc3b0aa69 www]# ip addr ##因为有相同的网络地址段,所以容器之间是可以相互通信的
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@2efdc3b0aa69 www]# exit
2.5 bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
[root@tidb1 ~]# docker run -it --rm -v /www:/www:ro centos
[root@92e05aec8096 /]# cd /www/
[root@92e05aec8096 www]# ls
index.html
[root@92e05aec8096 www]# echo www.linux.org >> index.html
bash: index.html: Read-only file system ##做限制之后,不能对挂载在主机的目录进行更改
[root@92e05aec8096 www]#
2.6 -v可以使用多次,运行容器时也可以挂载文件
[root@tidb1 ~]# touch /file
[root@tidb1 ~]# echo westos.org > /file
[root@tidb1 ~]# docker run -it --rm -v /www:/www:ro -v /file/:/etc/file/:ro centos
[root@c1c6cbc5e3fb /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var www
[root@c1c6cbc5e3fb /]# cd /www/
[root@c1c6cbc5e3fb www]# ls
index.html
[root@c1c6cbc5e3fb www]# cat index.html
www.westos.org
www.redhat.com
[root@c1c6cbc5e3fb www]# cd /etc/
[root@c1c6cbc5e3fb etc]# cat file
westos.org
[root@c1c6cbc5e3fb etc]#
3. docker managed volume的使用方法
• bind mount必须指定host文件系统路径,限制了移植性。
• docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录。
• 默认创建的数据卷目录都在 /var/lib/docker/volumes 中。
• 如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
• 使用Docker CLI命令或Docker API管理卷。
3.1 运行容器,不指定挂载目录时,因为有容器有volume这样的关键字,所以docker会自动创建一个源,保存在/var/lib/docker/volumes
[root@tidb1 ~]# docker run -d --name demo registry
9086db58adbc1e51371572032a903b4f566c8cda1849f6e90d2c8c42e94d91bc
[root@tidb1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9086db58adbc registry "/entrypoint.sh /etc…" 12 seconds ago Up 11 seconds 5000/tcp demo
[root@tidb1 ~]# docker inspect demo
.......
"Mounts": [
{
"Type": "volume",
"Name": "af286385bf603e9bf83b99df57a2f539894484921eacbdab06e443238afd8867",
"Source": "/var/lib/docker/volumes/af286385bf603e9bf83b99df57a2f539894484921eacbdab06e443238afd8867/_data",
"Destination": "/var/lib/registry",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
3.2 进入/var/lib/docker/volumes查看
[root@tidb1 ~]# cd /var/lib/docker/volumes
[root@tidb1 volumes]# ls
backingFsBlockDev
af286385bf603e9bf83b99df57a2f539894484921eacbdab06e443238afd8867 metadata.db
[root@tidb1 volumes]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9086db58adbc registry "/entrypoint.sh /etc…" 3 minutes ago Up 3 minutes 5000/tcp demo
[root@tidb1 volumes]# cd af286385bf603e9bf83b99df57a2f539894484921eacbdab06e443238afd8867
[root@tidb1 af286385bf603e9bf83b99df57a2f539894484921eacbdab06e443238afd8867]# ls
_data
[root@tidb1 af286385bf603e9bf83b99df57a2f539894484921eacbdab06e443238afd8867]# cd _data/
[root@tidb1 _data]# ls
3.3 删除容器后,这个卷依然存在,需要手动回收
[root@tidb1 ~]# docker rm -f demo
demo
[root@tidb1 ~]# docker volume ls
DRIVER VOLUME NAME
local af286385bf603e9bf83b99df57a2f539894484921eacbdab06e443238afd8867
[root@tidb1 ~]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
af286385bf603e9bf83b99df57a2f539894484921eacbdab06e443238afd8867
Total reclaimed space: 0B
[root@tidb1 ~]# docker volume ls
DRIVER VOLUME NAME
3.4 也可以手动创建卷,/var/lib/docker/volumes会自动同步创建
[root@tidb1 ~]# docker volume create webdata ##手动创建卷后,会在/var/lib/docker/volumes中也会自动创建
webdata
[root@tidb1 ~]# docker volume ls
DRIVER VOLUME NAME
local webdata
[root@tidb1 ~]# cd /var/lib/docker/volumes
[root@tidb1 volumes]# ls
backingFsBlockDev metadata.db webdata
[root@tidb1 volumes]# cd webdata/
[root@tidb1 webdata]# ls
_data
[root@tidb1 webdata]# cd _data/
[root@tidb1 _data]# ls
[root@tidb1 _data]#
3.5 运行容器时,我们-v指定挂载创建的卷,他会挂载到指定的路径
[root@tidb1 ~]# docker run -d --name demo -v webdata:/usr/share/nginx/html nginx
910425be38a82d7c7cafa11866a32a73cc70f8788f762cda41afcf89c2df7a30
[root@tidb1 ~]# docker inspect demo
.......
"Mounts": [
{
"Type": "volume",
"Name": "webdata",
"Source": "/var/lib/docker/volumes/webdata/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
......
[root@tidb1 ~]# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
3.6 volumes特性,docker管理卷挂接到容器内指定路径会判断源路径下有没有数据文件,有的话就会自动考出来,没有就是空的
[root@tidb1 ~]# cd /var/lib/docker/volumes
[root@tidb1 volumes]# ls
backingFsBlockDev metadata.db webdata
[root@tidb1 volumes]# cd webdata/
[root@tidb1 webdata]# ls
_data
[root@tidb1 webdata]# cd _data/
[root@tidb1 _data]# ls
50x.html index.html ##自动拷贝出来
[root@tidb1 _data]#
4. bind mount与docker managed volume对比
• 相同点:两者都是 host 文件系统中的某个路径。
• 不同点:
5 . convoy卷插件子命令
• convoy list 列出卷
• convoy delete 删除卷
• convoy snapshot create 创建快照
• convoy snapshot delete 删除快照
• convoy backup create 创建备份
• convoy create res1 --backup <url> 还原备份