Docker存储资源类型

docker两种存储资源类型

  用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及到容器的数据管理。

(1)Data Volume (数据卷)

(2)Data Volume Dontainers --- 数据卷容器

Data volume 数据卷

  Data Volume 本质上是 Docker Host 文件系统中的目录或文件,使用类似与 Linux 下对目录或者文件进行 mount 操作。数据卷可以在容器之间共享和重用,对数据卷的更改会立马生效,对数据卷的更新不会影响镜像,卷会一直存在,直到没有容器使用。

Data Volume 有以下特点:

a)Data Volume 是目录或文件,而并非格式化的磁盘(块设备)。

b)容器可以读写 volume 中的数据。

c)volume 数据可以被永久的保存,即使使用它的容器已经销毁。

比如说我把根下面的目录挂给了容器

Data Volume的使用: 通过-v 参数格式为 <host path>:<container path>

a)运行一个容器,并创建一个数据卷挂载到容器的目录上

 docker run -dti -v /web centos:latest /bin/bash 

利用 centos:latest 的镜像运行一个容器,并在容器内创建一个数据卷挂载到容器的 /web 目录上

b)  运行一个容器,本地创建/date目录挂载到容器的/var/log/目录上(就是说把宿主机真是存在的目录映射、挂载给容器,这样就算你删掉这个容器,之前这个目录里的数据也会被保存下来,宿主机上的目录可以查看到,这就是容器怎么去做数据的存储)

docker run -dti -v /data:/var/log centos:latest /bin/bash

DataVolumeDontainers --- 数据卷容器

  如果用户需要在容器之间共享一些持续更新的数据,最简单的方法就是使用数据卷容器,其实数据卷容器就是一个普通的容器,只不过是专门用它提供数据卷供其他容器挂载使用。

Data Volume Dontainers使用:

a)创建一个名为 dbdata 的数据卷,并在其中创建一个数据卷挂载到 /dbdata

docker run -dti -v /dbdata --name dbser centos:latest 
--name 参数为给容器指定名字为dbser方便记忆

b)其他容器使用--volume-from 去挂载dbdata容器中的/dbdata数据卷

eg :

创建 db1&db2 两个容器, 并挂载 /dbdata 数据卷到本地

docker run -dti --volumes-from dbser --name db1 centos:latest

docker run -dti --volumes-from dbser --name db2 centos:latest

此时,容器 db1 和 db2 同时挂载了同一个数据卷到本地相同 /dbdata 目录。三个容器任何一个目录下的写入,都可以时时同步到另外两个

如何批量停止容器

for id in `docker ps -a | grep centos: | awk -F " +" '{print $1}'`;do docker stop $id;done

Docker网络介绍

大量的互联网应用服务需要多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合。

  docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络 docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务,在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网 络来访问容器内部的网络应用和服务的。

docker 安装时会自动在host上创建三个网络,我们查看一下docker网络:

docker network ls 

Docker--none网络

none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络

#首先先下载image busybox

docker search busybox

docker pull busybox

#查看网卡信息(这是没有指定网络为空的情况下)

docker run –it busybox /bin/sh

指定为空

docker run –it --network=none busybox /bin/sh

none 网络的应用

封闭的网络意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。

比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。

当然大部分容器是需要网络的,我们接着看 host 网络。

Docker host 网络

host 网络连接到 host 网络的容器,共享 docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 --network=host 指定使用 host 网络

docker run -itd --network=host busybox /bin/sh

在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host(宿主机) 的。host 网络的使用场景又是什么呢?

  直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,就可以选择 host 网络。 当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。

  Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进 行配置,比如管理 iptables。

Docker Bridge网络

docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定 --network,创建的容器默认都会挂到 docker0 上

当前 docker0 上只有一台网络设备,我们创建一个容器看看有什么变化

一个新的网络接口 veth429b8b 被挂到了 docker0 上,veth429b8b就是新创建容器的虚拟网卡。

进入刚才运行的容器查看网络,容器有一个网卡 eth0@if21

实际上 eth0@if21 和 veth429b8b 是一对 veth pair。

veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if21)在容器中,另一头 (veth429b8b)挂在网桥 docker0 上,其效果就是将 eth0@if21 也挂在了 docker0 上。

