一、容器数据卷
- Docker理念
- 将应用与运行的环境打包形成容器运行 ,运行环境可以伴随着容器,但是数据需要持久化
- 容器之间希望有可能共享数据,方便数据处理
- Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了
- 容器的数据卷就是用来将数据共享到宿主机,当容器删除时并不删除共享的内容,从而实现数据的持久化
- 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
- 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
- 核心功能如下
二、数据卷添加
- 前台运行:docker run -it --name -v /宿主机绝对路径目录:/容器内目录 镜像名
- 后台运行:docker run -d --name -v /宿主机目录:/容器内目录 镜像名
- 如果创建时宿主机的目录不存在也会自动创建
- docker inspect 容器ID 可以查看是否添加成功
...
"Mounts":[
{
"Type":"bind",
"Source":"/root/docker/mysql/log",
"Destination":"/var/log/mysql",
"Mode":"",
"RW":true,
"Propagation":"rprivate"
},
{
"Type":"bind",
"Source":"/root/docker/mysql/conf",
"Destination":"/etc/mysql",
"Mode":"",
"RW":true,
"Propagation":"rprivate"
},
{
"Type":"bind",
"Source":"/root/docker/mysql/data",
"Destination":"/var/lib/mysql",
"Mode":"",
"RW":true,
"Propagation":"rprivate"
}
]
...
- 此时在挂在目录内,无论是在宿主机修改还是在容器内修改,两者可见
- 即使容器停止过,在宿主机内新增的信息仍然会同步到容器内
- 也可以在启动时指定容器的权限:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
- Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied解决办法
- 在挂载目录后多加一个 –privileged=true 参数即可
三、数据卷容器
- 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
- 可以类比为一个池子,参与共享的容器都可以对池子进行增加、修改、删除,由于是公共资源,当任意容器修改资源时,别的容器可见
- 通过命令 <基础容器> --volumes-from <父容器> 来指定一个正在启动的基础容器需要同步父容器的什么内容
- docker run -it --name redis --privileged=true --volumes-from parentRedis 8cf625070931
- 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止