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
&lt;html&gt;
&lt;head&gt;&lt;title&gt;403 Forbidden&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;center&gt;&lt;h1&gt;403 Forbidden&lt;/h1&gt;&lt;/center&gt;
&lt;hr&gt;&lt;center&gt;nginx/1.23.0&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
[root@tidb1 www]# echo www.westos.org &gt; 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 &gt; 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: &lt;LOOPBACK,UP,LOWER_UP&gt; 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: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; 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 &gt;&gt; index.html
bash: index.html: Read-only file system                 ##做限制之后,不能对挂载在主机的目录进行更改
[root@92e05aec8096 www]#

2.6 -v可以使用多次,运行容器时也可以挂载文件


[root@tidb1 ~]# touch /file
[root@tidb1 ~]# echo westos.org &gt; /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
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
&lt;style&gt;
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;
&lt;p&gt;If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.&lt;/p&gt;

&lt;p&gt;For online documentation and support please refer to
&lt;a href="http://nginx.org/"&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;
Commercial support is available at
&lt;a href="http://nginx.com/"&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;/em&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;

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 &lt;url&gt;      还原备份

云野 » Docker-docker数据卷

发表回复