docker 存储卷 Volumes
一,docker容器面临的困境:
- 容器运行中产生的数据,是放到容器栈的最顶层,当容器停止并被删除后,这些数据就被删除了。
- docker采用COW(写时复制)策略,导致性能低下。比如有个mysql容器,会有频繁的I/O处理。
二,解决策略:给容器外挂一个存储文件系统,它就叫docker存储卷(Volumes),它独立于容器的生命周期,删除容器时不会删除卷(让然也可以做到,删除容器的时候也删除卷,但没有这么干的)。
让容器里面的某个目录绑定到宿主机的某个目录。

容器写数据时,写到/下的数据,最后被写到了容器的可读写层;写到/data下的数据,最后被写到了宿主机的/data目录下了。如下图:

下图的宿主机A,B,C是文件系统NFS的客户端。宿主机A的文件目录A,宿主机B的文件目录B,宿主机C的文件目录C,都是访问NFS上的同一个目录。
使用docker存储卷功能,让宿主机A上运行的mysql容器,产生的数据目录,绑定到宿主机A的文件目录A,所以当由mysql容器产生的数据,就存放到了宿主机A的文件目录A上了,进而就存到到了NFS上了。
当宿主机A上运行的mysql容器被删除了,数据还是在的,存在NFS上了。
当在宿主机B或者宿主机C上运行刚才那个mysql容器,也让产生的数据目录,绑定到宿主机B或者宿主机C,可以从NFS上可以拿到数据,所以数据和在宿主机A上运行是一样的。
这就给运维提供了极大的便利,容器可以随便部署到集群里的任何机器上了。

可以用【存储】,【状态】来划分4个象限。
nginx只作为反向代理服务器,所以它没有状态也不需要存储。

