网站空间在那里买,网址无法打开网页是怎么回事,官方网站建设的重要性,个人或企业做网络贸易的主要网站数据卷容器
数据共享
上面讲述的是主机和容器之间共享数据#xff0c;那么如何实现容器和容器之间的共享数据呢#xff1f;那就是创建 创建数据卷容器。
命名的容器挂载数据卷#xff0c;其他容器通过挂载这个#xff08;父容器#xff09;实现数据共享#xff0c;挂载…数据卷容器
数据共享
上面讲述的是主机和容器之间共享数据那么如何实现容器和容器之间的共享数据呢那就是创建 创建数据卷容器。
命名的容器挂载数据卷其他容器通过挂载这个父容器实现数据共享挂载数据卷的容器称之为 数据卷容器(Data Volume Container)。
通俗地来说docker 容器数据卷可以看成使我们生活中常用的 U 盘它存在于一个或多个的容器中由 docker 挂载到容器但不属于联合文件系统Docker 不会在容器删除时删除其挂载的数据卷。在创建一个容器时候使用命令绑定一个父容器这个父容器就是 数据卷容器。
特点
数据卷可以在容器之间共享或重用数据数据卷中的更改可以直接生效数据卷中的更改不会包含在镜像的更新中数据卷的生命周期一直持续到没有容器使用它为止
命令格式docker run --volumes-from 数据卷容器名 镜像名[:TAG | ID]
创建三个容器 tomcat10、tomcat11、tomcat12其中 tomcat10 是数据卷容器
[rootk8s-master ~]# docker run -d -P --name tomcat10 -v tomcat10:/usr/local/tomcat/webapps tomcat:8.5.73
c96daf52665e7955a7f34c513c9dd5be7a2206e4f7b3519a365a289bbe78f9d6
[rootk8s-master ~]# docker run -d -P --name tomcat11 --volumes-from tomcat10 tomcat:8.5.73
fd1460b6394c4085170298d0916a521669d4d5050086450b151b41fba97e3c19
[rootk8s-master ~]# docker run -d -P --name tomcat12 --volumes-from tomcat10 tomcat:8.5.73
e023742c8c9f6afcf24bb53861ecfd21c7abb0042ea096c544826d1106b9a983证明三个容器的数据是否共享
已经创建好三个容器并且 tomcat10 容器的数据卷目录是 tomcat10。我们可以在 tomcat10 容器的 webapps 目录下创建一个 test.txt 文件看看 tomcat11 容器和 tomcat12 容器的 webapps 是否同步数据。
首先进入 tomcat10 容器的 webapps 目录创建 test.txt 文件
[rootk8s-master ~]# docker exec -it tomcat10 /bin/bash
rootc96daf52665e:/usr/local/tomcat# cd webapps
webapps/ webapps.dist/
rootc96daf52665e:/usr/local/tomcat# cd webapps/
rootc96daf52665e:/usr/local/tomcat/webapps# touch test1.txt
rootc96daf52665e:/usr/local/tomcat/webapps# ls
test1.txt然后我们进入 tomcat11 容器看文件是否同步过来并且创建 test2.txt 文件
[rootk8s-master u]# docker exec -it tomcat11 /bin/bash
rootfd1460b6394c:/usr/local/tomcat# cd webapps/
rootfd1460b6394c:/usr/local/tomcat/webapps# ls -l
total 0
-rw-r--r--. 1 root root 0 Feb 27 12:24 test1.txt然后我们进入 tomcat12 容器看文件是否同步过来
[rootk8s-master u]# docker exec -it tomcat12 /bin/bash
roote023742c8c9f:/usr/local/tomcat# cd webapps/
roote023742c8c9f:/usr/local/tomcat/webapps# ls -l
total 0
-rw-r--r--. 1 root root 0 Feb 27 12:24 test1.txt最后我们看看宿主机的挂载目录
[rootk8s-master ~]# cd /var/lib/docker/volumes/tomcat10/_data/
[rootk8s-master _data]# ls
test1.txt如果删除了挂载的容器包括 dbdata、db1 和 db2数据卷并不会被自动删除。如果要删除一个数据卷必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。这可以让用户在容器之间升级和移动数据卷。
数据备份
可以利用数据卷对其中的数据进行进行备份、恢复。
数据备份命令格式docker run [options] --volumes-from 数据卷容器 [-v 宿主机绝对路径:随机路径] 镜像名:[TAG | ID] tar cvf 随机路径/备份名 数据卷容器路径 不指定宿主机挂载目录下和容器备份目录备份 tomcat10 容器的数据卷 webapps 目录
[rootk8s-master _data]# docker run --name tomcat-backup --volumes-from tomcat10 tomcat:8.5.73 tar cvf /backup.tar /usr/local/tomcat/webapps
tar: Removing leading / from member names
/usr/local/tomcat/webapps/
/usr/local/tomcat/webapps/test1.txt
[rootk8s-master _data]# find / -name backup.tar
/var/lib/docker/overlay2/bc35ab2d75946a2392d68ddd0872a9656b3013a0da8e771ee4bea0dfc1bdbda2/diff/backup.tar如果容器删除那么该方式的备份文件也被删除并且备份目录是容器 ID 命名并非容器名看一长串字符串就知道了。
指定宿主机挂载目录下和容器备份目录备份 tomcat10 容器的数据卷 webapps 目录
[rootk8s-master _data]# docker run --volumes-from tomcat10 -v /opt/backup:/backup tomcat:8.5.73 tar cvf /backup/backup.tar /usr/local/tomcat/webapps
tar: Removing leading / from member names
/usr/local/tomcat/webapps/
/usr/local/tomcat/webapps/test1.txt
[rootk8s-master _data]# find / -name backup.tar
/var/lib/docker/overlay2/bc35ab2d75946a2392d68ddd0872a9656b3013a0da8e771ee4bea0dfc1bdbda2/diff/backup.tar
/opt/backup/backup.tar注意容器的挂载路径要和备份的文件路径保持一致才能备份成功。
数据恢复
备份了数据那么就需要进行数据恢复。
恢复命令格式docker run --volumes-from 恢复到哪个数据卷容器 [-v 宿主机绝对路径:随机路径] 镜像名[:TAG | ID] tar xvf 随机路径 | 路径 数据恢复到 tomcat20 容器的数据卷里
[rootk8s-master _data]# docker run -d --name tomcat20 -v tomcat20:/usr/local/tomcat/webapps tomcat:8.5.73
6b1b3fa0e74149197449bf0129771ff462f781d7c476365df9da1c0cc80fecd7[rootk8s-master _data]#
[rootk8s-master _data]# docker run --volumes-from tomcat20 -v /opt/backup:/backup tomcat:8.5.73 tar xvf /backup/backup.tar -C /usr/local/tomcat/webapps/
usr/local/tomcat/webapps/test1.txt-C / 代表解压到根目录下因为压缩包的文件基于根目录的否则解压的目录是基于 /backup。
原理此时 tomcat20 挂载目录是 /usr/local/tomcat/webapps而新的容器只要挂载了 tomcat20 容器它们两个的 /usr/local/tomcat/webapps 形成关联新的容器的这个目录发生改变则 tomcat20 的挂载目录也会发生改变所以解压文件到新的容器的该目录下实际上也是解压文件到 tomcat20 的挂载目录下也就是实现恢复数据。
[rootk8s-master _data]# docker exec -it tomcat20 /bin/bash
root6b1b3fa0e741:/usr/local/tomcat# cd webapps/
root6b1b3fa0e741:/usr/local/tomcat/webapps# ls
test1.txt挂载特性
关于到底是宿主机的挂载目录覆盖容器的挂载目录还是反过来覆盖
默认目录挂载 当宿主机挂载目录已经存在时双方挂载完成后宿主机挂载目录覆盖容器挂载目录当宿主机挂载目录不存在时双方挂载完成后容器挂载目录覆盖宿主机挂载目录 具体目录挂载 当宿主机挂载目录无论存不存在双方挂载完成后宿主机挂载目录都会覆盖容器挂载目录
默认目录挂载
宿主机容器运行结果文件存在文件存在挂载成功宿主机文件内容覆盖容器文件内容目录存在目录存在挂载成功宿主机目录内容覆盖容器目录内容..................文件不存在文件存在挂载成功容器文件内容覆盖宿主机文件内容目录不存在目录存在挂载成功容器目录内容覆盖宿主机目录内容..................其他和 具体目录挂载 类似
具体目录挂载
宿主机容器运行结果文件存在文件存在挂载成功宿主机文件内容覆盖容器文件内容目录存在目录存在挂载成功宿主机目录内容覆盖容器目录内容------------------文件不存在文件存在挂载成功宿主机创建空文件并覆盖掉容器的文件导致也为空目录不存在目录存在挂载成功宿主机创建空目录并覆盖掉容器的文件导致也为空------------------文件存在文件不存在挂载成功目录存在目录不存在挂载成功------------------文件存在目录存在容器启动失败目录存在文件存在容器启动失败------------------目录不存在目录不存在挂载成功Docker 会自动在宿主机和容器内新建目录目录不存在文件存在容器启动失败目录不存在目录存在挂载成功宿主机空目录内容覆盖容器内目录空