【云原生Docker】08-Docker存储

【云原生|Docker】08-Docker存储

简介

​ Docker 存储是指 Docker 容器中用来保存数据和文件的机制。在 Docker 中,容器本身是临时的,当容器停止或删除时,容器中的数据和文件也会被清除。因此,为了持久化保存容器中的数据和文件,我么就需要使用Docker的存储机制。

Docker存储

挂载方式

docker提供数据卷来实现数据共享与持久化,而数据卷的挂载有两种方式:

  • 挂载主机目录
  • 数据卷容器

挂载方式介绍

挂载主机目录

  • Type: bind
	绑定挂载是将宿主机上的目录或文件挂载到容器中的目录,从而实现容器中的数据和宿主机上的数据共享。绑定挂载使用 -v 或 --mount 参数来指定要挂载的宿主机目录和容器目录。这种方式的主要优势在于可以直接使用宿主机上的文件系统,可以方便地进行数据交换和备份。
  • Type: volume
	数据卷是 Docker 中一种特殊的目录,可以在容器和宿主机之间共享数据,也可以在容器之间共享数据。数据卷可以使用 docker volume create 命令创建,也可以在容器启动时使用 -v 或 --mount 参数来指定要挂载的数据卷。数据卷的主要优势在于可以在容器删除后保留数据,并且可以在不同的容器之间共享数据。
  • bind: 在docker inspect查看容器信息中mounts.type为bind类型;
  • volume: 在docker inspect查看容器信息中mounts.type为volume类型;

数据卷容器

	数据卷容器是一种特殊的Docker容器,其主要作用是管理Docker Volume,并将其共享给其他容器使用。具体来说,数据卷容器可以通过挂载Docker Volume来创建一个持久化的数据存储空间,并将其挂载到其他Docker容器中使用。

特性

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新不会影响镜像
  • 卷会一直存在,只到没有容器使用

Docker存储示例

挂载主机目录

Type: bind

  • Step1: 挂载一个宿主机目录作为数据卷
# #将宿主机的/root/data目录挂载至容器的/usr/share/nginx/html目录
docker  run -d  --name nginx_test -v /root/data:/usr/share/nginx/html:rw  nginx

# docker挂载数据卷的默认为权限为读写(rw),用户也可以通过ro指定为只读:
docker  run -d  --name nginx_test -v /root/data:/usr/share/nginx/html:ro  nginx

当 /root/data或/usr/share/nginx/html不存在的时候,/root/data会在宿主机上自动创建;/usr/share/nginx/html会在容器内自动创建。

  • *** Step2:*** 查看挂载类型
docker  inspect   nginx_test

在这里插入图片描述

Type:文件系统类型,可以是bind、volume、tmpfs等。
Source:挂载的源路径,可以是宿主机上的路径、Docker Volume的名称、tmpfs的名称等。
Destination:挂载的目标路径,即文件系统在容器内的挂载路径。
Mode:文件系统的访问权限控制,可以是read-write或read-only。
RW:表示是否为读写模式。
Propagation:表示Propagation mode的设置值。

Type: volume

  • Step1: 不指定宿主机目录,

默认会在宿主机的/var/lib/docker/volume下创建

# 不指定宿主机目录,挂载到容器的/usr/share/nginx/html
docker  run -d  --name nginx_test -v /usr/share/nginx/html  nginx
  • Step1: 也可以通过docker volume create 来创建存储卷
docker  volume  create my_volume
  • **Step2: **指定创建的存储卷
docker  run -d  --name nginx_test -v my_volume:/usr/share/nginx/html  nginx
  • *** Step2:*** 查看挂载类型

在这里插入图片描述

在这里插入图片描述

总结

  • -v 指定宿主机目录创建出来的容器的Mounts.type为 bind
  • -v 不指定宿主机目录(或 指定创建vomule)创建的容器的Mounts.type 为volume
  • 使用volume方式的时候,会将容器目录中的所有文件映射到宿主机目录中,而挂载主机目录的时候不会。

在这里插入图片描述

  • 特别注意:volume实际上也是挂载宿主机目录,上面只是区分两种挂载方式而已。

数据卷容器

  • Step1: 创建一个数据卷容器
 #创建一个数据卷容器dbdata,并创建一个数据卷挂载至/dbdata
docker run -it -v /dbdata --name dbdata  centos   
  • Step2: 其他容器可以通过–volumes-from来挂载dbdata容器中的数据卷:
docker run -it --volumes-from dbdata --name db1 centos
docker run -it --volumes-from dbdata --name db2 centos

容器db1和db2都挂载同一个数据卷到/dbdata目录,三个容器任何一方在该目录的写入,其他 容器都能看到.

–volumes-from参数可以多次使用,从多个容器挂载多个数据卷

如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示的使用docker rm -v 命令来指定同时删除关联的容器。

利用数据卷容器迁移数据

备份数据:

  • Step1: 创建含有数据的容器dbdata
docker run -d --name dbdata -v /dbdata  centos
  • Step2: 创造点生产数据
docker cp /var/log/ dbdata:/dbdata
  • Step3: 备份数据
  1. 先创建一个容器worker,并使用–volumes-from将dbdata挂载到worker容器,然后使用-v参数将容器的/backup目录映射到宿主机的backup目录。然后在容器中执行备份操作,这样就把数据备份到宿主机的/backup目录中了
docker run -it --volumes-from dbdata -v /backup:/backup --name worker centos  tar zcf /backup/backup.tar.gz /dbdata

恢复数据:

创建一个新容器,并用-v参数挂载本地的备份目录,然后执行解压操作,将备份文件解压至/dbdata目录。

  • Step1: 创建新容器dbdata2
docker run -it -v /dbdata --name dbdata2 centos:6 /bin/bash 
  • Step2: 恢复
docker run -it --volumes-from dbdata2 -v /backup:/backup centos  tar xf /backup/backup.tar.gz  

Docker Volume命令

  • 查看主机上现有的数据盘
docker volume ls 
  1. 默认情况下,在删除容器时,docker并不会删除其数据盘,查看没有容器在使用的数据盘方法如下:
docker volume ls -f dangling=true
  1. 如果想要删除没有使用的数据盘,使用如下指令:
docker volume rm VOLUME_NAME
  1. 删除掉容器时,同时删掉数据盘,则使用:
docker rm -v container_name
  • 检查一个或多个数据卷的详细信息,包括数据卷的名称、驱动程序、挂载点等信息。
docker volume inspect my-volume
  • 删除所有未被挂载的数据卷。
docker volume prune
  • 删除一个或多个数据卷,可以指定数据卷名称或ID
docker volume rm my-volume
  • 创建volume
docker volume create my-volume

序、挂载点等信息。

docker volume inspect my-volume
  • 删除所有未被挂载的数据卷。
docker volume prune
  • 删除一个或多个数据卷,可以指定数据卷名称或ID
docker volume rm my-volume
  • 创建volume
docker volume create my-volume

猜你喜欢

转载自blog.csdn.net/qq_43714097/article/details/129917596