三,docker存储卷有2种策略,都是使用-v选项。
bind mount volume:手动指定宿主机目录。
命令:
docker run -v HOSTDIR:CONTAINERDIR# docker run --name b1 -it --rm -v /tmp/html:/data busybox:latest
docker-managed volume:由docker自己决定宿主机目录。
命令:
docker run -v CONTAINERDIR# docker run --name b1 -it --rm -v /data busybox:latest
我们不知道被关联的宿主机的目录是啥,使用
docker inspect b1,找到【Mount】里的【Source】,就可以看到了。但是你下次再启动容器是,关联的目录也会变化。也可以看到Volumes。
# docker inspect b1
"Mounts": [
{
"Type": "volume",
"Name": "2eeb1bdee5c83a304d101a98b06430af3aff27a578ad38c7e23423f317db9063",
"Source": "/var/lib/docker/volumes/2eeb1bdee5c83a304d101a98b06430af3aff27a578ad38c7e23423f317db9063/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Volumes": {
"/data": {}
},
使用:
docker inspect -f {{.Mounts}} b1,也可以看到。注意大括号里的key是区分大小写的。

四,活用volume
让2个容器绑定到宿主机的同一个目录,以达到2个容器的通信。
# docker run --name b1 -it --rm -v /tmp/html:/data busybox:latest
# docker run --name b2 -it --rm -v /tmp/html:/data2 busybox:latest
2个容器都绑定到了宿主机的/tmp/html上了。
当另一个容器想和某个容器绑定到宿主机的同一个目录时,但是又不知道宿主机的目录,这时,可以让这个容器直接使用某个容器的volume,这样一来,就不用知道宿主机的目录了。
命令:
docker run --volumes-from b1# docker run --name b2 -it --rm --volumes-from b1 busybox:latest
volume和joined containers(参考:二,host章节 )一起使用,创建nginx容器和tomcat容器,共享base容器的网络空间和volume。

找一个容器,作为基础,它使命是:
- 指定宿主机的目录
- 提供统一的对外网络接口,外部客户端直接可以访问nginx服务,但是看不到tomcat
- nginx和tomcat使用lo(127.0.0.1)通信。
# docker run --name base -it -v /tmp/html:/data busybox:latest
启动nginx容器:
--network container:base --volumes-from base# docker run --name nginx -it --rm --network container:base --volumes-from base busybox:latest
启动tomcat容器:
--network container:base --volumes-from base# docker run --name tomcat -it --rm --network container:base --volumes-from base busybox:latest
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
docker 存储卷 Volumes的更多相关文章
- Docker系列05—Docker 存储卷详解
本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...
- 6、Docker存储卷
Why Data Volumes? 来自马哥教育 Data volumes Volume types 绑定挂载卷:在宿主机和容器上各指明绑定路径才能进行绑定. docker管理卷:在容器内指定挂载 ...
- Docker存储卷(V18.X)
简介 介绍 Docker的存储卷称之为volume,本质上容器上的一个或者多个目录,而这些目录绕过了联合文件系统,与宿主机中的目录或者其他容器目录进行了绑定关系,这种绑定关系可以看作Linux的mou ...
- Docker存储卷
六.Docker 存储卷(volume) COW:写时复制 Bind mount volume:手动mount绑定的卷 # docker run --name centos-3 -it -v /dat ...
- Docker存储卷篇
Docker存储卷篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.写时复制(COW)机制 所谓写时复制的效果如上图所示: Docker镜像由多个只读层叠加而成,启动容器 ...
- Docker 学习6 Docker存储卷
一.什么是存储卷 二.为什么要用到数据卷 三.数据卷是怎么被管理的 四.存储卷种类 五.在容器中使用存储卷 1.只声明容器路径 [root@localhost docker]# docker run ...
- 5.Docker存储卷
一.概述 1.Docker底层存储机制 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层. 如果运行中的容器修改了现有的一个已经存在的文件,那 ...
- Docker系列03—Docker 存储卷
一.存储卷介绍 1.1 背景 Docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层: 如果运行的容器修改了 ...
- 你必须知道的Docker数据卷(Volume)
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓 ...
随机推荐
- SpringCloud 脚手架
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...
- C# 网络编程之简易聊天示例
还记得刚刚开始接触编程开发时,傻傻的将网站开发和网络编程混为一谈,常常因分不清楚而引为笑柄.后来勉强分清楚,又因为各种各样的协议端口之类的名词而倍感神秘,所以为了揭开网络编程的神秘面纱,本文尝试以一个 ...
- SpringMVC的工作流程?Mybatis和hibernate区别?
SpringMVC的工作流程?1. 用户发送请求至前端控制器DispatcherServlet2. DispatcherServlet收到请求调用HandlerMapping处理器映射器.3. 处理器 ...
- 小程序如何实现rem
最近在学习小程序,要把html的代码转换成小程序界面,其中就遇到了rem的转换问题,但小程序不太兼容rem,不是不能用rem,而是没办法设置根元素的font-size,因为rem是相对于根元素的fon ...
- Iterable与Collection源码学习
接口 - Iterable<T> - 可迭代 描述 实现本接口的类,其对象可以被迭代.同时支持forEach语法 方法 Iterator<T> iterator() 类型 抽象 ...
- SSH框架之Spring第二篇
1.1 基于注解的IOC配置 既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样. 1.2 环境搭建 1.2.1 第一步:拷贝必备的jar包 需要多拷贝一个sp ...
- ionic + cordova安装指南
安装ionic --npm install -g ionic --cnpm install -g ionic --npm update -g ionic --cnpm update -g ionic ...
- 更改Dynamics 365 Customer Engagement本地部署的高级配置
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Custom Diagrams
Custom Diagrams https://github.com/dbeaver/dbeaver/wiki/Custom-Diagrams You can create custom ER dia ...
- 寝室远程连接室友mysql数据库
注意,本方法是适用于同一局域网下的远程连接 注意,本方法是适用于同一局域网下的远程连接 注意,本方法是适用于同一局域网下的远程连接 首先需要修改mysql数据库的相关配置,将user表中的host改为 ...