基于Volume的互联

为什么需要Volume



docker文件系统是分层的,下面的是全部是只读的,最上面的是可写层,容器中的进程如果修改了某个文件,比如修改了下层的某个文件,其实是在最顶层复制下层文件,进行修改,然后覆盖原来的文件,原来的文件就隐藏了。

运行时的容器是镜像叠加一个可写层



docker的存储有两种

一种是镜像,

/var/lib/docker/graph 存放本地Image里的分层信息(记录了镜像有那些层,每一层的父层,每一层的大小等)

上图的GraphDB是一个数据库,存储分层之间的关系(每一层的上一层)

/var/lib/docker/devicemapper/devicemapper/data 存储了Image与Container的二进制数据文件(greph中的数据)

/var/lib/docker/devicemapper/devicemapper/metadata 存储了相关元数据

du -h /var/lib/docker/devicemapper/devicemapper/data
(命令:显示文件或目录的大小 -h 以k M G 为单位增加可读性)
3G
ls -al /var/lib/docker/devicemapper/devicemapper/data
(-a列出目录下的所有问价,包括隐藏的.文件 -l列出文件的详细信息)
100G

文件的大小随着实际存储增大而增大,100g是虚拟的,最多放100g



graphDeiver用来存储graph的信息。镜像的保存以及驱动都会通过GraphDriver来获取数据

Aufs driver是Docker最早支持的driver,但是aufs只是Linux内核的一 个补丁集,代码质量不高,被限制纳入linux内核,

Device mapper是Linux 2.6内核中提供的一种从逻辑设备到物理设备 的映射框架机制,是LVM2的核心,支持块级别的copy on write特性,文件系统之下的,系统很强。

VFS虚拟文件系统的最大缺陷是不支持copy on write特性,每层都是 一个单独的目录,如果新增一个child层,则需要将父级层镜像文件 一并复制到新目录(基本上不会用)

btrfs 非常快,采用btrfs的文件系统级的快照能力来实现layer分层功 能,缺点是仍然在进化中,还不够成熟,特别是大量写操作的压力下(试验阶段)

目前,除少数版本如Ubuntu,Docker基本运行在Devicemapper基础上



原来/var/lib/docker/devicemapper/devicemapper/data 对它进行写操作,所有的容器的信息都在这里,单一文件,操作很大。

volume:宿主机上的文件夹映射到容器上,直接对文件夹进行操作,跟普通进程写本地文件没什么区别

高频操作:1.日志2.数据库类

如何使用

docker run --rm=true -it -v /test:/soft java /bin/bash
冒号":"前面的目录是宿主机目录,后面的目录是容器内目录

-v /leader 在根目录下关联目录

注意:

一、容器目录不可以为相对路径

二、宿主机目录如果不存在,则会自动生成

三、宿主机的目录如果为相对路径呢?所谓的相对路径指是/var/lib/docker/volumes/

四、如果只是-v指定一个目录,这个又是如何对应呢?它不是相对路径的目录名,而是随机生成的一个目录名

更多或者不解请参考:http://www.cnblogs.com/ivictor/p/4834864.html

docker inspect 获取镜像/容器的元数据
语法:docker inspect [OPTIONS] NAME|ID [NAME|ID...]

linux中挂载磁盘都称为mount

执行了docker inspect命令后会出现一堆json格式的数据,找到其中的:

