云计算-9-Dokcer容器的数据管理
什么是数据卷
数据卷是可以供一个或者多个容器使用的特殊目录,它绕过UFS(UNIX文件系统),数据卷的设计目的,在于数据的持久化存储,它完全独立于容器的生命周期,所以在删除docker容器的时候不会删除其挂载的数据卷,也不存在类似垃圾收集机制,对容器挂载的数据卷进行处理。
数据卷有以下特点:
数据卷在容器启动的时候进行初始化,如果容器使用的进行在挂载点包含数据,那么数据也会拷贝到初始化的数据卷中
数据卷可以在容器之间进行共享或者重用
可以对数据卷里面的内容直接进行修改
数据卷的变化不会影响镜像的更新
数据卷会一直存在,哪怕是挂载数据卷的容器被删除
容器的数据卷
为容器添加数据卷
- -v 宿主机绝对路径:Docker容器内部绝对路径:叫挂载
我们还以centos为例:创建一个名为mycentos的容器,并且加载一个数据卷l在宿主机上的/centos/mydata,同步容器/data
目录下数据
docker run -v /centos/mydata:/data -it centos
此时已经进入容器,然后进入到/data
目录
cd /data
此时该路径下不存在任何数据,我们在该目录下创建一个text.txt文件
touch text.txt
然后我们在宿主机的查看/centos/mydata下文件也存在text.txt
因为数据卷是独立存在的,所以此时我们删除容器,数据卷还会存在
docker rm -f $(docker ps -qa) # 删除所有容器
- -v 不以/开头的路径:Docker容器内部绝对路径:叫绑定
docker run -v mydata:/data -it centos
其他步骤和上面一致,然后我们使用docker inspect 容器名查看容器的信息
docker inspect youthful_swanson
发现在启动容器的时候自动创建了一个volume。
创建一个数据卷
docker volume create mycentos
查看所有 数据卷
docker volume ls
docker volume inspect mycentos:查询卷详情 docker volume mycentos: 移除无用卷
为数据卷添加访问权限
docker run -v /centos/mydata:/data:ro -it centos
:ro给容器内部添加只读权限,这样docker容器内的目录下就不能创建文件,只能在宿主机的/centos/mydata下创建文件。
使用Dockerfile构建包含数据卷的镜像
指令格式:
volume["/test"]
dockerfile文件如下
FROM nexus.gree.com/centos VOLUME ["/mycentos1","/mycentos2"] CMD /bin/bash
构建镜像
docker build -t mycentos:v1 .
启动镜像,并进入容器
docker run --name mycentos2 -it mycentos:v1
查看容器目录,发现容器下有两个目录,/mycentos1和/mycentos2
Docker的数据卷容器
什么是数据卷容器
一个容器挂在数据卷,然后其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器叫做数据卷容器
挂载数据卷容器的方法
docker run --volumes-from [容器名]
举例说明:
docker run --name mycentos3 -it mycentos:v1 #(mycentos镜像是之前上面的dockerfile创建的)
mycentos:v1镜像存在两个数据卷mycentos1和mycentos2
进入容器后创建一个文件在数据卷mycentos1创建testcentos.txt
touch /mycentos1/testcentos.txt
创建一个新的容器,挂载刚才mycentos3这个容器创建的数据卷
docker run --name mycentos4 --volumes-from mycentos3 -it mycentos:v1
然后查看mycentos4容器的mycentos1数据卷下也存在testcentos.txt。
docker cp指令
Docker cp指令有两种格式
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- :把容器里面的复制出来 docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH:把外部的复制进去
OPTIONS说明:
- **-L 😗*保持源目标中的链接
举例说明
- 将/mydata/test目录拷贝到8899992容器的/mydata目录下
docker cp /mydata/test 8899992:/mydata
- 将容器8899992的/mydata目录拷贝到主机/mydata目录下
docker cp 8899992:/mydata /mydata/