Docker之数据卷Volume(七)

一、简介

Docker数据卷(volume)机制。volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利。

1)volume在容器创建时就会初始化,在容器运行时就可以使用其中的文件

2)volume能在不同的容器之间共享和重用

3)对volume中数据的操作会马上生效

4)对volume中数据的操作不会影响到镜像本身

5)volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被删除

二、使用

1、创建volume

1)创建colume,命名为volume_first

docker volume create --name volume_first

2)在容器启动docker run或者创建新容器docker create时,也可以使用-v标签为容器添加volume

如:docker在启动时随机命名创建一个volume,并挂载在容器的/data下

docker run -d -v /docker/data docker.io/centos /bin/bash

Docker在创建volume的时候会在宿主机/var/lib/docker/volume/中创建一个以volume ID为名的目录,并将volume中的内容存储在名为_data的目录下

3)创建一个指定名字的volume,test_volume挂载到容器的/docker/data目录下

docker run -d -v test_volume:/docker/data docker.io/centos /bin/bash

4)查看本地的volume,可以看到我们刚刚创建的,第一个是以容器命名,第二个是以指定命名的方式命名

2、挂载volume

在使用docker run或docker create创建新容器时,可以使用-v标签为容器添加volume。用户可以将自行创建或由Docker创建的volume挂载到容器中,也可以将宿主机上的目录或者文件作为volume挂载到容器中

总结一下几种方式:上面已经用到了

1)第一种方式

docker volume create --name volume_first
docker run -d -v volume_first:/data docker.io/centos /bin/bash

2)第二种方式

docker run -d -v /data docker.io/centos /bin/bash

3)第三种方式,将宿主机上的目录挂载到容器中

docker run -d -v /docker/data:/data docker.io/centos

将宿主机的/docker/data文件夹作为一个volume挂载到容器中的/data。目录必须使用绝对路径,如果宿主机中不存在/docker/data目录,将创建一个新的目录。在/docker/data目录中的所有文件或文件夹可以在容器的/data目录下被访问。如果镜像中原本存在/data文件夹,该目录下的所有内容将被隐藏,以保持与宿主机中的目录一致。

4)在volume挂载时,还可以指定volume的权限,如只读ro,也可以在volume挂载时使用z和Z来指定该volume是否可以共享。Docekr中默认的是z,及共享volume;使用Z表示私有该数据卷;使用多个-v标签为容器添加多个volume

docker run -d -v /docker/data:/data:ro -v /docker/data2:/data2:z docker.io/centos

3、使用Dockerfile添加volume

1)vim Dockerfile

FROM docker.io/centos
VOLUME /test_data

2)制作成镜像

docker build -t volume_test .

3)启动镜像得到容器

docker run -d 7a5efba9248c

4)查看该容器的volume信息

docker inspect 972d67800f6130406290 |grep -A 11 Mounts

可以看到是挂载成功的

5)使用VOLUME指令添加多个volume

VOLUME ["/data1","/data2"]

6)与使用docker run -v不同的是,VOLUME指令不能挂载主机中指定的文件夹,这是为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的文件夹

7、Dockerfile的使用Volume的注意事项

如:vim Dockerfile

FROM docker.io/centos
RUN useradd lile
VOLUME /data
RUN mkdir /data && touch /data/file
RUN chown -R lile:lile /data

构建镜像:

docker build -t volume_test .

启动容器:

docker run -d 833a592f9d3f

查看该容器的卷信息:

docker inspect 95b3bf6ef72b15304f |grep -A 11 Mounts

查看挂载出来的文件是否授权并创建了一个文件,发现并没有

这是因为在Dockerfile中使用VOLUME指令之后的代码,如果尝试对这个volume进行更改,这些修改都不会生效。这是因为Dockerfile中除了From指令的每一行都是基于上一行生成的临时镜像运行一个容器,执行一条指令并执行类似docker commit的命令得到一个新的镜像,这条类似docker commit

命令不会对挂载的volumn进行保存

解决办法:

vim Dockerfile文件改为如下

FROM docker.io/centos
RUN useradd lile
VOLUME /data
CMD touch /data/file && chown -R lile:lile /data

CMD指令和ENTRYPOINT指令是在容器启动时执行。

8、共享volume

在使用docker run或docker create创建新容器时,可以使用--volumes-from标签使得容器与已有的容器共享volume

实验:

1)基于docker.io/centos镜像启动一个名叫container1的容器,并在这个容器上创建名为test1的数据卷挂载在容器的/data目录

docker run -d --name container1 -v test1:/data docker.io/centos

2)创建容器2,此容器与容器1共享数据卷test1,可以从该容器考到挂载信息确实是容器一的

docker run -d --name container2 --volumes-from container1 docker.io/centos

3)与多个容器共享volumn

