docker核心之数据卷
Posted 穷少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker核心之数据卷相关的知识,希望对你有一定的参考价值。
文章目录
什么是数据卷映射
docker可以将宿主机上的目录映射到容器中,映射到容器内部的目录自动与宿主机的目录实现同步;即外部目录里面的作出改动,容器内部的目录也随之改动,保持同步,当然如果内部有改动,外部目录也会随之改动
为什么要做数据卷映射
众所周知docker每一个容器都是采用沙盒机制,每个容器里面都有单独完整的文件资源,这样做的好处是多个同样的镜像所运行的容器,同时运行互不影响,但是缺点也很明显,当容器被删除时,容器内的数据也会一并被删除,无法持久化(例如mysql,我们需要在mysql销毁时,保留其中的数据库),那么需要容器内的数据持久化,就需要进入容器,将需要被持久化的数据转移出到宿主上,但是手动转移太麻烦,而且容易出错,这个时候我们就需要数据卷映射
数据卷映射在容器运行时的作用
- 配置映射:我们在运行容器时,往往想容器安装我们特定的配置运行,这个时候,我们就可以通过数据映射将我们的配置文件映射到容器内部实现
- 数据持久化:容器被销毁时,外部宿主机的映射目录依旧会保存着,从而实现容器数据持久化
数据卷映射实现
一般是在运行容器,通过
docker run -v
来实现数据卷映射
特别注意:在运行时,是将宿主机的目录或文件映射到容器内,如果容器内有同名的目录或文件,会被覆盖,如果宿主机是空目录,而容器内同名目录内有文件,会被覆盖为空目录,以宿主目录为准(所以一般在做配置映射时,先将写好的配置文件放到指定目录,再映射)
# source_path:外部宿主机目录/文件路径
# dest_path:内部被映射目录/文件路径
# ro:read-only,容器对于映射目录只有读取权限,而无修改权限
# rw:read-write,容器对于映射目录具有读写权限(默认)
docker run -v source_path:dest_path[:ro|rw] container
-v
命令,可以多次使用,以实现同一个容器内,有多个映射目录
有几点需要注意:
- host机器的目录路径必须为全路径(准确的说需要以/或~/开始的路径),不然docker会将其当做volume而不是volume处理
- 如果host机器上的目录不存在,docker会自动创建该目录
- 如果container中的目录不存在,docker会自动创建该目录
- 如果container中的目录已经有内容,那么docker会使用host上的目录将其覆盖掉
具名映射和匿名映射
具名映射
- 我们可以给被映射目录设置卷名,方便管理,使用
- 所有具名映射在宿主上的路径都是在
/var/lib/docker/volumes/卷名称/_data
docker run -v 卷名:/映射目录 container
匿名映射
- 匿名映射,我们只需要设置需要映射目录
# 这个映射目录,指定是container容器中被映射的目录,而不是宿主机上的目录
docker run -v /映射目录 container
我们通过inspect
指令,根据容器ID查询到容器映射信息,映射信息里面就有卷ID
所有匿名映射在宿主上的路径都是在/var/lib/docker/volumes/卷名称/_data
指定映射目录
- 用户设置指定外部目录
# 指定目录映射
docker run -v 外部目录/映射目录 container
docker volume命令
命令 | 作用 |
---|---|
docker volume create [卷名] | 根据卷名,创建一个卷 |
docker volume inspect [卷名] | 根据卷名,查看卷的详细信息 |
docker volume ls | 列出已有的所有的卷 |
docker volume rm [卷名[ 卷名]] | 根据一个或多个卷名,删除指定的卷 |
容器与容器共享数据卷
有时候会出现这种要求,需要容器A共享容器B的数据,这个时候该怎么办呢?
通常一般在运行容器时,使用--volumes-from
指定共享容器
多个容器共享配置数据(案例)
- 以mysql为例,让多个mysql共享同一文件夹下的配置
- 先启动一个mysql容器,让第一mysql容器使用外部的配置,将
conf
映射到容器里的/etc/mysql
目录
使用docker inspect
查看容器的映射信息,路径就是我们设定的,所以这个mysql启动完成
- 我们再启动两个mysql容器,使用
--volumes-from
参数让这两个容器共享第一个mysql的数据卷
- 我们使用
docker inspect
指令查看mysql02,mysql03的挂载信息,结果显式,与mysql01的挂载信息相同
我们可以试着在任意一个容器里面的/etc/mysql
目录下,添加任意文件,或更改,你会发现其余两个容器下的/etc/mysql
目录也会同步更改
结论
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
以上是关于docker核心之数据卷的主要内容,如果未能解决你的问题,请参考以下文章