eth0@if21已经配置了 IP 172.17.0.3,为什么是这个网段呢? 看一下 bridge 网络的配置信息:

docker network inspect bridge

bridge 网络配置的 subnet 就是 172.17.0.0/16,并且网关是 172.17.0.1, 在docker0上:

容器创建时,docker 会自动从 172.17.0.0/16 中分配一个 IP,这里 16 位的 掩码保证有足够多的 IP 可以供容器使用。

创建 user-defined 网络(自定义网络)

我们可通过 bridge(网桥的驱动) 驱动创建类似前面默认的 bridge (网络的类型)网络

(1)利用bridge驱动创建名为my-net1网桥(docker会自动分配网段):

docker network create --driver bridge my-net1

(2)查看一下当前 host 的网络结构变化:

docker network ls

(3)查看容器my-net1网桥配置(bridge就是容器和网桥形成一对veth pair)

docker network inspect my-net1

(4)利用bridge驱动创建名为my-net2网桥(user-defined网段及网关)

docker network create --driver bridge --subnet 10.10.20.0/ --gateway 10.10.20.1 my-net2    

(5)启动容器使用新建的my-net2网络模式

docker run -it --network=my-net2 httpd     

(6)启动容器使用my-net2网络并指定ip(只有使用 --subnet 创建的网络才能指定静态 IP,如果是docker自动分配的网段不可以指定ip)

docker run -it --network=my-net2 --ip 10.10.20.100 httpd

(7)让我们已启动容器htt1连接到除它本身网络之外的网络(让现有的容器怎么连接另外的网络)

docker network connect my-net1 htt1

(8)使用--name指定启动容器名字,可以使用docker自带DNS通信,但只能工作在user-defined(用户自定义) 网络,默认的 bridge 网络是无法使用 DNS 的

docker run -itd --network=my-net2 --name=box1 busybox

docker run -itd --network=my-net2 --name=box2 busybox

(9)容器之间的网络互联

a). 首先创建一个 db 容器

 docker run -dti --name db centos:latest

b). 创建一个 web 容器,并使其连接到 db

 docker run -dti --name web --link db:dblink centos:latest

--link db:dblink实际是连接对端的名字和这个链接的名字,也就是和 db 容器建立一个叫做 dblink 的链接

c). 查看链接的情况

 docker ps –a

d). 使用 ping 命令来测试网络链接的情况

link的指定是单向的,不能反过来连

(10)容器端口映射(现在你的容器之间可以访问了,但是除容器之外的客户端到底是怎么访问到你服务的呢)

在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容 器内部的网络应用和服务的

当容器需要通信时,我们可以使用 -P (大) &&-p (小)来指定端口映射

-P : Docker 会随机映射一个  ~  的端口到容器内部开放的网络端口

-p :则可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器

支持的格式有

IP :HostPort : ContainerPort #:左边是宿主机端口,右边是容器端口

IP : : ContainerPort  #这样的话会在宿主机里随机开启一个端口,充当这个容器的固定端口

IP : HostPort :#我们把宿主机上的一个固定端口映射给容器随机开的一个端口

查看映射

docker port

a)映射所有接口地址,此时绑定本地所有接口上的 5000 到容器的 5000 接口, 访问任何一个本地接口的 5000 ,都会直接访问到容器内部

docker run -dti -p : centos:latest 

b)多次使用可以实现多个接口的映射

docker run -dti -p : -p : centos:latest 

c)映射到指定地址的指定接口 此时会绑定本地 192.168.4.169 接口上的 5000 到容器的 5000接口

docker run -dti -p 192.168.4.169:: centos:latest 

d) 映射到指定地址的任意接口 此时会绑定本地 192.168.4.169 接口上的任意一个接口到容器的 5000 接口

docker run -dti -p 192.168.4.169:: centos:latest 

e) 使用接口标记来指定接口的类型

docker run -dti -p 192.168.4.169::/UDP centos:latest 

(11)实验:通过端口映射实现访问本地的 IP:PORT 可以访问到容器内的 web

a)将容器80端口映射到主机8080端口

docker run -itd -p : --name http-test httpd   (注意,映射的时候不要指定环境变量)

b) 查看刚运行docker

docker ps

c) 进入容器

 docker exec –itd 7cbfa7375128  /bin/bash

d) 容器内部编辑网页文件 index.html ********