docker run -d --name container1 -v test2:/data docker.io/centos
docker run -d --name container2 -v test2:/log docker.io/centos
docker run -d --name container3 --volumes-from container1 --volumes-from container2 docker.io/centos

得到的结果如下:

9、删除指定的volume

1)方法一 删除volume

docker volume rm first_volume

2)方法二 删除容器

docker rm -v container_name

10、备份、恢复和迁移volumn

备份:临时起一个容器与容器一共享数据卷,并且把当前路径挂载到容器的/backup ,这样打包后的文件便在当前路径了

docker run -d --volumns-from container1 -v $(pwd):/backup docker.io/centos tar cvf /backup/data.tar /data

恢复:

docker run -d --volumes-from a5e77a6d6e0f854eb -v $(pwd):/backup docker.io/centos tar xvf /backup/data.tar -C /

参考:《Docker容器与容器云》

原文地址:https://www.cnblogs.com/lemon-le/p/9238645.html

时间: 2024-08-09 16:24:58

Docker之数据卷Volume(七)的相关文章

你必须知道的Docker数据卷(Volume)

本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中: (1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中:(最常用的方式

docker 12 docker容器数据卷

数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ♣还有一种情况,就是希望容器之间能共享数据,这时也需要容器数据卷. ♣一句话,数据卷就是用来解决数据持久化和数据共享的. ♣卷就是目录或者文件,存在一个或者多个容器中,由docker宿主机挂载到容器上,但是不属于联合文件系统,因此能绕过联合文件系统提供一些用于持久化存储或者共享数据的特性. ♣卷的

(九) Docker 容器数据卷(挂载)

一.容器数据卷 docker 容器数据卷是容器在运行过程中持久化数据的一种方式,卷是目录或文件,存在于一个或多个容器中,由docker 挂载到容器,但不属于联合文件系统,因此能够绕过Union File System  提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据持久化,完全独立于容器的生命周期,因此docker不会在容器删除时,删除其挂载的数据卷. 特点: 数据卷可在容器之间共享或重用数据. 卷中的更改可以直接生效. 数据卷中的更改,不会包含在镜像中的更新. 数据卷的生命周期一直

5、docker容器数据卷

Docker容器数据卷 是什么 一句话:有点类似我们Redis里面的rdb和aof文件 能干嘛 容器的持久化 容器间继承+共享数据 数据卷 容器内添加 直接命令添加 命令 docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 查看数据卷是否挂载成功 容器和宿主机之间数据共享 容器停止退出后,主机修改后数据是否同步 命令(带权限) docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 DockerFile添加 根目录下新建mydocker文

Docker系列-第五篇Docker容器数据卷

1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data Volumes ) : 容器内数据直接映射到本地主机环境: 数据卷容器( Data Volume Containers ) : 使用特定容器维护数据卷. 一句话:有点类似我们Redis里面的rdb和aof文件 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的

docker中数据卷探究与总结

为实现持久化,docker引入了挂载数据卷的方法,以实现数据的可持久化.具体是以下三种:一.通过docker run命令命令:docker run -dit --name gerrit -p 9001:8080 -p 29419:29418 -v /home/docker/test.txt:/var/spool/cron/crontabs/root openfrontier/gerrit:2.15.3此时将宿主机的/data/mysql1挂载到容器的/var/lib/mysql下,这里需要注意的

docker之数据卷

docker的数据管理:    数据卷:        一个绕过UFS的特殊目录,可供多个容器使用.        特性:            1.可以在容器之间共享和重用            2.数据卷的修改会立即生效            3.更新数据卷不影响image            4.数据卷会一直存在,直到没有容器使用 方式1:创建数据卷            创建容器的时候使用-v CONTDIR 指定数据卷. 方式2:挂载宿主机的目录作为数据卷            创建

docker创建数据卷以及数据卷容器

docker容器管理有2中方式: 1:数据卷:类似Linux下目录挂载mount 2:数据卷容器:其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的 使用docker search xxx //xxx指的是搜索相应的镜像.搜索后根据自己需求进行pull 下载镜像 [email protected] :~# docker pull jdeathe/centos-ssh 查看pull后的镜像 [email protected] :~# docker images REPOSITORY    

Docker之数据卷和数据卷容器

数据卷是一个可供容器使用的特殊目录,可以在容器之间共享和重用,对数据卷的修改会马上生效,卷会一直存在直到没有容器使用,数据卷的使用类似于mount 数据卷容器就是一个普通的容器,可专门提供数据卷供其他容器挂载使用,可以在容器之间共享一些持续更新的数据 1:创建数据卷 利用镜像centos,创建一个名为tomcat的容器,并在后台以守护进程方式工作,且将本地的/b2b/目录挂在在新建立的tomcat容器的/test目录下 [email protected]:/home/zxl# docker ru