"Mounts": [
            {
            	“name”:“xxxxxx”(名称)
                "Source": "/root/work/docker",(宿主机中的目录)
                "Destination": "/root/hzbtest",(容器中的目录)
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
       mkdir /root/work/docker/a
       进入docker容器
       cd /root/hzbtes
       ls
       发现有a目录

两种:

1.docker run --rm=true -it -v /leader java /bin/bash

2.docker run --rm=true -it -v /storage /leader java /bin/bash(/storage宿主机目录/leader容器目录)

第一种在宿主机自动创建相应的的_data目录,是属于容器的,删除容器,主机的目录就不存在了

第二种在宿主机的目录是数据宿主机的,删除容器,主机的目录还是存在的。

第二种在build的时候不能用,因为images是全球通用的,别人并不知道你本地宿主机的目录,这样docker的可移植性就没有了。

可以多个容器中的Volume只想同一个本机目录,实现基于文件的共享访问。

mkdir报错

报错 permissioin denied

解决:

docker run --privileged=true

基于Volum互联,可以解决跨主机的共享问题。



基于数据容器的单主机互联:

docker run --rm=true --privileged=true --volumes-from=3d1ada481637 -it java /bin/bash

–volumes-from=3d1ada481637 访问挂载在另一个容器的volume

上面提到的这种方式docker run --rm=true -it -v /leader java /bin/bash,别的容器是不知道真实的宿主机生成的路径的,因为宿主机的路径是属于容器的,所以只能通过–Volume-from来进行访问,这是它真正的含义。

基于link的互联(网络互联模式)

小例子:

创建一个mysql容器

docker run --rm=true --name=mysqlserver -e MYSQL_ROOT_PASSWORD=123456 mysql



进入mysql容器,查看hosts文件



发现ip地址绑定172.17.0.12,本机的本容器能够访问这个ip,其他的容器也能够访问这个容器。

docker run --rm=true -it java curl 172.17.0.1:3306

为了访问端口3306 用自带的curl来连接mysql,下面乱码出错,表明了已经互通了



很多人认为只有link才能让容器互通,其实:

默认情况下容器是直接互联的

docker默认是允许container互通,通过-icc=false关闭 互通。一旦关闭了互通,只能通过-link name:alias命令 连接指定container.(隔离性)

link最大的好处:

– link redis:db的别名,会在/etc/hosts中生成对应的ip映射

容器重启后ip会变,但是dns的hostname是不会变的,link是直接映射hostname



语法:

--link=myjaveserver:serverM1
 myjaveserver:目标容器(需要连接的容器)server(给一个主机名(dns名称)用来代替ip进行访问)
docker run --link=myjaveserver:serverM1      -it java /bin/bash

然后分别对myjaveserver和serverM1进行ping发现都能ping通。

隔离端口,开放指定端口

 /usr/bin/docker daemon --icc=false --iptables=true

docker run --rm=true --link=mysqlserver:myserver -it java /bin/bash

iptables-save



iptables中出现上面的规则,大概意思:原地址172.17.0.4,目的地址172.17.0.1,进docker0 出docker0,tcp连接,开放3306端口,

** link在这里的作用就是来开放置顶的3306的端口**



上图中ping是ping不通的,因为我们已经隔离了,但是curl 3306是没问题的,就是link的作用。

跨主机的link

在实际中几乎用不到

基于网络的互联

最简单的互联方式



docker run --rm=true --name=mysqlserver -p 8066:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql



发现本地多了docker proxy进程

docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8066 -container-ip 172.17.0.5 -container-port 3306

基于宿主机的网络

docker run --rm=true --net=host --name=mysqlserver -e MYSQL_ROOT_PASSWORD=123456 mysql

–net=host不会为自己产生虚拟的网络空间,会共享主机的网络。



运行了上面的命令后,容器的ip地址就是主机的ip地址

优点:直接用主机的访问空间,访问效率很高

缺点:只能启动一个mysql,因为端口被占用了,可以新开一个端口,但是不好解决。,物理机器的端口是有限的,且不能重复占用。

容器共用一个ip网络

docker run --rm=true --name=mysqlserver -e MYSQL_ROOT_PASSWORD=123456 mysql

docker run --rm=true --net=container:mysqlserver java ip addr

–net=container:mysqlserver :共享mysqlserver 的网络,不会自己创建网络。

关键:



共用一个网络,这个时候访问mysqlserver中的3306.直接通过localhost进行访问即可。

好处:



这样在同一个网络中进行访问,速度是非常快的,且有时候我们希望一个容器一个进程,互不干扰,彼此隔离,且不需要给每个容器分配ip。

Docker系列(四):Docker容器互联的更多相关文章

  1. 详解Docker 端口映射与容器互联

    详解Docker 端口映射与容器互联 1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行 ...

  2. docker系列四之docker镜像与容器的常用命令

    docker镜像与容器的常用命令 一.概述   docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人 ...

  3. Docker系列06—基于容器制作镜像并上传到Docker Registry

    本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...

  4. Docker 系列三(容器管理).

    一.运行容器 1.基于镜像新建一个容器并启动 : tomcat:8.0 -i:交互式操作 -t:终端 -rm:容器退出后随之将其删除,可以避免浪费空间 -p :端口映射 -d :容器在后台运行 指明了 ...

  5. Docker系列教程05 容器常用命令

    https://mp.weixin.qq.com/s?__biz=MzI4ODQ3NjE2OA==&mid=2247483890&idx=1&sn=2721f08624e6de ...

  6. docker——端口映射与容器互联

    在生产环境中,单个服务往往是独立的,但是服务与服务之间往往是相互依赖的,这样对于容器来说,容器之间就需要相互访问.除了网络访问之外,docker还提供了另外两种方式来满足服务的访问. 一:允许映射容器 ...

  7. Docker 数据卷与容器互联

    Docker是基于Go语言实现的开源容器项目,Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  8. Docker 系列四(自定义仓库).

    一.Docker hub 交互 Docker hub 是 Docker 官方维护的一个公共仓库,大部分需求都可以通过在 Docker hub 中直接下载镜像来完成.接下来,来看一下怎么与 Docker ...

  9. Docker系列08:容器监控

    1 监控解决方案 cadvisor+influxdb+grafana cAdvisor:Google开源的工具,用于监控Docker主机和容器系统资源,通过图形页面实时显示数据,但不存储:它通过宿主机 ...

随机推荐

  1. 图(graph)

    一.非线性结构:图 图由顶点集V,集合规模为n,在n个顶点之间可能存在对应关系,我们用连边来描述这种,即边E,规模为e. 邻接关系:顶点与顶点之间的关系:关联关系:顶点与它相连的边的关系.序列结构(v ...

  2. 【POJ3155】生活的艰辛Hard Life

    题面 Description ADN公司内部共 n个员工,员工之间可能曾经因为小事有了过节,总是闹矛盾.若员工u和员工 v有矛盾,用边(u, v)表示,共 m个矛盾.最近,ADN公司内部越来越不团结, ...

  3. 初识 SpringData - JPA(一)

    概念 什么是 JPA JPA(Java Persistence API ): Java 持久化规范的 API .是 SUN 官方推出的一套基于 ORM 的规范,内部是由一系列的接口和抽象类构成.其提供 ...

  4. 最大字段和--GSS1 MUSHROOM ORZ

    过于naive了= =作为一个知识点总结一下算了.主要就是合并.对于一个区间的最大字段和,可以分别事下面的两个区间的子段和,或者事左边的右边加右边的左边.然后搞一下 = = #include < ...

  5. 2019年12月12日英语学习-Will I Or Won't I ?

    这节英语课上的内容没记住多少东西,觉得这个主题太枯燥了,不过整堂课和外教沟通交流还是不错的,因为这节课就我一个学生.给我了充分的机会去张嘴交流互动. 也没记住什么东西,不知道写什么.只记住将要决定做某 ...

  6. NX二次开发-UFUN打开信息窗口UF_UI_open_listing_window()

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); //方法1(uc1601) uc1601();// ...

  7. Eclipse+Maven创建webapp项目 及部署在tomcat上

    1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显示创建maven项目的窗口,勾选如图所示,Create a sim ...

  8. tarjan模板 强联通分量+割点+割边

    // https://www.cnblogs.com/stxy-ferryman/p/7779347.html ; struct EDGE { int to, nt; }e[N*N]; int hea ...

  9. LA 3263 /// 欧拉定理 oj21860

    题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...

  10. Android笔记之调用系统相机拍照

    参考链接: 拍照  |  Android Developers, Android相机拍照方向旋转的解决方案:ExifInterface - 简书 Demo链接:https://pan.baidu.co ...