echo “hhhhhhhhhhhh” > /usr/local/htdocs/index.html

e)到宿主机上打开浏览器输入 IP:PORT 访问验证 http://192.168.4.170:8080

网络排排查命令:

iptables -t nat -L

ip r
tcpdump -i docker0 -n icmp  #抓包

tcpdump -i eth0 -n icmp

Docker存储和网络的更多相关文章

  1. docker存储与网络

    目录 Docker存储 挂载主机目录 创建一个数据卷 挂载一个宿主机目录作为数据卷 数据卷容器 创建一个数据卷容器 利用数据卷容器迁移数据 删除数据盘 Docker网络 简介 bridge网络 bri ...

  2. docker (2)---存储、网络(利用docker容器上线静态网站)

    一.docker底层依赖的核心技术 1.命名空间 (Namespaces) 2.控制组 (Control Groups) 3.联合文件系统 (Union File System) 4.Linux 虚拟 ...

  3. 理解Docker(8):Docker 存储之卷(Volume)

    (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...

  4. 理解Docker(7):Docker 存储 - AUFS

    (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...

  5. Docker存储

    前言 上一篇文章中简单总结了一下docke的基础使用方法,这次我来总结一下有关docker存储方面的相关知识.本文同样建立在CloudMan的系列教程之上,有兴趣的可以直接移步. 有些人可能觉得这个很 ...

  6. Docker跨主机网络——overlay

    前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...

  7. 6、Docker存储卷

    Why Data Volumes?  来自马哥教育 Data volumes Volume types  绑定挂载卷:在宿主机和容器上各指明绑定路径才能进行绑定. docker管理卷:在容器内指定挂载 ...

  8. Docker多主机网络

    网络术语概念 二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发 三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发.它解决了局域网中网段 ...

  9. docker——libnetwork插件网络功能

    从1.7.0版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现.剥离出来的独立容器网络项目叫libnetwork,从名字就能看出,它希望将 ...

随机推荐

  1. 云服务中IaaS、PaaS、SaaS的区别

    越来越多的软件,开始采用云服务. 云服务只是一个统称,可以分成三大类. IaaS:基础设施服务,Infrastructure-as-a-service PaaS:平台服务,Platform-as-a- ...

  2. python学习day13

    目录 JavaScript Dom jQuery JavaScript JavaScript 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平 ...

  3. 开机启动+Linux发送邮件

    需求:检测Linux上Tomcat是否允许,挂了的话给运维发送邮件通知 实现:编写脚本一直检测Tomcat进程是否存活,否则给运维发送邮件,脚本设置开机时自动启动 1.Linux发送邮件 vim /e ...

  4. Linux下自动化测试环境的搭建

    1.安装Linux虚拟机,详情参考  https://blog.csdn.net/qq_22770715/article/details/78558374     https://www.cnblog ...

  5. React 实践记录 02 Flux introduction

    Introduction 本文组成: React 官方文档翻译 相关实践心得. 内容上是Flux的介绍,例子将会在以后写出. 一旦稍微多了解一点React,很难避免听到Flux这个名词. Flux是一 ...

  6. 【持续更新】JS 时间与日期

    JS 的日期时间在项目中是必定会用到的,所以必须掌握. UTC 与 GMT 背景 十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测.1675年旧皇家观测所(Old Royal Obse ...

  7. 将centos6的php5.3升级为5.6

    在阿里云主机上,操作系统是Centos6,php版本是5.3.因为安装Yii2.0的需要,我要升级php为5.4.因为还有5.5和5.6,当然要升到高版本了.我决定升到5.6.   首先,按照这里的步 ...

  8. Selenium私房菜系列10 -- 我遇到的问题及解决问题的方法

    Selenium私房菜系列10 -- 我遇到的问题及解决问题的方法

  9. 洛谷 P1165 日志分析

    题目描述 M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志.该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量:第二 ...

  10. com.alibaba.dubbo.remoting.RemotingException: Failed to bind NettyServer on /192.168.1.13:20881, cause: Failed to bind to: /0.0.0.0:20881

    抛出的异常如上,解决方案是:根据异常信息确定是端口被占用,排查项目是否启动之后没有关闭,在windows命令行中运行如下命令:netstat -ano 检查端口占用的情况,根据pid在任务管理器中杀死 ...