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>      还原备份

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溪野~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值