Docker数据管理
Docker在容器中管理数据主要有两种方式:
-
数据卷(Volumes)
-
挂载主机目录(Bind mounts)
数据卷
Docker的镜像是由多个只读的文件系统叠加在一起形成的。当我们在我启动一个容器的时候,Docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层。这时如果修改正在运行的容器中已有的文件,那么这个文件将会从只读层复制到读写层。该文件的只读版本还在,只是被上面读写层的该文件的副本隐藏。当删除Docker,或者重新启动时,之前的更改将会消失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
所以为了实现容器与主机之间、容器与容器之间共享文件,容器中数据的持久化(数据持久化即数据不随着Container的结束而结束),将容器中的数据备份、迁移、恢复等,Docker加入了数据卷(volumes)机制。简单的讲,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。
数据卷的特性:
- 数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
- 数据卷可以是目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了荣期间的数据共享和交换。
- 容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
- 容器对数据卷的修改是实时进行的。
- 数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会相互影响。
创建一个数据卷
docker volume create volumesName
注意: volumesName指数据卷的名字
查看所有的数据卷:
docker volume ls
查看指定数据卷的详细信息:
docker volume inspect volumesName
删除数据卷:
docker volume rm volumesName
无主的数据卷可能会占据很多空间,要清理请使用以下命令:
docker volume prune
Docker挂载容器数据卷
Docker有bind mounts
、Volumes
、和tepfs mounts
三种方式挂载数据卷 ,还有就是共享其他容器的数据卷,其中tmpfs是一种基于内存的临时文件系统。tepfs mounts数据不会存储在磁盘上。此文章笔者只讲述bind mounts
方法。
启动一个挂载数据卷的容器:
bind mounts方式挂载数据卷的两种方式:
- 使用
-v
参数挂载
docker run --name xxxx -p 宿主机端口:docker端口 -v 宿主机目录:docker目录 -it imagename /bin/bash
注意:宿主机目录和Docker目录必须是绝对路径
imagename为镜像名
- 使用
--mount
参数挂载
docker run --name xxxx -p 宿主机端口:docker端口 --mount
type:volume,source=xxx,target=/xxx 宿主机目录:docker目录 -it imagename /bin/bash
- type选项,其可以是bind,volume,或tmpfs。本文只讨论数据卷,因此类型始终是volume。
- source选项。对于命名数据卷,这是数据卷的名称。对于匿名数据卷,省略此字段。可以指定为source /src。
- 将destination文件或目录安装在容器中的路径作为其值。可以指定为destination,dst或target。
- readonly选项(如果存在)导致绑定装入以只读方式装入容器中。
- volume-opt选项可以多次指定,它采用由选项名称及其值组成的键值对。
注意:使用-v参数时如果本地目录不存在Docker会自动为你创建一个文件夹。使用–mount参数时如果本地目录不存在,Docker会报错。Docker挂载主机目录的默认权限是读写,用户也可以通过增加readonly指定为只读。
挂载主机目录
docker run -it --name XXXX -v /宿主机目录:/docker目录 -it imagename /bin/bash
注意:--mount
标记也可以从主机挂载单个文件到容器中