- CKA/CKAD应试教程:从Docker到Kubernetes完全攻略
- 段超飞编著
- 1002字
- 2025-03-17 18:51:32
1.8 数据卷的使用
当容器创建出来之后,会映射到物理机的某个目录(这个目录叫作容器层)里,在容器里写的东西实际上都存储在容器层,所以只要容器不被删除,在容器里写的数据就会一直存在。但是,一旦删除容器,对应的容器层也会被删除。
如果希望数据能永久保存,则需要配置数据卷,把容器里的指定目录挂载到物理机的某个目录里,如图1-19所示。

图1-19 数据卷
这里把物理机的目录/xx挂载到容器的/data目录里,当往容器的目录/data里写数据时,实际上是往物理机的目录/xx里写的。这样即使删除了容器,物理机目录/xx里的数据仍然是存在的,就实现了数据的永久保留(除非手动删除)。
在创建容器时,用-v指定数据卷,用法如下。
(1)-v /dir1:物理机的目录/var/lib/docker/volumes/ID/_data/会挂载到容器的/dir1目录里,这里的ID是随机生成的。
(2)-v /dir2:/dir1:在物理机里指定目录/dir2映射到容器的/dir1目录里。
记住,冒号左边的/dir2是物理机的目录,冒号右边的/dir1是容器里的目录,这两个目录如果不存在,在创建容器时会自动创建。
第1步 创建容器c1,把物理机的一个随机目录挂载到容器的/data目录里。

在此命令里,-v后面只指定了一个目录/data,指的是在容器里创建/data,挂载物理机的一个随机目录。
上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。
第2步 查看容器里的/data目录对应物理机的哪个目录。


上面有两个参数,其中Destination指的是容器里的目录,Source指的是物理机对应的目录。
往容器里拷贝一个文件。

可以看到,目录是空的。

第3步 删除此容器。

上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。
如果想在物理机里也指定目录而不是随机目录,则用法为-v /xx:/data,此处冒号左边是物理机的目录,冒号右边是容器里的目录。
第4步 创建容器c1,把物理机的目录/xx映射到容器的/data目录里。

在nerdctl里物理机所需要的目录不能自动创建,所以需要在vms101上先创建目录/xx,然后在vms101上可以通过如下命令来实现。

查看此容器的属性。

第5步 拷贝一些测试文件过去观察一下。

第6步 删除此容器。

上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。
刚才在创建容器指定卷时,是这样写的-v /xx:/data,其实这里隐藏了一个默认选项rw,即完整的写法是-v /xx:/data:rw,也就是容器里的/data是以rw的方式挂载物理机的/xx目录,可以使用ro(只读)的方式挂载卷。
第7步 在创建容器时设置卷为只读。

上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。
此时往容器里拷贝一个数据。

拷贝不过去,因为现在是以ro的方式挂载物理机的/xx目录。
第8步 删除此容器。

上述命令在vms101上用nerdctl执行,只要把关键字docker换成nerdctl即可。