文章目录
0. 前言
我们在使用docker时有时需要对一些数据进行持久化,但是容器删除之后容器内的数据就会丢失,而由于升级等原因容器又非常又可能被删除或替换,所以将数据与容器进行解绑成了我们唯一的选择,docker提供了两种方式
- 数据卷(Data Volumes):容器内数据直接映射到本地主机内
- 数据卷容器(Data Volumes Containers):使用特定容器维护数据卷
数据相关的命令为创建容器时的一下命令
选项 | 类型 | 说明 | |
---|---|---|---|
-v | --volume | list | 挂载主机上的文件卷到容器内 |
--volume-driver | string | 挂载文件卷的驱动类型 | |
--volumes-from | list | 从其他容器挂载卷 |
1. 数据卷
1.1. 数据卷的特性
- 数据卷可以在重启键共享和重用,可以在容器间传递数据
- 对数据卷内的数据修改立马会生效,无论是在容器内操作还是宿主机内操作
- 对数据卷的操作不会影响镜像,解耦了应用和数据
- 卷会一直存在,直到没有容器使用,可以安全卸载它
1.2. 在容器内创建一个数据卷
> docker run -itd -v /data ubuntu # 在后台启动一个ubuntu
fefc9625aa760b7986ae3b5a307571af81b9338ec7be5cecd54c57f1c72c5ab0 # 容器的id
> docker exec -it fefc /bin/bash # 进入容器
>ls
执行上面的命令 会发现在容器中创建了一个目录 那么问题来了 这样写跟进入容器然后创建一个目录有区别吗?
最大的区别在于 在容器中创建的目录无法被其他容器通过--volumes-from
进行挂载
1.3. 挂载一个宿主机目录作为数据卷
- 宿主机目录必须为绝对路径
- 如果宿主机目录不存在会自动创建
- 可以多次使用
-v
选项来挂载多个目录 - 权限默认为rw
- 挂载格式为 宿主机目录:容器目录[:权限]
权限: 写 rw 读 ro
> docker run -itd -v /data:/c/data ubuntu # 在后台启动一个ubuntu
6c8ccdd8123eb9455bf30aefa8934002c4c8afaf764883c06dea4b8e5557c423 # 容器的id
> docker exec -it 6c8c /bin/bash # 进入容器
在宿主机目录下创建一个文件写入内容 容器中同样会有这个文件和内容
在容器目录下创建一个文件写入内容 宿主机中同样会有这个文件和内容
1.4. 挂载一个宿主机文件作为数据卷(不推荐)
-v
也可以挂载文件到容器中 宿主机文件:容器文件[:权限]
2. 数据容器
- 挂载的数据容器不需要在运行状态
- 可以多次使用
--volumes-from
挂载多个数据卷 - 可以从其他已经挂载了容器卷的容器来挂载数据卷
- 如果一个容器挂载了多个数据卷,挂载他的容器将拥有它所拥有的所有数据卷
2.1. 创建并挂载数据容器
- 通过
-v
创建一个挂载了容器卷的容器 - 在应用容器中通过
--volumes-from
从数据容器中挂载数据卷
docker run -itd -v /dbdata --name dbdata ubuntu # 创建数据卷容器
docker run -itd --volumes-from dbdata --name db1 ubuntu # 创建容器1
docker run -itd --volumes-from dbdata --name db2 ubuntu # 创建容器2
进入容器1 创建一个目录 hello
docker exec -it db1 /bin/bash
mkdir /dbdta/hello
然后进入容器1 容器2 数据卷容器 你会发现都会有目录