Docker学习(5) 容器数据卷

容器数据卷

1、容器数据卷概念

容器数据卷是一个可供一个或多个容器使用的特殊目录或文件,它能够实现数据的持久化和共享。数据卷由Docker挂载到容器上,但并不属于容器的联合文件系统,因此可以绕过Union File System的限制。数据卷的设计目的就是为了数据的持久化,它完全独立于容器的生命周期,这意味着即使容器被删除,Docker也不会删除其挂载的数据卷。

数据卷有三种挂载方式,包括Volumes、Bind mounts和tmpfs mounts。其中,Volumes是Docker管理的数据卷,存储在Docker主机文件系统的一部分中,是Docker中持久存储数据的推荐方法。Bind mounts则可以绑定挂载主机系统上的任意位置,包括重要的系统文件或目录,这种方式的灵活性较高,但需要注意安全性问题。而tmpfs mounts则是临时挂载,数据只存储在主机系统的内存中,不会写入主机系统的文件系统。

通过容器数据卷,我们可以实现容器数据的持久化、客户端和容器间的数据交换,以及容器间的数据共享。在配置数据卷时,我们需要指定目录的绝对路径,如果目录不存在,Docker会自动创建。此外,我们还可以使用数据卷容器来让其他容器继承自该容器的数据卷,从而实现数据共享。

总的来说,容器数据卷是Docker容器中一个非常重要的概念,它解决了容器数据的持久化和共享问题,提高了容器的灵活性和可用性。

2、数据卷挂载

1、在命令行挂载数据
  • 在docker create命令或docker run 命令中,用-v为容器增加一个数据卷
