Docker容器数据卷

1. 容器数据卷

在使用 Docker 容器的过程中,我们遇到一个让人头疼的问题:容器中的数据该如何妥善管理呢?如果不小心删除了容器,数据没有备份,那么就没有办法恢复了

Docker容器数据卷(Volumes)是一种用于持久化容器数据的机制。即使容器被删除,数据卷中的数据也不会丢失,这使得数据卷非常适合存储数据库、应用程序配置文件以及其他需要长期保持的数据。Docker 容器数据卷就像是一个连接容器和外部世界的桥梁,它可以让容器中的数据持久化存储,并且可以在不同的容器之间共享数据。

数据卷的基本用途

  • 数据持久化:容器默认的文件系统是临时的,当容器被删除时,其中的数据也会丢失。使用数据卷可以保持数据的持久化。
  • 数据共享:数据卷可以在多个容器之间共享数据,这使得它们非常适合用来在多个应用间共享配置文件或存储。
  • 数据备份、恢复和迁移:由于数据存储在文件系统中而非容器内,因此备份、恢复和迁移操作可以更容易地进行
  • 在容器数据卷中更改数据可以直接实时生效。
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

2. 容器数据卷的类型

  • 绑定挂载(Bind Mount):

    • 数据卷可以绑定到宿主机的文件系统上的一个目录或文件上。
    • 这种类型的数据卷使得宿主机和容器可以共享文件。
    • 使用时需要指定宿主机的路径。
  • 命名卷(Named Volume):

    • Docker会自动在宿主机的一个特定目录下为数据卷创建一个文件夹。
    • 命名卷是由Docker管理的,它们的生命周期独立于容器,不依赖于宿主机上的路径。
  • 匿名卷(Anonymous Volume):

    • 在运行容器时未指定名称或路径创建的卷。
    • Docker自动为匿名卷分配一个随机名称,并且仅在容器的生命周期内存在。
    • 优点是使用方便,不需要提前创建数据卷,
    • 缺点是不太容易管理,因为没有一个明确的标识。

3. 操作命令

3.1 创建数据卷

命令:

docker volume create [VOLUME名]

 示例:创建一个名为myvolume的新数据卷

docker volume create myvolume

3.2 列出数据卷

命令:

docker volume ls

 这将显示所有数据卷的列表,包括它们的名称和创建时间

3.3 查看数据卷详情

命令:

docker volume inspect [VOLUME名]

查看指定数据卷的详细信息 

示例:

docker volume inspect myvolume

这将显示myvolume数据卷的详细信息,包括其驱动、挂载点等 

3.4 删除数据卷

命令:

docker volume rm [VOLUME名]

删除一个或多个指定的数据卷。

 示例:

docker volume rm myvolume

这将删除名为myvolume的数据卷。如果数据卷正在被使用,最好先停止使用它的容器。

3.5 运行容器并挂载数据卷

命令:

docker run [OPTIONS] -v [VOLUME名]:[容器内路径] [镜像名]

运行一个新的容器,并挂载一个数据卷到指定的容器内路径

示例:

docker run -d --name mycontainer -v myvolume:/data nginx

启动一个名为mycontainer的容器,使用nginx镜像,并将myvolume数据卷挂载到容器的/data路径。

3.6 绑定挂载

命令:

docker run [OPTIONS] -v /宿主机路径:/容器内路径 [镜像名]

将宿主机的目录或文件挂载到容器内部

示例:

docker run -d --name mycontainer -v /my/data:/data nginx

启动一个名为mycontainer的容器,使用nginx镜像,并将宿主机的/my/data目录挂载到容器的/data路径。

3.7 查看挂载到容器的数据卷

命令:

docker inspect [容器ID或名称]

示例:

docker inspect mycontainer

这将显示容器mycontainer的详细信息,包括挂载的数据卷

4. 操作实战

4.1 在宿主机中创建文件

[root@bogon /]# cd home
[root@bogon home]# ls
myregistry
[root@bogon home]# mkdir data
[root@bogon home]# ls
data  myregistry
[root@bogon home]# cd data
[root@bogon data]# vi 1.txt
[root@bogon data]# cat 1.txt
123123123123123123123123123123123123

4.2 运行容器绑定宿主机文件

[root@bogon /]# docker run -it --name wktime --privileged=true -v /home/data:/tmp/myData ubuntu /bin/bash
root@c415979e9335:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@c415979e9335:/# cd tmp
root@c415979e9335:/tmp# ls
myData
root@c415979e9335:/tmp# cd myData/
root@c415979e9335:/tmp/myData# ls
1.txt
root@c415979e9335:/tmp/myData# cat 1.txt
123123123123123123123123123123123123
root@c415979e9335:/tmp/myData# 

运行后,我们进入容器中/tmp/myData目录,看到宿主机中的文件已经映射到该目录下。并且数据内容一致。

4.3 验证数据共享

修改宿主机文件内容,查看容器内文件内容是否修改

宿主机修改:

[root@bogon data]# vi 1.txt

 容器内查看:

容器内修改,宿主机查看

容器内修改

宿主机查看

4.4 数据卷读写规则

通过上一个数据共享,我们可以看出挂载数据卷默认是读写,即:rw

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

只读测试:

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

创建一个容器

容器内不能创建文件 

4.5 数据卷的继承和共享

如果一个容器已经挂载数据卷,完成了宿主机与容器的映射,我们再创建一个容器,继承前一个容器的卷规则。

docker run -it  --privileged=true --volumes-from 父类  --name u2 ubuntu

示例: 新建wktime3容器,继承wktime容器卷规则,并在映射文件夹中创建文件

[root@bogon /]# docker run -it  --privileged=true --volumes-from wktime  --name wktime3 ubuntu /bin/bash
root@02b1671fe889:/# ls 
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@02b1671fe889:/# cd tmp
root@02b1671fe889:/tmp# ls
myData
root@02b1671fe889:/tmp# cd myData/
root@02b1671fe889:/tmp/myData# touch 8.txt
root@02b1671fe889:/tmp/myData# ls
1.txt  8.txt
root@02b1671fe889:/tmp/myData# 

查看宿主机是否存在容器中创建的文件

5. 最后

感谢大家,请大家多多支持!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

微刻时光

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

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

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

打赏作者

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

抵扣说明:

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

余额充值