Docker volume 的几种形态
有状态容器都有数据持久化需求。前一篇文章中提到过,Docker 采用分层文件系统时,文件系统的改动都是发生在最上面的容器层。在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。
不使用 Docker volume
默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。
Data volume (数据卷)
一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。有如下几种方式来使用 data volume:
(1)使用 “-v 容器内目录” 形式
[root@localhost ~]# docker run -dit --name v1 -v /test_data busybox
ca436842125042039399e9b8c5854d1e45e27c9798f4f4547749f6f07593643e
[root@localhost ~]#
"Mounts": [ -v /test_data 在docker 容器中创建一个 test_data 目录并且通过联合文件系统将docker 自动创建的目录挂在到一起,我理解相当于容器和宿主机文件目录的互相映射
{
"Type": "volume",
"Name": "16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45",
"Source": "/var/lib/docker/volumes/16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45/_data",
"Destination": "/test_data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
[root@localhost ~]# docker exec -it ca4368421250 sh
/ # ls
bin etc proc sys tmp var
dev home root test_data usr
/ #
其实,在busybox 容器被删除后,/var/lib/docker/volumes/16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45/_data目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了
使用 -v 来挂载一个主机上的目录到容器的目录
#format : -v host_file:docker_faile
[root@localhost /]# docker run -it --name v2 -v /boot:/boot busybox
/ # ls
bin boot dev etc home proc root sys tmp usr var
/ # cd boot
/boot # ls
System.map-3.10.0-957.el7.x86_64
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-3e3864368ff04293b38d71342d1cb389.img
initramfs-3.10.0-957.el7.x86_64.img
initramfs-3.10.0-957.el7.x86_64kdump.img
symvers-3.10.0-957.el7.x86_64.gz
vmlinuz-0-rescue-3e3864368ff04293b38d71342d1cb389
vmlinuz-3.10.0-957.el7.x86_64
使用 data container
如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。比如:
创建一个 data container:
#format : --volumes-from v2 #继承某个容器的卷文件
[root@localhost boot]# docker run -it --name v3 --volumes-from v2 busybox
/ #
/ # ls
bin boot dev etc home proc root sys tmp usr var
/ # ls /boot
System.map-3.10.0-957.el7.x86_64
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-3e3864368ff04293b38d71342d1cb389.img
initramfs-3.10.0-957.el7.x86_64.img
initramfs-3.10.0-957.el7.x86_64kdump.img
symvers-3.10.0-957.el7.x86_64.gz
vmlinuz-0-rescue-3e3864368ff04293b38d71342d1cb389
vmlinuz-3.10.0-957.el7.x86_64
使用 docker volume 命令
[root@localhost boot]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
[root@localhost boot]#
Docker 新版本中引入了 docker volume 命令来管理 Docker volume。
(1)使用默认的 ‘local’ driver 创建一个 volume
[root@localhost boot]# docker volume create --name voll
voll
[root@localhost boot]# docker volume inspect voll
[
{
"CreatedAt": "2019-06-12T22:58:45-04:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/voll/_data",
"Name": "voll",
"Options": {},
"Scope": "local"
}
]
[root@localhost boot]#
使用这个 volume
[root@localhost _data]# docker run -it --name v6 -v voll:/volume busybox
/ # ls
bin dev etc home proc root sys tmp usr var volume
/ # cd volume/
/volume # ls
1qaz
/volume #
可以使用 docker rm -vf 命令在删除容器时删除该容器的卷。
[root@localhost /]# docker volume ls #强制删除容器和卷文件
DRIVER VOLUME NAME
local d8a9ddb3f7ce482f170b88485b1f5802a9437c0921daf5e77ab170a18bf4ad4e
[root@localhost /]# docker rm -vf v1
v1
[root@localhost /]# docker volume ls
DRIVER VOLUME NAME
[root@localhost /]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost /]#