【云原生|Docker】08-Docker存储
文章目录
- 【云原生|Docker】08-Docker存储
- 简介
- Docker存储
- 挂载方式
- 挂载方式介绍
- 挂载主机目录
- 数据卷容器
- 特性
- Docker存储示例
- 挂载主机目录
- Type: bind
- Type: volume
- 总结
- 数据卷容器
- 利用数据卷容器迁移数据
- 备份数据:
- 恢复数据:
- Docker Volume命令
简介
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: 备份数据
- 先创建一个容器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
- 默认情况下,在删除容器时,docker并不会删除其数据盘,查看没有容器在使用的数据盘方法如下:
docker volume ls -f dangling=true
- 如果想要删除没有使用的数据盘,使用如下指令:
docker volume rm VOLUME_NAME
- 删除掉容器时,同时删掉数据盘,则使用:
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