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. 最后
感谢大家,请大家多多支持!