第六章 容器数据卷

第六章 容器数据卷

1、容器数据卷概念

​ Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。|

​ 卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

数据卷的特点:

  1. 数据卷可在容器之间共享或重用数据

  2. 卷中的更改可以直接生效

  3. 数据卷中的更改不会包含在镜像的更新中

  4. 数据卷的生命周期一直持续到没有容器使用它为止

2、数据卷挂载

1.在命令行挂载数据卷

​ 在docker create 命令或docker run 命令中 使用-v为容器增加一个数据卷

[root@chenyujie ~]# docker run -it --name volume -v /we
b/app docker.io/centos
[root@df12f34e55d6 /]# ls web/
app
[root@df12f34e55d6 /]# exit
exit
[root@chenyujie ~]# 

查看挂载信息:

[root@chenyujie ~]# docker inspect volume
[
    {
        "Id": "df12f34e55d66f3f39c9a8e1b7bbc0d35d26f80026ed0450a6e818194c29c2c3",
        "Created": "2024-04-03T02:36:09.470937461Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2024-04-03T02:36:10.181937104Z",
            "FinishedAt": "2024-04-03T02:36:30.896831776Z"
        },
 .......
[root@chenyujie ~]# 

手动指定宿主机挂载目录 :

[root@chenyujie ~]# docker run -it -d --name test -v /webapp:/app docker.io/nginx
40a460d9753b1455d96e34ddf92c5ea15415672406a1bb3533f6ebb9f86958b4
[root@chenyujie ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS                      PORTS     NAMES
40a460d9753b   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute           80/tcp    test
df12f34e55d6   centos    "/bin/bash"               24 minutes ago       Exited (0) 24 minutes ago             volume
0b502a41ec40   centos    "/bin/bash"               7 days ago           Exited (0) 7 days ago                 great_hertz
539aa92c5206   centos    "/bin/bash"               7 days ago           Exited (0) 7 days ago                 interesting_torvalds
6f148e44406d   centos    "/bin/bash"               7 days ago           Exited (0) 7 days ago                 hardcore_boyd
#容器text的挂载数据信息  查看挂载数据信息
[root@chenyujie ~]# docker inspect test
[
    {
        "Id": "40a460d9753b1455d96e34ddf92c5ea15415672406a1bb3533f6ebb9f86958b4",
        "Created": "2024-04-03T02:59:31.495772228Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
.....
"Mounts": [
            {
                "Type": "bind",
                "Source": "/webapp",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        .....
        
数据卷共享机制,会在宿主机与容器端之间多次切换:

建立一个名字为text1的Nginx容器,并且将容器内的/app目录挂载到宿主机的/web/webapp路径下。

[root@chenyujie ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS                        PORTS     NAMES
d22999af21ad   nginx     "/docker-entrypoint.…"   About a minute ago   Up 2 seconds                  80/tcp    test1
40a460d9753b   nginx     "/docker-entrypoint.…"   31 hours ago         Exited (255) 20 minutes ago   80/tcp    test
df12f34e55d6   centos    "/bin/bash"               31 hours ago         Exited (255) 20 minutes ago             volume
[root@chenyujie ~]# docker exec -it d229 /bin/bash
root@d22999af21ad:/# ls /
app  boot  docker-entrypoint.d   etc   lib    media  opt   root  sbin  sys  usr
bin  dev   docker-entrypoint.sh  home  lib64  mnt    proc  run   srv   tmp  var
root@d22999af21ad:/# exit
exit
#根目录下多了一个app目录
[root@chenyujie ~]# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  web  webapp
[root@chenyujie ~]# cd /web/webapp/
[root@chenyujie webapp]# ls
[root@chenyujie webapp]# 

在宿主机的/web/webapp/目录下创建文件,并返回容器查看。

[root@chenyujie webapp]# touch a.txt btxt
[root@chenyujie webapp]# ls
a.txt  btxt
[root@chenyujie webapp]# rm -rf a.txt btxt 
[root@chenyujie webapp]# touch a.txt b.txt
[root@chenyujie webapp]# ls
a.txt  b.txt
[root@chenyujie webapp]# docker exec -it d229 /bin/bash
root@d22999af21ad:/# cd app
root@d22999af21ad:/app# ls
a.txt  b.txt
root@d22999af21ad:/app# 

在容器内创建文件 返回宿主机观察

root@d22999af21ad:/app# touch c.txt        
root@d22999af21ad:/app# ls
a.txt  b.txt  c.txt
root@d22999af21ad:/app# exit
exit
[root@chenyujie webapp]# ls
a.txt  b.txt  c.txt
[root@chenyujie webapp]# 

总上 Docker数据卷能够实现docker容器与宿主机间的数据共享,并且能给将文件中的数据永久的保存下来,随时在宿主机查看修改,

设置数据卷的权限

创建一个名为volume1的Nginx容器,并将挂载数据卷权限设置为ro(只读)

[root@chenyujie ~]# docker run -it --name volume1 -v /src/test:/webapp:ro docker.io/nginx /bin/bash
root@a034093baeb4:/# exit
exit

查看数据卷是否挂载成功:

[root@chenyujie ~]# docker inspect volume1
#用docker inspect 查看挂载数据卷信息
   "Mounts": [
            {
                "Type": "bind",
                "Source": "/src/test",
                "Destination": "/webapp",
                "Mode": "ro",
                "RW": false,
                "Propagation": "rprivate"
                .......
                
[root@chenyujie ~]# docker exec -it a034 /bin/bash
root@a034093baeb4:/# ls
bin                   etc    mnt   sbin  var
boot                  home   opt   srv   webapp
dev                   lib    proc  sys
docker-entrypoint.d   lib64  root  tmp
docker-entrypoint.sh  media  run   usr
root@a034093baeb4:/# exit
exit
#容器挂载目录webapp
[root@chenyujie ~]# cd /s
sbin/ src/  srv/  sys/  
[root@chenyujie ~]# cd /sr
src/ srv/ 
[root@chenyujie ~]# cd /src/test/
[root@chenyujie test]# ls

宿主机添加文件,查看效果

[root@chenyujie ~]# cd /src/test/
[root@chenyujie test]# ls
[root@chenyujie test]# touch a.txt
[root@chenyujie test]# echo hello word > a.txt
#在宿主机的挂载目录中创建一个文件并写入“hello word”
[root@chenyujie test]# docker exec -it a034 /bin/bash
root@a034093baeb4:/# cd webapp/
root@a034093baeb4:/webapp# ls
a.txt
root@a034093baeb4:/webapp# cat a.txt  
hello word
root@a034093baeb4:/webapp# 

在容器的目录下修改文件内容

root@a034093baeb4:/webapp# echo hello word > a.txt
bash: a.txt: Read-only file system
#因为在容器中文件类型为只读
root@a034093baeb4:/webapp# 
root@a034093baeb4:/webapp# echo hello word > d.txt
bash: d.txt: Read-only file system
root@a034093baeb4:/webapp# 
#因为在容器中的挂载目录同样为只读模式。
2. 通过dockerfile挂载数据卷

​ 用户创建镜像时,通常会在Dockertle文件中加上VOLUME(/date]来创建含有数据卷的镜像,并使用该镜像创建包含数据卷的容器。
​ Dockerile可以创建多个数据卷,与使用dockernun命令创建数据卷不同,Dockertie中的数据卷不能映射到已经存在的本地目录。在启动容器时,才会创建Dockerie中指定的数据卷,并且以Dockerfle 中指定的名称命名。运行同样镜像的容器创建的数据卷是不一样的(可以看到不同客器的数据卷地址也是不一样的)。当容器中的数据卷地址不一样时,容器之间就无法共享数据了。

​ 下面使用 Dockerfle中的VOLUME选项来指定挂载数据卷,首先创建Dockerfle 并添加内容,示例代码如下:

[root@chenyujie ~]# cat Dockerfile
FROM centos
VOLUME /root/date
VOLUME /work
VOLUME test
[root@chenyujie ~]# 

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

下面通过该 Dockerfile 创建新镜像,示例代码如下:

[root@chenyujie ~]# docker build -t volume .
[+] Building 0.1s (5/5) FINISHED        docker:default
 => [internal] load build definition from Docker  0.1s
 => => transferring dockerfile: 152B              0.0s
 => [internal] load metadata for docker.io/libra  0.0s
 => [internal] load .dockerignore                 0.0s
 => => transferring context: 2B                   0.0s
 => CACHED [1/1] FROM docker.io/library/centos:l  0.0s
 => exporting to image                            0.0s
 => => exporting layers                           0.0s
 => => writing image sha256:4cae8768a9189c1b2ef8  0.0s
 => => naming to docker.io/library/volume         0.0s
[root@chenyujie ~]# 

查看其挂载信息:

[root@chenyujie ~]# docker run -it volume
[root@a7bd625ebee8 /]# ls
bin  home   lost+found  opt   run   sys   usr
dev  lib    media       proc  sbin  test  var
etc  lib64  mnt         root  srv   tmp   work
#使用构建的镜像运行容器
[root@a7bd625ebee8 /]# exit
exit
[root@chenyujie ~]# docker inspect a7bd
[
    {
        "Id": "a7bd625ebee896b5dcaef6438dc255e5e18396ecbdcd825555d0ab26bc86e8f9",
        "Created": "2024-04-04T11:01:24.369902044Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false
            .....
              },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "4d79ae20b734b80e57b6ae12458c12fe25e3655e065e5ff00750a8188e6d6254",
                "Source": "/var/lib/docker/volumes/4d79ae20b734b80e57b6ae12458c12fe25e3655e065e5ff00750a8188e6d6254/_data",
                "Destination": "/work",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "c8de03cdfa5253d95b5b72848a288c1a7777062f1e961703bc6f78ade5202900",
                "Source": "/var/lib/docker/volumes/c8de03cdfa5253d95b5b72848a288c1a7777062f1e961703bc6f78ade5202900/_data",
                "Destination": "test",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "877b773a32f392ec26008a0a6d24f47d279c58a07d5f8dcc2e1fb759af320124",
                "Source": "/var/lib/docker/volumes/877b773a32f392ec26008a0a6d24f47d279c58a07d5f8dcc2e1fb759af320124/_data",
                "Destination": "/root/date",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        .........

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

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

3、数据容器卷

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

下面启动一个名为 volume-container 的容器,此容器包含两个数据卷/volume1和/volume2(这两个数据卷目录在容器中,运行容器时会自动创建),示例代码如下;

[root@chenyujie ~]# docker inspect volume-container | grep volume
        "Name": "/volume-container",
                "Type": "volume",
                "Source": "/var/lib/docker/volumes/b816501fe46bada196ee89cb332cbee3b315e7a36fac28588c22dd2b12245d20/_data",
                "Destination": "/volume2",
                "Type": "volume",
                "Source": "/var/lib/docker/volumes/a6dc0c44a030c91ee6f835a06c3b5967cd55d6cd3d8a71e94eef77b96b5534d9/_data",
                "Destination": "/volume1",
                "/volume1": {},
                "/volume2": {}
#查看挂载信息
[root@chenyujie _data]# cd /var/lib/docker/volumes/a6dc0c44a030c91ee6f835a06c3b5967cd55d6cd3d8a71e94eef77b96b5534d9/_data/
[root@chenyujie _data]# ls
[root@chenyujie _data]# echo hello container1 > a.txt
[root@chenyujie _data]# cd /var/lib/docker/volumes/b816501fe46bada196ee89cb332cbee3b315e7a36fac28588c22dd2b12245d20/_data/
[root@chenyujie _data]# ^Ce3b315e7a36fac28588c22dd2b122
[root@chenyujie _data]# echo hello container2 > b.txt

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

下面创建容器test1-container, 用–volumes-fom 参数挂载容器 volume-container中的数据卷:

[root@chenyujie ~]# docker run -it --name test1-container --volumes-from volume-container docker.io/centos
[root@c8f1ff596607 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@c8f1ff596607 /]# cat volume1/a.txt 
hello container1
[root@c8f1ff596607 /]# cat volume2/b.txt 
hello container2
[root@c8f1ff596607 /]# 

可以看到两个容器实现了数据共享

下面将初始数据卷容器删除,观察数据卷还能否正常工作

[root@chenyujie ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                       PORTS     NAMES
c8f1ff596607   centos    "/bin/bash"               2 minutes ago       Exited (127) 4 seconds ago             test1-container
8083c2f08491   centos    "/bin/bash"               19 minutes ago      Exited (0) 4 minutes ago               volume-container
a034093baeb4   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (137) 4 minutes ago             volume1
[root@chenyujie ~]# docker rm volume-container
volume-container
[root@chenyujie ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                        PORTS     NAMES
c8f1ff596607   centos    "/bin/bash"               3 minutes ago       Exited (127) 44 seconds ago             test1-container
a034093baeb4   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (137) 4 minutes ago              volume1
[root@chenyujie ~]# docker run -it --name test2-container --volumes-from test1-container docker.io/centos
[root@8a4ba8ce329a /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@8a4ba8ce329a /]# cat /volume1/a.txt 
hello container1
[root@8a4ba8ce329a /]# cat /volume2/b.txt 
hello container2
[root@8a4ba8ce329a /]# 

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

[root@chenyujie ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                       PORTS     NAMES
8a4ba8ce329a   centos    "/bin/bash"               2 minutes ago       Exited (0) 7 seconds ago               test2-container
c8f1ff596607   centos    "/bin/bash"               6 minutes ago       Exited (127) 4 minutes ago             test1-container
a034093baeb4   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (137) 8 minutes ago             volume1
[root@chenyujie ~]# docker rm c8f1
c8f1
[root@chenyujie ~]# docker rm 8a4b
8a4b
[root@chenyujie ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS                       PORTS     NAMES
a034093baeb4   nginx     "/docker-entrypoint.…"   About an hour ago   Exited (137) 9 minutes ago             volume1 
[root@chenyujie ~]# cd /var/lib/docker/volumes/b816501fe46bada196ee89cb332cbee3b315e7a36fac28588c22dd2b12245d20/_data/
[root@chenyujie _data]# ls
b.txt
[root@chenyujie _data]# cat b.txt 
hello container2
#宿主机本地的数据卷文件还存在
[root@chenyujie _data]# 

即使删除了所有的容器,数据卷也保留在宿主机中,提高了安全性。

4、备份数据卷

企业中,业务数据不容有失。人们通常会对数据进行一次备份或多次备份,以保证数据的安全性。
下面创建一个名为data-volume的CentOS 容器,准备对其挂载的两个数据卷/var/volume1和/var/volume2进行备份操作。示例代码如下:

[root@chenyujie ~]# docker run -it --name data-volume -v /var/volume1 -v /var/volume2 docker.io/centos
[root@1fda5f8a8d24 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@1fda5f8a8d24 /]# ls /var/
adm    crash  empty  games   kerberos  local  log   nis  preserve  spool  volume1  yp
cache  db     ftp    gopher  lib       lock   mail  opt  run       tmp    volume2
#在容器挂载目录中创建文件并添加内容,
[root@1fda5f8a8d24 /]# echo hello container1 > /var/volume1/a.txt
[root@1fda5f8a8d24 /]# echo hello container > /var/volume2/b.txt
[root@1fda5f8a8d24 /]# 

以上示例分别在容器挂载目录volume1与volume2中创建了a.txt与b.txt两个文件,并在文件中添加了内容。
简而言之、备份数据卷就是使用-volumes-from参数来创建一个挂载数据卷的容器,从宿主机挂载要存放备份数据的目录到容器的备份目录,并备份数据卷中的数据。完成后使用–rm 参数删除容器,此时备份数据已经保存在当前的目录下。示例代码如下:

[root@chenyujie ~]# docker run --rm --volumes-from data-volume -v /root/backup:/backup docker.io/centos tar cvf /backup/backup1.tar /var/volume1
#--rm:该容器执行完命令后自动删除
#挂载宿主机/root/backup目录到容器的/backup目录
#创建、运行容器
tar: Removing leading `/' from member names
#执行tar命令,备份数据卷,停止并删除容器
/var/volume1/
/var/volume1/a.txt
[root@chenyujie ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS                        PORTS     NAMES
1fda5f8a8d24   centos    "/bin/bash"               8 minutes ago   Exited (127) 3 minutes ago              data-volume
a034093baeb4   nginx     "/docker-entrypoint.…"   2 hours ago     Exited (137) 25 minutes ago             volume1
#此时容器已删除
[root@chenyujie ~]# ls /root/backup/
backup1.tar
#备份文件已存在
[root@chenyujie ~]# 

以上示例成功将容器中的/var/volume1/a.txt文件备份到宿主机中,并在备份之后将容器删除。宿时就主机中的/root/backup/backup1.tar 文件就是备份数据,只是该文件经过了压缩。
下面以同样的方式对容器中的/var/volume2/b.txt文件进行备份,示例代码如下:

[root@chenyujie ~]# docker run --rm --volumes-from data-volume -v /root/backup:/backup docker.io/centos tar cvf /backup/backup2.tar /var/volume2
tar: Removing leading `/' from member names
/var/volume2/
/var/volume2/b.txt
[root@chenyujie ~]# ls /root/backup/
backup1.tar  backup2.tar
[root@chenyujie ~]# 

此时,两份文件都已备份到宿主机中。
下面解压备份文件,并查看其目录结构,示例代码如下

[root@chenyujie ~]# tree .

[root@chenyujie ~]# tree .
.
├── anaconda-ks.cfg
├── backup
│   ├── backup1.tar
│   └── backup2.tar
├── Dockerfile
├── text
│   ├── a.txt
│   └── b.txt
└── var
    └── volume1
        └── a.txt

4 directories, 7 files

在以上示例中,仍可以看到备份之前的路径。
另外,也可以使用一条命令完成多个文件备份,示例代码如下:

[root@chenyujie ~]# docker run --rm --volumes-from data-volume -v /root/backup:/backup docker.io/centos tar cvf /backup/backup.tar /var/volume1 /var/volume2
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
/var/volume1/
/var/volume1/a.txt
/var/volume2/
/var/volume2/b.txt
[root@chenyujie ~]# ls /root/backup/
backup1.tar  backup2.tar  backup.tar
[root@chenyujie ~]# 

5、数据卷的恢复与迁移

容器对于宿主机来说就是一个进程,有时难免出现故障。在生产环境中,人们很少会去修复一个容器,通常是将原来的容器删除,并重新运行一个新的容器继续提供服务。这时就需要用到 Docker 数据卷的恢复与迁移技术。

恢复数据卷

恢复数据卷是将备份数据恢复到原容器中。
我们在 上一节节中已经在宿主机中做好了数据备份,下面模拟数据丢失来对容器数据卷进行恢复。

[root@chenyujie ~]# ls /root/backup/
backup1.tar  backup2.tar  backup.tar
[root@chenyujie ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                        PORTS     NAMES
1fda5f8a8d24   centos    "/bin/bash"               22 minutes ago   Exited (127) 16 minutes ago             data-volume
a034093baeb4   nginx     "/docker-entrypoint.…"   2 hours ago      Exited (137) 38 minutes ago             volume1
[root@chenyujie ~]# docker start 1fda
1fda
[root@chenyujie ~]# docker exec -it  1fda /bin/bash
[root@1fda5f8a8d24 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@1fda5f8a8d24 /]# ls /var/volume1
a.txt
[root@1fda5f8a8d24 /]# ls /var/volume2
b.txt
[root@1fda5f8a8d24 /]# rm -rf /var/volume1/a.txt 
[root@1fda5f8a8d24 /]# rm -rf /var/volume2/b.txt 
[root@1fda5f8a8d24 /]# 

以上示例为了模拟数据丢失,将容器中的文件/var/volume1/a.txt与 /var/volume2/b.txt删除。

下面进行数据恢复,示例代码如下:

[root@chenyujie ~]# docker run --rm --volumes-from data-volume -v /root/backup/:/backup docker.io/centos tar xvf /backup/backup.tar -C /
var/volume1/
var/volume1/a.txt
var/volume2/
var/volume2/b.txt
#将容器挂载到数据卷容器data-volume
#将宿主机的备份文件存放目录挂载至容器
#执行解压操作
#-c后面的路径用于存放恢复后的数据
[root@chenyujie ~]# 

以上示例通过创建新容器对数据卷容器进行挂载,并将宿主机数据目录挂载到容器,再将后的数据存放到指定路径。
下面进入容器查看数据是否成功恢复,示例代码如下:

[root@chenyujie ~]# docker attach data-volume
[root@1fda5f8a8d24 /]# ls /var/
adm/      crash/    empty/    games/    kerberos/ local/    log/      nis/      preserve/ spool/    volume1/  yp/       
cache/    db/       ftp/      gopher/   lib/      lock/     mail/     opt/      run/      tmp/      volume2/  
[root@1fda5f8a8d24 /]# ls /var/volume1
a.txt
[root@1fda5f8a8d24 /]# ls /var/volume2
b.txt
[root@1fda5f8a8d24 /]# 

从以上示例中可以看到,数据文件 a.txt与 b.txt都已经成功恢复,

迁移数据卷

迁移数据卷是将备份数据恢复到新建容器中。
新建容器并解压备份文件到新的容器数据卷,示例代码如下

[root@chenyujie ~]# docker run -it -v /var/volume1 -v /var/volume2 --name new-container docker.io/centos /bin/bash
#创建一个新的容器,并且挂载要恢复数据的目录
[root@85d024d246a5 /]# ls /var/volume1
[root@85d024d246a5 /]# ls /var/volume2
[root@85d024d246a5 /]# 

以上示例新建了容器 new-container,并挂载了数据卷目录 volume1与volume2,但数据卷中并没有数据。
下面使用 Ctrl+P+Q组合键退出当前容器终端,将备份数据迁移到容器new-container中,

[root@chenyujie ~]# docker run -it --rm --volumes-from new-container -v /root/backup/:/backup docker.io/centos tar xvf /backup/backup.tar -C/
var/volume1/
var/volume1/a.txt
var/volume2/
var/volume2/b.txt
[root@chenyujie ~]# docker attach new-container
[root@85d024d246a5 /]# ls /var/volume1
a.txt
[root@85d024d246a5 /]# ls /var/volume2
b.txt
[root@85d024d246a5 /]# 

从以上示例中可以看到,数据已经迁移成功。
建议新容器创建时挂载的数据卷路径与先前备份的数据卷路径保持一致,否则会出现数据恢复
不全的情况。

[root@chenyujie ~]# docker run -it -v /var/volume1 --name new-container1 docker.io/centos /bin/bash
[root@abcc7c4f96d5 /]# ls /var/
adm    crash  empty  games   kerberos  local  log   nis  preserve  spool  volume1
cache  db     ftp    gopher  lib       lock   mail  opt  run       tmp    yp
[root@abcc7c4f96d5 /]# [root@chenyujie ~]# 
[root@chenyujie ~]# docker run -it --rm --volumes-from data-volume -v /root/backup/:/backup docker.io/centos tar xvf backup/backup.tar -C /
var/volume1/
var/volume1/a.txt
var/volume2/
var/volume2/b.txt
[root@chenyujie ~]# docker attach new-container1
[root@abcc7c4f96d5 /]# ls /var/
adm    crash  empty  games   kerberos  local  log   nis  preserve  spool  volume1
cache  db     ftp    gopher  lib       lock   mail  opt  run       tmp    yp
[root@abcc7c4f96d5 /]# ls /var/volume1/
a.txt

6、管理数据卷

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

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

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

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

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

  • docker rm-v

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

  • docker run--rm

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

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

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

命令管理

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

创建数据卷

docker volume create :创建数据卷

docker volume ls :列出数据卷

[root@chenyujie _data]# docker volume ls
DRIVER    VOLUME NAME
local     3fb7cb711326541094f54fc568c0aa928c53d3e15c03dcbe8f51e2aea5f61d5a
local     4d79ae20b734b80e57b6ae12458c12fe25e3655e065e5ff00750a8188e6d6254
local     95b9981252b7f8af773fabad3d10f49bba6f1e6ee10c8b8b3ecc10d6f5e5adf5
local     157c8dbc7eb98b53a7cc1012ff40a008f6e2dfcbf79c7973707e71f9d1ae1684
local     802f2c33a3dd6d42f870861225e16484ce252dbc274d6293e9344e428dac0021
local     877b773a32f392ec26008a0a6d24f47d279c58a07d5f8dcc2e1fb759af320124
local     3064f05d6eaa944f1e36f307bea78a9df2f6b54c292209113355de3050b4ccfe
local     5272c089e25f54b214eb5b46731fb613789ad6ece3739c64a4d4eb089781516f
local     a6dc0c44a030c91ee6f835a06c3b5967cd55d6cd3d8a71e94eef77b96b5534d9
local     b816501fe46bada196ee89cb332cbee3b315e7a36fac28588c22dd2b12245d20
local     c8de03cdfa5253d95b5b72848a288c1a7777062f1e961703bc6f78ade5202900

也可在挂载目录查看

列出数据卷

docker inspect <容器id或名字>:列出数据卷

删除一个或多个数据卷

docker volume rm <数据卷name>:删除一个或多个数据卷

#需要先终止并删除容器
docker stop <容器id或名字>
docker rm <容器id或名字>
#删除数据卷
docker volume rm <数据卷name>
删除所有未被使用的数据卷

docker volume prune:删除所有未被使用的数据卷

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值