容器数据卷
- 简介
- 是什么
- 能干嘛
- 详解
- 特点
- 容器内添加数据卷的方式
- 直接命令添加
- 命令: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
- 通过docker inspect命令,查看是否绑定成功---HostConfig底下的Binds
- 检测是否实现了宿主机和容器之间的数据共享
- 容器停止退出后,主机修改后数据是否同步
- 命令带权限
- DockerFile方式添加
- 根目录下新建mydocker文件夹并进入
- 在DockerFile中使用`VOLUME指令`给进行添加一个或多个数据卷
- File构建
- build后生成镜像
- run 容器
- 容器内的卷目录地址,如果不填写对应的主机目录地址,在主机中也有有对应的数据卷与之绑定
- 注意
- 执行docker ps命令,出现 "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"问题
- 容器数据卷volumes-from
- 总体介绍
- 容器间传递共享(volumes-from)
- 案例演示
- 结论:容器之间配置信息的传递,数据卷的生命周期一致持续到没有容器使用它为止
简介
是什么
类似redis里面的rdb和aof,用来做数据持久化操作的
能干嘛
容器的持久化
容器间继承加共享数据
详解
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供的一些用于持续共享数据的特性
卷的设计目的就是数据的持久化,完全独立与容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点
- 数据卷可在容器直接共享或者重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一致持续到没有使用它为止
容器内添加数据卷的方式
直接命令添加
命令: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
未执行命令前,主机里面没有对应的目录,但是执行完命令后,主机里面创建的对应的目录,新建并运行的容器中也创建了指定的目录
可以看出 -v命令: 如果没有指定的目录的话,会新建一个
docker inspect命令,以json字符串形式查看当前容器内部细节
通过docker inspect命令,查看是否绑定成功—HostConfig底下的Binds
HostConfig 的BInds显示主机的myDataVolume目录与容器中dataVolumeCintainer目录绑定在了一起
检测是否实现了宿主机和容器之间的数据共享
在宿主机的myDataVolume目录下面新建一个文件
去容器里面绑定的目录下查看是否存在指定新建的文件
存在,实现了宿主机和容器之间的数据共享
容器向文件中写入数据
宿主机查看,发现了新增的数据
容器停止退出后,主机修改后数据是否同步
容器启动过程中,同步了一遍主机的数据,优点类似redis的rdb和aof
命令带权限
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
这里ro表示只可以宿主机对容器数据卷进行读写操作,而容器里面对于数据卷的操作只能够是只读的,不可以增删改
以只读的方式启动容器,切换到opt目录下面,创建dhy.txt文件,成功
下面切换到dataVolumeContainer目录下面,尝试创建文件
提示只读,说明只读的权限只针对于和宿主机绑定的共享目录
宿主机在对应的myDataVolume目录下创建文件成功
容器查看,可以得到对应的文件
DockerFile方式添加
根目录下新建mydocker文件夹并进入
在DockerFile中使用VOLUME指令
给进行添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"];
说明:
出于可移植性和分享的考虑,用-v主机目录这种方法不能够直接在Dockerfile中实现
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录
File构建
编写可执行的dockerfile脚本
代码语言:javascript复制# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished, ----------------success1"
CMD /bin/bash
新建一个Dockerfile文件,并将上面的脚本放入其中
build后生成镜像
docker build -f /mydocker/Dockerfile -t zzyy/centos .(最后结尾有一个点)
获得一个新镜像zzyy/centos
run 容器
docker run -it zzyy/centos
容器里面已经新建了两个数据卷
容器内的卷目录地址,如果不填写对应的主机目录地址,在主机中也有有对应的数据卷与之绑定
注意
Docker挂载主机目录Docker访问出现cannot open directory…Permission denied
解决方法: 在挂载目录后多加一个 --privileged=true参数即可
执行docker ps命令,出现 "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"问题
代码语言:javascript复制“Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”
此时已确定Docker本身已经安装正常。
问题原因是因为docker服务没有启动,所以在相应的/var/run/ 路径下找不到docker的进程。
执行 service docker start 命令,启动docker服务,返回
docker start/running, process 2662
此时进程启动成功,再执行docker ps,问题解决
容器数据卷volumes-from
总体介绍
上面新建的镜像 zzyy/centos为模板并运行容器dc01/dc02/dco3
他们已经具有容器卷: /dataVolumeContainer1 /dataVolumeContainer2
容器间传递共享(volumes-from)
案例演示
先启动一个父容器dco1,在dataVolumeContainer2新增内容
dco2和dco3继承dco1
命令: --volumes-from
dco2继承至dco1
docker run -it --name dco2 --volumes-from dco1 zzyy/centos
此时看到dco2下面的数据卷中存在dco1_add.txt
并且dco2在当前共享数据卷下面新建一个dco2_add.ttx
dco3继承至dco1,并在共享数据卷下面新建dco3_add.txt
此时回到dco1,可以看到三个不同容器创建的文件,即完成了容器间的数据共享
如果此时删除dco1,数据卷的共享是否会受到影响?
此时进入dco2,发现当前共享数据卷没有受到任何影响,然后我们再新建一个update_dco2.txt,看看是否dco3也可以看到新建的文件,即检验数据卷是否还可以共享
数据卷依然可以共享