在上一篇文章中已经介绍了Dockerfile解析与镜像制作, 下面正式进入到docker容器数据卷与数据卷容器。
docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一部分保存下来,那么当容器被删除之后,数据也就没了,为了能够保存数据,在docker容器中使用卷。卷就是文件或者目录,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点。
容器数据卷是一个特殊的文件或者目录,它将主机文件或者目录直接映射进容器中,可供一个或多个容器使用。容器数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。
容器数据卷的特性:
//以交互模式运行容器,并使用-v 挂载容器数据卷
docker run -it -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 镜像ID/镜像名称[:版本号]
//以后台方式运行容器,并使用-v 挂载容器数据卷 (推荐)
docker run -d -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 镜像ID/镜像名称[:版本号]
//注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied
解决办法:在挂载目录后面 多加一个--privileged=true参数即可
案例:在Host宿主机的 /root目录下使用hostVolume目录 挂载数据卷到 centos容器内的 根目录 (/) 下的containerVolume目录
1、创建并运行centos容器,同时挂载数据卷
//这里没有使用--name=容器名称 去指定容器名称,则docker随机一个容器名称
docker run -it -v /root/hostVolume:/containerVolume centos
可以看到,此时由 root@localhost 转变成为 root@13243e227243 (容器ID),表示我们已经由宿主机进入到centos容器中。
2、查看数据卷是否挂载成功
可以看到centos容器
的根目录
下多了一个containerVolume目录,宿主机
的 /root目录
下多了一个hostVolume目录
同时还可以在宿主机
中使用指令docker inspect 容器ID/容器名称
来查看是否挂载成功
4、关闭容器后,更改宿主机hostVolume目录中的 host.txt文件,容器再次启动后数据仍然同步
案例:在Host宿主机的 /root目录下创建一个DockerFile文件 (名称随意
),并通过docker build指令生成镜像来添加数据卷
1、在Host宿主机的 /root目录下创建一个DockerFile文件,并添加如下内容到文件中
#基于centos镜像进行构建
FROM centos
#数据卷只能指定容器数据卷,不能指定宿主机数据卷,英文并不能够保证在所有的宿主机上都存在这样的特定目录。
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
#以 /bin/bash方式启动
CMD /bin/bash
2、使用如下指令,把编写的DockerFile文件执行生成镜像,注意:命令最后面是空格 + .
docker build -f 宿主机中DockerFile文件的绝对路径 -t 新镜像名称[:版本号] .
3、运行我们生成的new-centos镜像,就能够查看到在容器内中生成的数据卷
4、那么容器内的数据卷文件/目录地址已经知道,对应的宿主机文件/目录的地址怎么查看?通过如下指令
docker inspect 容器ID/容器名称
命名的容器已挂载数据卷
,其他的容器通过挂载这个容器(父容器)实现数据共享,挂载数据卷的容器,称为数据卷容器。通过数据卷容器可以实现容器间的数据共享。
docker run -it/-d -p 主机端口:容器端口 --name=容器名称 ----volumes-from 数据卷容器ID/数据卷容器名称 生成数据卷容器的镜像ID/镜像名称[:版本号]
案例:创建父容器,并在父容器的数据卷中添加数据,以挂载父容器生成子容器,实现数据共享
1、启动父容器,并在父容器的 dataVolumeContainer1目录下新增内容
2、基于父容器生成子容器son-centos,注意是在宿主机中
使用如下指令
docker run -it --name=son-centos --volumes-from father-centos new-centos
Docker入门到实践系列文章列表:
Docker入门到实践 (一) docker简介与安装
Docker入门到实践 (二) docker常用命令讲解
Docker入门到实践 (三) Dockerfile解析与镜像制作
Docker入门到实践 (四) docker容器数据卷与数据卷容器
Docker入门到实践 (五) docker数据的备份、恢复与迁移
Docker入门到实践 (六) docker常用软件安装
Docker入门到实践 (七) 本地镜像推送到阿里云 和 下载镜像到本地
Docker入门到实践 (八) Docker私有仓库的搭建与配置
Docker入门到实践 (九) IDEA集成Docker构建容器镜像,部署项目
如果有遇到不懂或者有问题时,可以扫描下方二维码,欢迎进群交流与分享,希望能够跟大家交流学习!