docker volume

1.什么是匿名挂载和具名挂载?

所谓匿名挂载(匿名卷),即在进行数据卷挂载的时候不指定宿主机的数据卷目录,-v命令之后直接跟上容器内数据卷所在的路径

而具名挂载(命名卷)即在进行数据卷挂载的时候既指定宿主机数据卷所在路径,又指定容器数据卷所在路径

先通过下面这种命令的方式感受一下两者的区别:

#匿名挂载(匿名卷)
docker run -d -p 6379:6379 --name mycentos -v /src/volume01

#具名挂载(命名卷) -v 宿主机数据卷所在路径:容器数据卷所在路径
docker run -d -p 6379:6379 --name mycentos -v /home/docker_volume:/src/volume01
12345

除此种方式之外,我们也可以在在dockerfile构建docker镜像的时候使用VOLUME保留字来对数据卷进行挂载,此种挂载方式是匿名挂载的,我们可以指定一个或多个数据卷,这样只要启动了该自定义容器镜像,则会自动进行数据挂载,不会出现忘记挂载导致数据不安全的情况。

VOLUME ["容器内数据卷路径1","容器内数据卷路径2"……]
1

由于匿名挂载的时候只是指定了容器内数据卷的路径,至于该容器内数据卷的路径到底和宿主机中的哪个文件进行数据挂载,可以使用下面命令进行查看:

#查看当前正在运行的镜像容器id
[root@privateCloud / ]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
38d2810685e1        fc67f9b77899        "/bin/sh -c /bin/bash"   2 hours ago         Up 2 hours          80/tcp              focused_williams

#使用 inspect 查看镜像信息
[root@privateCloud / ]# docker inspect 38d2810685e1(这是容器id)
#在弹出来的信息中找到下面的数据:
"Mounts": [
            {
                "Type": "volume",
                "Name": "040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8",
                "Source": "/var/lib/docker/volumes/040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c",
                "Source": "/var/lib/docker/volumes/b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
       
1234567891011121314151617181920212223242526272829303132

从上面的 Mounts 中可以看到 Destination 和 Source 分别就是 容器内的数据卷 和 宿主机内的容器卷

2.匿名卷和命名卷的区别?

命名卷在用过一次之后以后挂载容器的时候还是可以继续使用,所以一般在需要保存数据的时候使用命名卷的方式,下面例子用以展示命名卷对于数据的保存方式:

例:

#1.查看目前的镜像
[root@privateCloud / ]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        4 months ago        237MB

#2.启动centos镜像并且使用命名挂载的方式进行数据卷挂载(此centos是官网下载的官方镜像包)
[root@privateCloud / ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac
48dece440eb377a466d72327895c5ed24a75823e70ffebf40fee0e2fe9e4c66e

#3.查看刚刚启动的容器id
[root@privateCloud / ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
48dece440eb3        470671670cac        "/bin/bash"         4 minutes ago       Up 4 minutes                            mycentos

#4.进入容器内部
[root@privateCloud / ]# docker exec -it 48dece440eb3 /bin/bash

#5.查看/usr/local/,发现多了一个 volume01文件夹
[root@48dece440eb3 /]# cd /usr/local/
[root@48dece440eb3 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src  volume01

#6.创建一个txt文件
[root@48dece440eb3 local]# cd volume01/
[root@48dece440eb3 volume01]# touch file01.txt
[root@48dece440eb3 volume01]# vi file01
#随便输入一段话
this file create in container

[root@48dece440eb3 volume01]# ls
file01.txt

#7.使用 ctrl+p+Q 不停止容器退出
#8.进行宿主机 容器卷 所在路径
[root@privateCloud /home/centos_volume ]# cd /home/centos_volume/

#9.发现多了一个 file01文件,说明数据挂载成功
[root@privateCloud /home/centos_volume ]# ll
total 0
-rw-r--r-- 1 root root 0 Jun  1 17:17 file01.txt

#10.此时将启动的容器停掉:
[root@privateCloud /home/centos_volume ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
48dece440eb3        470671670cac        "/bin/bash"         8 minutes ago       Up 8 minutes                            mycentos
[root@privateCloud /home/centos_volume ]# docker stop 48dece440eb3
48dece440eb3

#11.然后重新进入该容器
[root@privateCloud /usr/local ]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        4 months ago        237MB
[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac

#12.直接到 /usr/local/volume01路径
[root@privateCloud /usr/local ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a842a7e8d514        470671670cac        "/bin/bash"         2 minutes ago       Up 2 minutes                            mycentos
[root@privateCloud /usr/local ]# docker exec -it a842a7e8d514 /bin/bash
[root@a842a7e8d514 /]# cd /usr/local/volume01/
[root@a842a7e8d514 volume01]# ls
file01.txt
#13.查看该file01.txt文件
[root@a842a7e8d514 volume01]# cat file01.txt 
this file create in container



1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

匿名卷则是随着容器的建立而建立,随着容器的关闭而消亡。匿名卷一般用来存储无关痛痒的数据。

#1.查看镜像
[root@privateCloud /usr/local ]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        4 months ago        237MB

#2.使用匿名挂载的方式只指定容器内数据卷所在路径启动镜像
[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /usr/local/centos 470671670cac
175034d3759bb678877fcaaba6db2b9cd50aa9e61a7cb5770a48370032f07d1f

#3.进入 容器内数据卷所在路径
[root@privateCloud /usr/local ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
175034d3759b        470671670cac        "/bin/bash"         About a minute ago   Up About a minute                       mycentos
[root@privateCloud /usr/local ]# docker exec -it 175034d3759b /bin/bash
[root@175034d3759b /]# cd /usr/local/centos/

#4.编辑一个文件
[root@175034d3759b centos]# vi file02
[root@175034d3759b centos]# cat file02 
this file create in container222222222

#5.使用ctrl+p+Q命令不停止并退出容器
#6.查看当前容器数据卷挂载在宿主机的文件路径
[root@privateCloud /home ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
175034d3759b        470671670cac        "/bin/bash"         7 minutes ago       Up 7 minutes                            mycentos
[root@privateCloud /home ]# docker inspect 175034d3759b

#7.从显示的信息中找到Mounts
 "Mounts": [
            {
                "Type": "volume",
                "Name": "226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e",
                "Source": "/var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data",
                "Destination": "/usr/local/centos",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

#8.进入宿主机挂载的路径目录中
[root@privateCloud /home ]# cd /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data
[root@privateCloud /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data ]# ll
total 4
-rw-r--r-- 1 root root 39 Jun  1 17:45 file02

#9.发现该目录下也生成了file02文件
[root@privateCloud /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data ]# cat file02 
this file create in container222222222

#10.关闭当前容器并重新使用匿名方式启动
[root@privateCloud / ]# docker run -it -d -v /usr/local/centos 470671670cac 
19a23edc6aebd23109437cac91e0011737d3e0cb29d0fad99ea884193409ec9e

#11.进入容器
[root@privateCloud / ]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
19a23edc6aeb        470671670cac        "/bin/bash"         32 seconds ago      Up 32 seconds                           laughing_wiles
[root@privateCloud / ]# docker exec -it 19a23edc6aeb /bin/bash
[root@19a23edc6aeb /]# cd /usr/local/centos/

#12.发现重新启动之后,该数据卷之下的数据没有了,但是命名卷在重启之后数据就还在
[root@19a23edc6aeb centos]# ls
[root@19a23edc6aeb centos]# 

ps

本文摘抄自[这里][https://blog.csdn.net/qq_43655835/article/details/106478731]

posted @ 2020-09-11 10:36  镇魂帆-张  阅读(332)  评论(0编辑  收藏  举报