管理docker中的数据

官方文档:https://docs.docker.com/storage/

默认情况下,在容器内创建的所有文件都存储在可写容器层中。意味着:

1.当容器不存在时,数据不会持久存在,并且如果另一个进程需要,则可能很难从容器中获取数据

2.容器的可写层紧密耦合到运行容器的主机。无法将数据移动到其他位置

3.写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用linux内核提供联合文件系统,会降低性能。

卷volume

是docker管理的主机文件系统的一部分。/var/lib/docker/volumes。是docker中保留数据的最佳方式。非docker进程不应该修改文件系统的这部分。

由docker创建和管理。

//显示创建卷
docker volume create

或者docker可以在容器或服务创建期间创建卷。

创建卷时,它存储在docker主机上的目录中,将卷装入容器时,此目录是装入容器的目录。

给定的体积可以同时安装到多个容器中,当没有正在运行的容器正在使用卷时,该卷仍gongdocker使用,并且不会自动删除,可以手动删除:

// 手动删除卷
docker volume prune

 装入卷时,可能会命名或匿名,匿名卷在首次装入容器时未给出明确的名称,docker提供了一个随机名称,该名称在给定的docker主机中保证是唯一的。

卷还支持卷驱动程序,这些驱动程序允许将数据存储在远程主机或云提供的程序上。

适用场景

1.在运行多个容器之间共享数据。如果未显示创建,则会在第一次将其装入容器时创建卷。当该容器停止或移除时,该卷仍然存在,多个容器可以同时安装相同的卷,可以是读写也可以是只读。仅在明确删除卷的时候才会删除。

2.当docker主机不能保证就有给定的目录或文件时,卷可以将docker主机的配置与容器运行时分离

3.当想要把数据存储在远程主机或云上而不是本地存储的时候使用卷

4.当需要将数据从一个docker主机备份,还原或者迁移到另一个docker主机时。可以用卷停止容器,然后备份卷的目录。

优点

与绑定挂载相比,更易于备份或迁移。

可以使用docker cli或docker api管理

适用于Linux和windows

可以在多个容器之间共享卷

创建和管理

// 创建卷
docker volume create my-vol
// 卷清单
docker volume ls
// 检查卷
docker volume inspect my-vol
// 删除卷
docker volume rm my-vol

启动有卷的容器

如果启动具有尚不存在的卷的容器,docker会创建卷。

-mount方式启动卷

// 将卷my-vol装入/app/容器中
docker run -d --name devtest --mount source=my-vol,target=/app nginx:latest

 -v方式启动

docker run -d --name devtest -v my-vol:/app nginx:latest

 停止容器并删除卷

docker container stop devtest
docker container rm devtest
docker volume rm my-vol

使用卷启动服务

启动服务并定义卷时,每个服务容器都是以自己的本地卷。如果使用local卷驱动程序,则所有容器都不能共享此数据。但某些卷驱动程序支持共享存储。

// 启动nginx具有四个副本的服务,每个副本使用一个名为本地卷myvol.
docker servicecreate -d --replicas=4 --name devtest-service --mount source=myvol,target=/app nginx:latest

验证服务正在允许

docker service ps devtest-service

 删除服务,并停止其所有任务(删除服务不会删除该服务创建的任何卷)

docker service rm devtest-service

创建卷服务

// 不支持-v或--volume标志。将卷安装到服务的容器中时,必须使用--mount标志
docker service create

 使用容器填充卷

如果启动一个创建新卷的容器,并且容器在要挂载的目录中具有文件或目录(如/app/),则将目录的内容复制到卷中。然后容器安装并使用该卷, 而使用该卷的容器也可以访问预先填充的内容。

// 启动一个nginx容器,并nginx-vol使用容器/usr/share/nginx/html目录的内容填充新卷
// --mount模式
docker rn -d --name=nginxtest --mount source=nginx-vol,destination=/usr/share/nginx/html nginx:latest

// -v模式
docker run -d --name=nginxtest -v nginx-vol:/usr/share/nginx/html nginx:latest

使用只读卷

 多个容器可以安装相同的卷,并且可以为其中一些容器以读写方式或者只读方式挂载。

--mount模式

docker rn -d --name=nginxtest --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly nginx:latest

-v模式

docker rn -d --name=nginxtest -v nginx-vol"/usr/share/nginx/html:ro nginx:latest

在机器之间共享数据

在构建容错程序时,可能需要配置同一服务的多个副本才能访问相同的文件

https://docs.docker.com/storage/volumes/

备份、还原或迁移数据卷

备份容器

// 启动新容器,并从dbstore容器装入卷。将本地主机目录挂载为/backup,将dbdata卷内容的命令传递给目录中的backup.tar文件/backup
docker run --rm --volumes dbstore -v $(pwd):/backup ubuntu tar cvs /backup/backup.tar /dbdata

从备份还原容器

建立dbstore2的新容器

docker rn -v /dbdata --name dbstore2 ubuntu /bin/bash

 解压缩新容器的数据卷中的备份文件

docker rn -rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

删除所有卷

docker volume prune

绑定挂载

可以存储在主机系统的任何位置,甚至可以说重要的文件系统或目录。docker主机或docker容器上的非docker进程可以随时修改他们。

适用场景

1.将配置文件从主机共享到容器。是docker默认通过/etc/resolv.conf从主机安装到每个容器中来为容器提供dns解析的方式。

2.在docker主机时的开发环境金额容器之间共享源代码或构建工作。如,可以将maven target/目录挂载到容器中,每次在docker主机上构建maven项目时,容器都可以访问重建的工作。

3.当docker主机的文件或目录结构保证与容器所需的绑定安装一致时。

注意

如果将空卷装入容器中存在文件或目录的目录中,则会将这些文件或目录复制到卷中。如果启动容器并指定尚不存在的卷,则会创建一个空卷。(预先填充)

如果将绑定装载或非空卷装入已存在文件或目录的容器,这些文件或目录会被装载覆盖。这些文件或目录不会被移除或更改,但在装入绑定装入或卷时无法访问。

tmpfs挂载

仅存储在主机系统的内存中,永远不会写入主机系统的文件系统,不会保留在磁盘上。可以在容器的生命周期中由容器使用来存储非持久状态或敏感信息。

猜你喜欢

转载自blog.csdn.net/u010918487/article/details/89417157
今日推荐