[root@wangliukun ~]# docker run -it --name volume -v /web/app centos
[root@f04b8789d743 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  web
[root@f04b8789d743 /]# cd web/
[root@f04b8789d743 web]# ls
app
[root@f04b8789d743 app]# exit
exit
[root@wangliukun ~]# 

以上实例,用docker run 运行容器,用 -v 参数为容器添加数据卷

  • 查看挂载信息
[root@wangliukun ~]# docker inspect volume
。。。。。。。。。。。。。。。
 "Mounts": [
            {
                "Type": "volume",
                "Name": "42cf01aa1d964763031a6a54ac84dd905300775b15e89b0ccf0c6fabd4e79cdc",
                "Source": "/var/lib/docker/volumes/42cf01aa1d964763031a6a54ac84dd905300775b15e89b0ccf0c6fabd4e79cdc/_data",
                "Destination": "/web/app",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
 。。。。。。。。。。。。。。。
[root@wangliukun ~]# 

可以看到,宿主机已经在/var/lib/docker/volumes/下自动生成挂载目录

  • 手动指定宿主机挂载目录
[root@wangliukun ~]# docker run -it -d --name test02 -v /webapp:/app nginx
7341bc822d8262a7be53647b32fe392556c443c462d8e1dd687b901807f14262

命名了一个test01 的centos容器,并挂载数据卷

  • 查看状态
##centos容器正在运行
[root@wangliukun ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                   CREATED              STATUS                      PORTS     NAMES
7341bc822d82   nginx             "/docker-entrypoint.…"   About a minute ago   Up About a minute           80/tcp    test02
[root@wangliukun ~]# docker inspect test02
。。。。。。。。。。。。。。。。。。。。
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/webapp",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
。。。。。。。。。。。。。。。。。。。
[root@wangliukun ~]#
  • 观察数据卷共享机制,会在宿主机与容器之间切换,建议开启两个终端
[root@wangliukun ~]# docker run -it --name test06 -v /web/webapp:/app centos
[root@c77cc5e3e423 /]# 

以上,将容器挂载至/web/webapp

  • 查看宿主机与容器的根目录下文件
[root@c77cc5e3e423 /]# ls
app  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c77cc5e3e423 /]# exit
[root@wangliukun /]# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  web  webapp
[root@wangliukun /]# 
[root@wangliukun /]# cd /web/webapp/
[root@wangliukun webapp]# ls
[root@wangliukun webapp]# 

可看到多出个app,宿主机新建了个web目录,/web/webapp里面没有任何文件

  • 宿主机/web创建文件
[root@wangliukun webapp]# touch a.txt b.txt
[root@wangliukun webapp]# ll
总用量 0
-rw-r--r--. 1 root root 0 410 12:06 a.txt
-rw-r--r--. 1 root root 0 410 12:06 b.txt
##进入容器
[root@wangliukun webapp]# docker attach c77
[root@c77cc5e3e423 /]# ls
app  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c77cc5e3e423 /]# cd app/
#查看/app下是否也创建了a.txt,b.txt
[root@c77cc5e3e423 app]# ls
a.txt  b.txt
[root@c77cc5e3e423 app]# 
#返回容器查看挂载目录下生成a.txt和b.txt
  • 容器中创建文件,查看宿主机
[root@c77cc5e3e423 app]# touch c.txt
[root@c77cc5e3e423 app]# exit
exit
[root@wangliukun webapp]# ll
总用量 0
-rw-r--r--. 1 root root 0 410 12:06 a.txt
-rw-r--r--. 1 root root 0 410 12:06 b.txt
-rw-r--r--. 1 root root 0 410 12:14 c??.txt
[root@wangliukun webapp]# 

可查到,说明容器与宿主机共享文件

  • 设置权限(只读):
##ro(只读)
[root@wangliukun webapp]# docker run -it --name volume1 -v /src/test:/webapp:ro centos /bin/bash
[root@f6c174ee0080 /]# 

-v /src/test:/webapp:ro将数据卷权限设置为ro(只读)

  • 查看挂在情况:
[root@wangliukun webapp]# docker inspect volume1
...
"Mounts": [
            {
                "Type": "bind",
                "Source": "/src/test",
                "Destination": "/webapp",
                "Mode": "ro",
                "RW": false,
                "Propagation": "rprivate"
            }
        ],
...
2、通过DOckerfile 挂载数据卷

​ 用户创建镜像时,通常会在Dockerfile文件中加上 VOLUME[/date]来创建含有数据卷的镜像,并使用该镜像创建包含数据卷的容器。

​ Dockerfile可以创建多个数据卷,与使用docker run命令创建数据卷不同,Dockerfile中的数据卷不能映射到已经存在的本地目录。在启动容器时,才会创建Dockerfile中指定的数据卷,并且以Dockerfile中指定的名称命名。运行同样镜像的容器创建的数据卷是不一样的(可以看到不同容器的数据卷地址也是不一样的)。当容器中的数据卷地址不一样时,容器之间就无法共享数据了。

​ 下面使用Dockerfile中的VOLUME选项来指定挂载数据卷,首先创建Dockerfile并添加内容。

[root@wangliukun ~]# vi Dockerfile
[root@wangliukun ~]# cat Dockerfile
FROM centos
VOLUME /root/data
VOLUME /work
VOLUME test
[root@wangliukun ~]# 

​ 以上示例创建了一个Dockerfile文件并添加了内容,即挂载三个数据卷。

  • 创建新镜像:
[root@wangliukun ~]# docker build -t volume3 .
[+] Building 0.7s (5/5) FINISHED                                                                                                          docker:default
 => [internal] load build definition from Dockerfile                                                                                                0.1s
 => => transferring dockerfile: 152B                                                                                                                0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                   0.0s
 => => transferring context: 2B                                                                                                                     0.0s
 => CACHED [1/1] FROM docker.io/library/centos:latest                                                                                               0.0s
 => exporting to image                                                                                                                              0.0s
 => => exporting layers                                                                                                                             0.0s
 => => writing image sha256:e8d2708d2fd5280ba379f892b8b214279a2533b02f5144f5f6ac344bcc902e64                                                        0.0s
 => => naming to docker.io/library/volume3                                                                                                          0.0s
[root@wangliukun ~]# 

​ 以上示例中,镜像已经构建完成,并且执行了挂载三个数据卷的命令。

  • 下面使用构建完成的镜像运行容器,并查看其挂载信息,示例代码如下:
[root@wangliukun ~]# docker run -it volume3
[root@5f1113077dcb /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var  work
[root@5f1113077dcb /]# 
  • 查看运行情况:
[root@wangliukun ~]# docker inspect 5f
...
 "Mounts": [
            {
                "Type": "volume",
                "Name": "a144dd3f4d6ace771a0c102fa7c7e977420f38b505f7924edffb711ecb3ab4d3",
                "Source": "/var/lib/docker/volumes/a144dd3f4d6ace771a0c102fa7c7e977420f38b505f7924edffb711ecb3ab4d3/_data",
                "Destination": "test",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "69383c3709d5752f4e61062a38d115d297f43c51c43d38d1ebe58bf6b2fdc1fe",
                "Source": "/var/lib/docker/volumes/69383c3709d5752f4e61062a38d115d297f43c51c43d38d1ebe58bf6b2fdc1fe/_data",
                "Destination": "/root/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "491d3ba6c2ab471b4699566b257a1c8bccd58870aa21b57613ef5fae80ddc31d",
                "Source": "/var/lib/docker/volumes/491d3ba6c2ab471b4699566b257a1c8bccd58870aa21b57613ef5fae80ddc31d/_data",
                "Destination": "/work",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
...

​ 从以上示例中可以看出,该容器挂载了三个数据卷,容器内的目录为Dockerfile中指定的目录,宿主机中数据卷的位置在/var/lib/docker/volumes/下,并且数据卷的地址是随机生成的。

​ 如此一来,就实现了通过Dockerfile创建镜像,运行容器时会自动挂载数据卷。

3、数据卷容器

​ 运行容器时宿主机会随机生成挂载目录,无法保持目录地址一致,所以无法实现容器间的数据共享。数据卷容器可以有效地解决这个问题:将已命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器叫作数据卷容器。数据卷容器挂载一个宿主机目录,其他容器连接数据卷容器来实现数据的共享。

  • 下面启动一个名为 volume-container的容器,此容器包含两个数据卷/volumel和/volume2(这两个数据卷目录在容器中,运行容器时会自动创建),示例代码如下:
[root@wangliukun ~]# docker run -it --name volume-container -v /volume1 -v /volume2 centos 
[root@89d7d9bde4a3 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@89d7d9bde4a3 /]# 

以上示例中,容器volume-container已经创建完成,数据卷也挂载完成。

  • 下面使用Ctrl+P+Q组合键退出当前容器终端,查看挂载信息并在宿主机中为数据卷添加文件,示例代码如下:
[root@wangliukun ~]# docker inspect volume-container | grep volume
        "Name": "/volume-container",
                "Type": "volume",
                "Source": "/var/lib/docker/volumes/da28a04098c4588bebe99e078107624a4cfb47198b34accedb76580967b29476/_data",
                "Destination": "/volume2",
                "Type": "volume",
                "Source": "/var/lib/docker/volumes/f84b1314dde6b4361a7ed626c89e88aa617c579bf913ff4740a65f97bf7acd7c/_data",
                "Destination": "/volume1",
                "/volume1": {},
                "/volume2": {}
[root@wangliukun ~]# 
##查看挂在信息
[root@wangliukun ~]# cd /var/lib/docker/volumes/f84b1314dde6b4361a7ed626c89e88aa617c579bf913ff4740a65f97bf7acd7c/_data
[root@wangliukun _data]# ls
[root@wangliukun _data]# echo hello container1 >a.txt
[root@wangliukun _data]# cd /var/lib/docker/volumes/da28a04098c4588bebe99e078107624a4cfb47198b34accedb76580967b29476/_data
[root@wangliukun _data]# ls
[root@wangliukun _data]# echo hello container2 >b.txt
[root@wangliukun _data]# 

以上示例在宿主机中分别为两个数据卷添加文件及文件内容

  • 下面创建容器 testl-container,用--volumes-from,参数挂载容器 volume-container中的数据卷,示例代码如下:
[root@wangliukun _data]# docker run -it --name test1-container --volumes-from volume-container centos
[root@7e59a8eb768f /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@7e59a8eb768f /]# cat /volume1/a.txt 
hello container1
[root@7e59a8eb768f /]# cat /volume2/b.txt 
hello container2
[root@7e59a8eb768f /]# 
  • 从以上示例中可以看出,两个容器实现了数据共享。下面将初始数据卷容器删除,观察数据卷还能否正常工作,示例代码如下:
[root@wangliukun _data]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                   CREATED              STATUS                       PORTS     NAMES
7e59a8eb768f   centos            "/bin/bash"               About a minute ago   Exited (127) 5 seconds ago             test1-container
89d7d9bde4a3   centos            "/bin/bash"               10 minutes ago       Up 9 minutes                           volume-container
5f1113077dcb   volume3           "/bin/bash"               17 minutes ago       Exited (0) 15 minutes ago              epic_cohen
...
[root@wangliukun _data]# docker stop volume-container
volume-container
[root@wangliukun _data]# docker rm volume-container 
volume-container
[root@wangliukun _data]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                   CREATED          STATUS                            PORTS     NAMES
7e59a8eb768f   centos            "/bin/bash"               2 minutes ago    Exited (127) About a minute ago             test1-container
5f1113077dcb   volume3           "/bin/bash"               18 minutes ago   Exited (0) 16 minutes ago                   epic_cohen
...
[root@wangliukun _data]# 
[root@wangliukun _data]# docker run -it --name test2-container --volumes-from test1-container centos
[root@063c97b4cfb5 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@063c97b4cfb5 /]# cat volume1/a.txt 
hello container1
[root@063c97b4cfb5 /]# cat volume2/b.txt 
hello container2
[root@063c97b4cfb5 /]# 

从以上示例中可以看到,即使删除了初始的数据卷容器volume-container或其他容器,只要有容器在使用该数据卷,里面的数据就不会丢失。

  • 下面删除所有容器,再观察数据卷,示例代码如下:
##删除所有容器
[root@wangliukun _data]# docker rm `docker ps -a | grep Exited|awk '{print $1}'`
063c97b4cfb5
7e59a8eb768f
5f1113077dcb
f6c174ee0080
c77cc5e3e423
4faf60ef1598
d795f7db4abe
afaf2f3f0e47
854d9417caf3
7341bc822d82
13ad55c584f6
f04b8789d743
793f1efe4205
b68b20c1f3ae
438fd7682290
0155dfd35d06
8f822fa5baa2
4077af031274
c0a2c91499b5
76f3ed86ae8a
[root@wangliukun _data]# docker ps -a
CONTAINER ID   IMAGE     COMMAND    CREATED      STATUS    PORTS     NAMES
a9c544db8766   centos    "centos"   7 days ago   Created             upbeat_davinci
[root@wangliukun _data]# docker rm a9c544db8766 
a9c544db8766
[root@wangliukun _data]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
##查看数据
[root@wangliukun _data]#
[root@wangliukun _data]# cd /var/lib/docker/volumes/da28a04098c4588bebe99e078107624a4cfb47198b34accedb76580967b29476/_data
[root@wangliukun _data]# ls
b.txt
[root@wangliukun _data]# cat b.txt 
hello container2
[root@wangliukun _data]# 
##宿主机数据还在

4、备份数据卷

​ 企业中,业务数据不容有失。人们通常会对数据进行一次备份或多次备份,以保证数据的安全性。

  • ​ 下面创建一个名为data- volume的 CentOS容器,准备对其挂载的两个数据卷/var/volume1和/var/volume2进行备份操作。示例代码如下:
[root@wangliukun _data]# docker run -it --name data-volume -v /var/volume1 -v /var/volume2 centos
[root@f81fcd84a688 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@f81fcd84a688 /]# cd /var/
[root@f81fcd84a688 var]# ls
adm  cache  crash  db  empty  ftp  games  gopher  kerberos  lib  local  lock  log  mail  nis  opt  preserve  run  spool  tmp  volume1  volume2  yp
[root@f81fcd84a688 var]# 

以上示例中,容器已经创建完成,数据卷也成功挂载。

  • 下面在容器挂载目录中创建文件并添加内容,示例代码如下:
[root@f81fcd84a688 var]# echo hello container1 >/var/volume1/a.txt
[root@f81fcd84a688 var]# echo hello container2 >/var/volume2/b.txt
[root@f81fcd84a688 var]# cat volume1/a.txt 
hello container1
[root@f81fcd84a688 var]# cat volume2/b.txt 
hello container2
[root@f81fcd84a688 var]# 

以上成功创建文件并添加内容

简而言之,备份数据卷就是使用 -volumes-from参数来创建一个挂载数据卷的容器,从宿主机挂载要存放备份数据的目录到容器的备份目录,并备份数据卷中的数据。完成后使用-rm参数删除容器。此对备份数据已经保存在当前的目录下。示例代码如下:

[root@wangliukun ~]# docker run --rm --volumes-from data-volume -v /root/back:/backup centos tar cvf /backup/backup1.tar /var/volume1
#--rm 该容器运行完自动删除
#挂载宿主机/root/back到容器/backup
##创建,运行
/var/volume1/
/var/volume1/a.txt
tar: Removing leading `/' from member names
#执行tar 备份数据,停止删除容器
[root@wangliukun ~]# 
##查看备份
[root@wangliukun ~]# cd /root/back/
[root@wangliukun back]# ll
总用量 12
-rw-r--r--. 1 root root 10240 410 15:13 backup1.tar
[root@wangliukun back]# 
##将volume2备份
[root@wangliukun back]# docker run --rm --volumes-from data-volume -v /root/back:/backup centos tar cvf /backup/backup2.tar /var/volume2
/var/volume2/
/var/volume2/b.txt
tar: Removing leading `/' from member names
[root@wangliukun back]# ls /root/back/
backup1.tar  backup2.tar
[root@wangliukun back]# 

5、数据卷恢复与迁移

1、恢复:
  • 上一节中在宿主机有备份数据backup1.tar,下面模拟数据丢失后恢复
[root@wangliukun ~]# cd /root/back/
[root@wangliukun back]# ll
总用量 24
-rw-r--r--. 1 root root 10240 410 15:13 backup1.tar
-rw-r--r--. 1 root root 10240 410 15:28 backup2.tar
[root@wangliukun back]# 
##已经做好的数据备份
[root@wangliukun back]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
f81fcd84a688   centos    "/bin/bash"   39 minutes ago   Exited (0) 22 minutes ago             data-volume
##进入数据卷容器
[root@wangliukun back]# docker attach data-volume
You cannot attach to a stopped container, start it first
[root@wangliukun back]# docker start f8
f8
[root@wangliukun back]# docker attach f8
[root@f81fcd84a688 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@f81fcd84a688 /]# cd var/
[root@f81fcd84a688 var]# ls
adm  cache  crash  db  empty  ftp  games  gopher  kerberos  lib  local  lock  log  mail  nis  opt  preserve  run  spool  tmp  volume1  volume2  yp
[root@f81fcd84a688 var]# ls volume1/a.txt 
volume1/a.txt
[root@f81fcd84a688 var]# ls volume1       
a.txt
[root@f81fcd84a688 var]# ls volume2
b.txt
[root@f81fcd84a688 var]# rm -rf /var/volume1/a.txt 
[root@f81fcd84a688 var]# rm -rf /var/volume2/b.txt 
[root@f81fcd84a688 var]# 

以上删除了数据卷容器中的/var/volume1/a.txt 和/var/volume2/b.txt 。

  • 恢复代码:
[root@wangliukun ~]# docker run --rm --volumes-from data-volume -v /root/back/:/back centos tar xvf ./back/backup2.tar -C /var/volume1/
var/volume2/
var/volume2/b.txt
[root@wangliukun ~]# docker run --rm --volumes-from data-volume -v /root/back/:/back centos tar xvf ./back/backup1.tar -C /var/volume1/
var/volume1/
var/volume1/a.txt
##查看
[root@wangliukun ~]# docker start f8
f8
[root@wangliukun ~]# docker attach f8
[root@f81fcd84a688 /]# ls /var/volume1
var
[root@f81fcd84a688 /]# ls /var/volume1/var/volume
volume1/ volume2/ 
[root@f81fcd84a688 /]# ls /var/volume1/var/volume
volume1/ volume2/ 
[root@f81fcd84a688 /]# ls /var/volume1/var/volume1/
a.txt
[root@f81fcd84a688 /]# ls /var/volume1/var/volume2/
b.txt
[root@f81fcd84a688 /]# 
2、迁移:

迁移数据卷是将备份数据恢复到新容器中

  • 新建容器并解压备份文件到新建容器:
[root@wangliukun ~]# docker run -it -v /var/volume1 -v /var/volume2 --name new-container centos /bin/bash
##新建容器,挂在要恢复的目录
[root@d72ab63f7926 /]# ls /var/volume1
[root@d72ab63f7926 /]# ls /var/volume2
[root@d72ab63f7926 /]# 

以上新建了new-container,挂载在了/var/volume1和/var/volume2,但无数据

  • 将备份迁移到新容器:
[root@wangliukun ~]# docker run -it --rm --volumes-from new-container -v /root/back/:/back centos tar xvf ./back/backup1.tar -C /var/volume1/
var/volume1/
var/volume1/a.txt
[root@wangliukun ~]# docker run -it --rm --volumes-from new-container -v /root/back/:/back centos tar xvf ./back/backup2.tar -C /var/volume2/
var/volume2/
var/volume2/b.txt
[root@wangliukun ~]# 
[root@wangliukun ~]# docker attach d7
You cannot attach to a stopped container, start it first
[root@wangliukun ~]# docker start d7
d7
[root@wangliukun ~]# docker attach d7
[root@d72ab63f7926 /]# ls /var/volume1
var
[root@d72ab63f7926 /]# ls /var/volume2
var
[root@d72ab63f7926 /]# ls /var/volume1/var/volume1/a.txt 
/var/volume1/var/volume1/a.txt
[root@d72ab63f7926 /]# ls /var/volume2/var/volume2/b.txt 
/var/volume2/var/volume2/b.txt
[root@d72ab63f7926 /]# 

从上例看出迁移数据成功。

6、管理数据卷

1、与容器关联

​ 数据卷最大的优势是可以用来做持久化数据。它的生命周期是独立的,Docker

不会在容器被删除后自动删除数据卷,也不存在类似垃圾回收的机制来处理没有

被任何容器使用的数据卷。但难免会有无用的数据卷,用户可以通过在删除容器

的命令中添加参数,在删除容器的同时删除数据卷。

Docker数据卷可以通过命令与容器关联,删除容器时,数据卷也随之被删除。

  • docker rm-v

删除容器时添加-v参数会将数据卷一并删除。

  • docker run --rm

创建、运行容器时添加–rm参数,容器运行结束时容器与数据卷会被一并删除。

如果不对数据卷进行及时清理,/var/lib/docker/volumes/目录下就会产生许多残留目录。

删除的数据卷是无法找回的,建议再三确认之后再执行操作。

2、命令管理

Docker中有专门的容器数据卷命令供用户管理容器数据卷。下面通过示例介绍容器数据卷命的一些参数。

docker volume create :创建数据卷
docker volume ls :列出数据卷
docker inspect <容器id或名字>:列出数据卷
docker volume rm <数据卷name>:删除一个或多个数据卷
docker volume prune:删除所有未被使用的数据卷
  • create 创建
[root@wangliukun ~]# docker volume create test
test
[root@wangliukun ~]# 
  • ls 列出
[root@wangliukun ~]# docker volume ls
DRIVER    VOLUME NAME
local     42cf01aa1d964763031a6a54ac84dd905300775b15e89b0ccf0c6fabd4e79cdc
local     42d71c5c011633f3c2c62e962bc2200d1b67ccc4ecb322a95d31fed1aa10f6cb
local     491d3ba6c2ab471b4699566b257a1c8bccd58870aa21b57613ef5fae80ddc31d
local     69383c3709d5752f4e61062a38d115d297f43c51c43d38d1ebe58bf6b2fdc1fe
local     a144dd3f4d6ace771a0c102fa7c7e977420f38b505f7924edffb711ecb3ab4d3
local     cc7c05a0f95d654f40791c1d0dfb4c0fd835c670f04926b4b2f0efc119ad6e0d
local     da28a04098c4588bebe99e078107624a4cfb47198b34accedb76580967b29476
local     f1e811634e97b9af4b9752659261880a789cfb12cb74e4f361820cd0b262bd44
local     f5a550270ded85e26e880a9f008cccfa9b10bc0fe2f8237225babf8c9b8f5b6b
local     f84b1314dde6b4361a7ed626c89e88aa617c579bf913ff4740a65f97bf7acd7c
local     test
[root@wangliukun ~]# 
  • inspect 列出(显示一个或多个数据卷详细信息)
[root@wangliukun ~]# docker inspect test
[
    {
        "CreatedAt": "2024-04-10T16:11:31+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/test/_data",
        "Name": "test",
        "Options": null,
        "Scope": "local"
    }
]
[root@wangliukun ~]# 

rm 删除(删除一个或多个)

#需要先终止并删除容器
docker stop <容器id或名字>
docker rm <容器id或名字>
#删除数据卷
docker volume rm <数据卷name>
[root@wangliukun ~]# docker volume rm test
test
[root@wangliukun ~]# docker volume ls
DRIVER    VOLUME NAME
local     42cf01aa1d964763031a6a54ac84dd905300775b15e89b0ccf0c6fabd4e79cdc
local     42d71c5c011633f3c2c62e962bc2200d1b67ccc4ecb322a95d31fed1aa10f6cb
local     491d3ba6c2ab471b4699566b257a1c8bccd58870aa21b57613ef5fae80ddc31d
local     69383c3709d5752f4e61062a38d115d297f43c51c43d38d1ebe58bf6b2fdc1fe
local     a144dd3f4d6ace771a0c102fa7c7e977420f38b505f7924edffb711ecb3ab4d3
local     cc7c05a0f95d654f40791c1d0dfb4c0fd835c670f04926b4b2f0efc119ad6e0d
local     da28a04098c4588bebe99e078107624a4cfb47198b34accedb76580967b29476
local     f1e811634e97b9af4b9752659261880a789cfb12cb74e4f361820cd0b262bd44
local     f5a550270ded85e26e880a9f008cccfa9b10bc0fe2f8237225babf8c9b8f5b6b
local     f84b1314dde6b4361a7ed626c89e88aa617c579bf913ff4740a65f97bf7acd7c
[root@wangliukun ~]# 
  • prune 删除(删除所有未被使用的卷)
[root@wangliukun ~]# docker volume prune
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
42cf01aa1d964763031a6a54ac84dd905300775b15e89b0ccf0c6fabd4e79cdc
a144dd3f4d6ace771a0c102fa7c7e977420f38b505f7924edffb711ecb3ab4d3
491d3ba6c2ab471b4699566b257a1c8bccd58870aa21b57613ef5fae80ddc31d
69383c3709d5752f4e61062a38d115d297f43c51c43d38d1ebe58bf6b2fdc1fe
da28a04098c4588bebe99e078107624a4cfb47198b34accedb76580967b29476
f84b1314dde6b4361a7ed626c89e88aa617c579bf913ff4740a65f97bf7acd7c

Total reclaimed space: 34B
[root@wangliukun ~]# 

上一章:Docker底层技术
下一章:Docker容器网络

  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值