Docker-数据卷和数据容器卷
默认情况下,在容器内创建的所有文件都存储在可写容器层中。这意味着:
- 当该容器不再存在时,数据不会持久存在,并且如果另一个进程需要,则可能很难从容器中获取数据。
- 容器的可写层紧密耦合到运行容器的主机。您无法轻松地将数据移动到其他位置。
- 写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供联合文件系统。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能 。
Docker有三种方式可以在宿主机中持久化存储文件:
卷存储(Volume)在由Docker(
/var/lib/docker/volumes/在Linux上)管理的主机文件系统的一部分中。非Docker进程不应修改文件系统的这一部分。卷是在Docker中保留数据的最佳方式。绑定挂载(bind mount)可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时修改它们。
tmpfs mount仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。

使用数据卷
1. 创建卷
docker volume create my-vol
2. 查看卷
docker volume list
3. 查看卷的详细信息
docker inspect my-vol
[
{
"CreatedAt": "2019-03-14T17:10:04+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
4. 删除卷
docker volume rm my-vol
5. 启动一个含有卷的容器
如果卷myvol2不存在,则会自动创建,并且挂载在容器的/app目录下
$ docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
也可以简写成
$ docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
删除容器中含的卷
$ docker container stop devtest $ docker container rm devtest $ docker volume rm myvol2
6. 启动一个包含卷的服务
$ docker service create -d \
--replicas=4 \
--name devtest-service \
--mount source=myvol2,target=/app \
nginx:latest
7. 创建一个只读卷
$ docker run -d \
--name=nginxtest \
-v nginx-vol:/usr/share/nginx/html:ro \
nginx:latest
8. 在远程机器上创建卷,并挂载
在Docker主机上,安装vieux/sshfs插件:
$ docker plugin install --grant-all-permissions vieux/sshfs
使用驱动程序创建卷
docker volume create --driver vieux/sshfs \
-o sshcmd=root@192.168.0.10:/tmp/test \
-o password=mypassword \
sshvolume
在容器中挂载卷
$ docker run -d \
--name sshfs-container \
--volume-driver vieux/sshfs \
--mount src=sshvolume,target=/app,volume-opt=sshcmd=root@192.168.0.10:/tmp/test,volume-opt=password=mypassword \
nginx:latest
备份,迁移,恢复数据卷
备份
1. 创建一个名为dbvolume的数据卷并挂载在名为dbstore容器的/dbdate目录下。
docker run -d --name dbstore -v dbvolume:/dbdata alpine sh
2. 在dbvolume卷中写入数据
[root@node2 ~]# docker exec -it dbstore sh
/ # echo hello > /dbdata/test.txt
/ # exit
3. 备份容器中的数据卷
[root@node2 ~]# docker run --rm --volumes-from dbstore -v $(pwd):/backup alpine tar cvf /backup/backup.tar /dbdata
tar: removing leading '/' from member names
dbdata/
dbdata/test.txt
--volumes-from 挂载dbstore容器中的数据卷到新建的容器中,注意挂载的目录和容器dbstore位置相同,都为/dbdata
-v $(pwd):/backup 将宿主机的当前目录挂载到新建容器的/backup目录下
tar cvf /backup/backup.tar /dbdata 在新建的容器中将目录/dbdata打包到/backup目录下,因为backup目录映射为宿主机的当前目录,所以本地目录生成备份。
恢复
1. 创建一个新容器dbstore2,并挂载一个名为volume_restore的卷
docker run -v volume_restore:/dbdata --name dbstore2 alpine sh
2.从容器dbstore2中挂载卷
docker run --rm --volumes-from dbstore2 -v $(pwd):/backup alpine sh -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
数据卷容器
如果容器之间需要共享一些持续更新的数据,最简单的方式就是是用户数据卷容器,数据卷容器就是一种普通容器,专门提供数据卷供其它容器挂载使用。
创建数据卷容器dbdata
[root@wls12c /]$ docker run -it -v dbdata:/dbdata --name dbdata centos
[root@07e4ad5587e1 /]
创建db1和db2两个容器,并使用--volumes-from挂载dbdata容器中的数据卷
[root@wls12c /]$ docker run -it --volumes-from dbdata --name db1 centos
[root@wls12c /]$ docker run -it --volumes-from dbdata --name db2 centos
这样三个容器任何一个容器在该目录下写入,其它容器都能看见。
创建自动删除匿名卷的容器
挂载在/foo目录下的匿名卷将会被自动删除,awesome却不会
docker run --rm -v /foo -v awesome:/bar busybox top
删除所有未被使用的卷
docker volume prune
使用绑定数据卷(bind mount)
使用-v可以挂载一个本地的目录到容器中作为数据卷。如果将bind-mount绑定到容器上的非空目录中,则会隐藏目录的现有内容。
下面将宿主机的当前目录下的target目录挂载到容器的/app目录下
docker run -d \
-it \
--name devtest \
-v "$(pwd)"/target:/app \
nginx:latest
也可以使用--mount参数挂载
-v
$ docker run -d \
-it \
--name devtest \
--mount type=bind,source="$(pwd)"/target,target=/app \
nginx:latest
Docker-数据卷和数据容器卷的更多相关文章
- 聊聊Docker数据卷和数据卷容器
当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持, [数据卷] 文件是数据持 ...
- Docker 数据卷和数据卷容器
1.本节课主要讲解如何在Docker内部及容器之间管理数据.容器中管理数据主要有两种方式:数据卷(Data volumes)数据卷容器(Data volume containers) 2.数据卷:是一 ...
- docker卷挂载与容器内外互相拷贝数据
一.宿主机与容器的挂载 docker可以支持把一个宿主机上的目录挂载到镜像里.命令如下: docker run -it -v /mydownload:/download nginx:v1 /bin/b ...
- Docker数据卷和数据卷容器
是什么 数据卷设计的目的,在于数据的永久化,他完全独立于容器的生存周期,因此,Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制对容器引用的数据卷进行处理.类似我们Redis ...
- 1.docker介绍、命令、容器、镜像、数据卷、Dockerfile、常用软件安装、推送阿里云
一.docker介绍 1.docker是什么 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各 ...
- Docker小白到实战之容器数据卷,整理的明明白白
前言 上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失.从隔离性的角度来看,数据就应该和容器共存亡:但 ...
- Docker系列(16)- 容器数据卷
什么是容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像 数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!新增一个需求:数据可以持久化 MySQL,容器删了等于删库跑路!新增一个 ...
- Docker 使用指南 (四)—— 数据卷的使用
一.数据卷的使用 有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据.数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用 ...
- docker--数据卷与数据卷容器
docker--数据卷与数据卷容器 1.数据卷: 创建一个volumes的文件夹: [root@docker01 /]# mkdir volumes [root@docker01 /]# ls bin ...
随机推荐
- ecshop后台增加模板页的方法
CShop的动态模板机制是一个非常灵活的系统,管理员可以在后台根据自己的要求调整模板模块的显示位置.本文详细讲解了如何修改ECSHOP内部结构使得用户可以添加自己的模板页从而方便灵活的使用系统自带的模 ...
- 第一课: iOS入门
xcode几个项目模板的说明: http://blog.csdn.net/chang6520/article/details/7926444 1. single view app: xcode中的st ...
- ACM题目————棋盘问题
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- I'm Telling the Truth(二分图)
.I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- LTE 切换过程中的数据切换
http://blog.sina.com.cn/s/blog_673b30dd0100j4p4.html LTE中的切换,根据无线承载(Radio Bearer)的QoS要求的不同,可以分为无缝切换( ...
- Camera 图像处理原理分析
1 前言 做为拍照手机的核心模块之一,camera sensor效果的调整,涉及到众多的参数,如果对基本的光学原理及sensor软/硬件对图像处理的原理能有深入的理解和把握的话,对我们 ...
- php 修改、增加xml结点属性的实现代码
php修改xml结点属性,增加xml结点属性的代码,有需要的朋友可以参考下 php 修改 增加xml结点属性的代码,供大家学习参考.php修改xml结点属性,增加xml结点属性的代码,有需要的朋友,参 ...
- NET MVC1项目升级到MVC2最简单的方法
NET MVC1项目升级到MVC2最简单的方法 把MVC1项目升级到MVC2,最简单的做法如下: 新建MVC2项目 新建一个MVC2项目,把原来MVC1的项目文件全部拷贝到新建MVC2项目目录里,依照 ...
- linux下的./本质
不知道从什么时候对于./的感觉就是这是一条运行命令,因为你要运行某个文件的时候就用./ 但是这个显然是错误的./表述的是当前目录 .就是表示当前目录的.至于为什么运行当前目录下的 文件需要加上./原因 ...
- POJ 3061 Subsequence 尺取法
转自博客:http://blog.chinaunix.net/uid-24922718-id-4848418.html 尺取法就是两个指针表示区间[l,r]的开始与结束 然后根据题目来将端点移动,是一 ...