数据卷和目录挂载
我们知道Docker容器它仅仅是镜像的一个实例,需要持久化保存的数据不应该直接保存到Docker容器中。数据卷是一个可供容器使用的特殊目录,专门用来持久化数据。除此之外,我们也可以将一个宿主机的目录或文件挂载到容器中。
数据卷
使用命令行参数挂载数据卷
我们可以在docker run
时,使用参数-v
创建并挂载一个数据卷。
下面例子中,我们启动了Ubuntu 14.04的Bash Shell并进入交互式终端模式,和之前不同的是我们挂载了一个数据卷到/mnt/appdata
目录。
docker run -it -v /mnt/appdata ubuntu:14.04 bash
我们使用docker inspect
查看该容器详细信息时,可以在Mounts
节点看到相关信息。
输出表明,我们在容器中,挂载了宿主机的/var/lib/docker/volumes/2de1c4cd59ed377323e8eebaa6344abed5919273bc6bfbf76389bbdd3b852522/_data
到了容器的/mnt/appdata
目录。
上面创建数据卷挂载的宿主机目录是Docker给我们生成的,它也是不可移植的,因为如果我们再次用上述命令创建新的容器,它还会生成另一个数据卷。因此,另一种方式是指定宿主机的挂载点,将在后文介绍。
查看所有数据卷
执行以下命令可以查看数据卷信息。
docker volume ls
删除数据卷
删除容器时,使用docker rm -v <容器ID>
可以一同删除容器和数据卷。如果不指定-v
参数,数据卷不会自动删除。
此外,如果容器已经被删除了,我们也可以使用下面命令单独删除数据卷。
docker volume rm <数据卷NAME>
注意:如果容器还存在,数据卷是无法单独删除的。
清理无用数据卷
我们在开发机上使用Docker测试运行时,由于Docker默认删除容器时不会删除数据卷,因此我们的电脑上可能会产生一大堆无用的数据卷,如下命令可以进行自动清理。
docker volume prune
注意:操作生产环境服务器时,执行该命令要谨慎,避免误删数据!
挂载宿主机目录或文件
除了创建数据卷,我们也可以将宿主机的目录或文件直接挂载到容器中,该操作常用于加载位于宿主机上的配置文件,下面是一个例子。
docker run -it -v /home/ubuntu:/mnt/appdata ubuntu:14.04 bash
上述命令会将宿主机的/home/ubuntu
目录挂载到容器内/mnt/appdata
下,我们可以通过docker inspect
命令进行观察。不过要注意的是,Dockerfile中是无法指定这种挂载模式的,只能在创建容器时通过命令行-v
参数指定。挂载指定目录或文件时也要注意,如果容器中已经存在同目录或文件,那么挂载时将会被覆盖,因此这里不要误操作将容器中重要数据清空。