Docker学习笔记(四)-docker中的网络与存储

2023-11-19

前言

要了解docker的网络和存储,首先需要知道docker的资源隔离机制—namespace,让某个特定的全局系统资源通过抽象方法使namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例(The purpose of each namespace is to wrap a particular global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource. )。Linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念。通过Network namespace 每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。

网络namespace

在linxu环境下我们可以通过ip a命令查看网络,通过ip netns list可以查看宿主机的网络namespace情况。
每启动一个新的容器,都会创建对应的namespace,不同namespace之间通过veth pair可以互相联通,如图:
这里写图片描述
我们假设宿主机有两个网络接口eth0、eth1,test1和test2是两个独立的namespace,二者可以通过veth pair这个桥梁进行互联,而Docker中的容器之间的连接类似,在了解docker网络机制之前,我们可以先还原一下不同的namespace之间连接建立的过程:

开始之前需要了解ip命令:
Ip命令的语法:
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]
OPTIONS
OPTIONS是一些修改ip行为或者改变其输出的选项常用的有:
-V,-Version: 打印ip的版本并退出。
-s,-stats,-statistics: 输出更为详尽的信息。如果这个选项出现两次或者多次,输出的信息将更为详尽。
-o,-oneline 对每行记录都使用单行输出,回行用字符代替。如果你需要使用wc、grep等工具处理ip的输出,会用到这个选项。
-r,-resolve 查询域名解析系统,用获得的主机名代替主机IP地址.
OBJECT
OBJECT是要操作的对象,如:
link: 网络设备
address: 一个设备的协议(IP或者IPV6)地址
neighbour: ARP或者NDISC缓冲区条目
route: 路由表条目
rule: 路由策略数据库中的规则
maddress: 多播地址
mroute: 多播路由缓冲区条目
netns:管理网络空间

下面我们还原一下不同的namespace之间连接建立的过程:

1. 首先创建两个不同的网络namespace
ip netns add test1
ip netns add test2
ip netns list            # 可以查看当前的网络namespace

这里写图片描述

2. 添加veth pair
ip link add veth-test1 type veth peer name veth-test2
### 查看当前的ip设备情况
ip link

可以看到我们添加的veth对信息:
这里写图片描述

3. 设置veth-test1 veth-test2的namespace
ip link set veth-test1 netns test1
ip link set veth-test2 netns test2

### 查看test2的网络设备(test1同理)
ip netns exec test2 ip link

这里写图片描述
此时我们相当于给test1和test2之间建立了一条veth pair通道,通过这个通道连接了两个“容器”,但是仔细看它们的状态是DOWN,接下来我们需要将其up起来

4. 给veth-test1 veth-test2配置ip地址
ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1
ip netns exec test1 ip addr add 192.168.1.2/24 dev veth-test2
### 查看ip地址配置情况(test1同理)
ip netns exec test2 ip a

这里可以看到ip信息:
这里写图片描述

5. 将veth-test1 veth-test2启动
ip netns exec test1 ip link set dev veth-test1 up
ip netns exec test2 ip link set dev veth-test2 up

再次查看状态发现已经启动:
这里写图片描述

6. 查看两个“容器”互通情况,通过test2去ping test1,可以ping通
ip netns exec test2 ping 192.168.1.1

这里写图片描述

以上我们还原了两个namespace之间进行通信建立的过程。

容器中的网络模式

在docker中主要有三种网络模式,我们通过docker network ls可以查看:
这里写图片描述
通过ip a命令我们可以查看当前的网络(我的是阿里云):
这里写图片描述
可以看到除了lo回环网口和eth0外,这里还有一个docker0,这个接口可以理解为docker容器与外部通信的桥梁,从容器角度看,docker0 对于运行在同一个主机上的各个容器来说是二层交换机的角色,docker0 自身也具有MAC地址,并且绑定了IP,因此在容器中还可以作为默认网关存在。

(1)bridge网络

在容器启动的时候,会在外部创建一个vethxxxxxa(可以通过ip a查看),这个veth与外部主机通过桥接方式(docker0)进行连接,容器内部也会创建vethxxxxxb(可以进入容器内部后通过ip a查看),vethxxxxxb和外部vethxxxxxa组成一对veth pair进行通信,如图:
这里写图片描述
这样就解决了容器之间的通信,那么容器又是怎么访问外网的呢?答案是NAT(网络地址转换),如图:
这里写图片描述
通过网络地址转换技术从宿主机的eth0网口就可以连接外网了,关于NAT不是本文重点,可以参考网上资料了解。(有时候我们不需要记住容器的ip,这样会带来很多额外的工作,通过link命令可以将容器通过容器名称这种容易记住的方式进行网络的连接)

docker run -d --name test2 --link test1 xxx/xxx

这样在test2中可以不用使用具体的ip而直接使用test1就可以进行连接(相当于添加一条dns记录)
我们也可以创建自己的bridge:

docker network create -d bridge mybridge

在创建容器的时候就可以通过–network指定我们创建的bridge,默认使用docker0的:

docker run -d --name test3 --network mybridge xxx/xxx

通过connect命令也可以实现:

docker network connect mybridge test3
(2)host网络

host网络主要给我们提供了类似端口转发(映射)的功能,使我们将容器服务暴露给外部端口实现通过访问外部端口可以访问容器内部服务的能力:

docker run -d -p 80:8080 --name test4 xxx/xxx

通过-p参数我们将容器的8080端口映射到了宿主机的80端口,访问宿主机的80端口就相当于访问容器内部服务。

(3)none网络

不能通过外部访问,一般用来存储密码等安全性较高的东西,只能通过本地访问

(4)多机器通信

前面说的都是在同一个linux机器下容器之间的通信,那么在不同的机器下不同的容器如何通信呢,如图:
这里写图片描述
目前主要有以下几种通信方式:

  1. 使用openvswitch 搭建 xvlan协议隧道
  2. 将多个物理机的容器组到一个物理网络,这需要在每台机器上创建自己的网桥br0,然后将docker默认网桥绑定到br0
  3. 使用docker的swarm集群
  4. 使用docker的overlay网络

以后会再深入研究这几种方式。

容器的存储

container是可读可写的,但是image是只读的,我们在容器中的数据如果不想丢失,需要进行持久化存储,目前docker的持久化存储主要通过Data Volume。
Volume类型有两种:
- 受管理的data Volume,由docker后台自动创建
- 绑定挂载的Volume,由用户指定

有两种持久化方案:

1.基于本地文件系统的Volume
在执行docker create或docker run时,通过-v参数将主机的目录作为容器的数据卷,这部分功能基于本地文件系统的volume管理,
更好的方式是使用bind mouting挂载的方式进行数据同步(无论在容器内外修改文件都会改变,相当于操作同一个目录),命令如下:

docker run -v /home/xxx:/root/yyy

2.基于plugin的Volume
使用第三方存储,比如NAS,aws

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker学习笔记(四)-docker中的网络与存储 的相关文章

随机推荐

  • Ansible-playbook roles安装lnmp(学习笔记三十二)

    http blog 51cto com dl528888 1440775
  • Matlab 二维图转三维图详解

    Matlab 二维图转三维图详解 Matlab 是一款常用的数学软件 其可视化效果也非常出色 在 Matlab 中 我们可以通过简单的代码将二维图转换成三维图 在本文中 我们将为大家介绍如何使用 Matlab 将二维图转换成三维图 一 Ma
  • 小森生活一直显示服务器连接异常,小森生活进不去怎么解决?无法进入游戏问题原因与解决办法[多图]...

    小森生活进不去怎么解决 最近许多玩家反应 在登录小森生活时无法正常进入游戏 有的崩溃 有的闪退 有的直接系统提示无法进入 盒子小编来告诉大家解决办法 小森生活进不去解决攻略 一 检查小森生活安装包 1 小森生活公测用的都是最新版本 内测的老
  • vue中如何在外部调用methods的方法

    1 首先定义一个公共的vue组件 var eventHub new Vue 2 在事件当前的组件中 在created中 用 on向公共的组件eventHub传递 translate是自定义的 getCardNum data 是要在外部调用的
  • elasticsearch去重计数(distinct)

    如果需要针对ES索引统计某个字段上出现的不同值的个数时 可以使用cardinality聚合查询完成 GET urlAttributes search search type count aggs
  • 亚利桑那州立大学周纵苇:研习 U-Net ——现有的分割网络创新

    雷锋网AI研习社按 经典的 Encoder Decoder 结构在目标分割问题中展现出了举足轻重的作用 然而这样一个相对固定的框架使得模型在感受野大小和边界分割精度两方面很难达到兼顾 本次公开课 讲者以 U Net 为案例分析 总结现有的分
  • Python面试50题!面试巩固必看!

    题目001 在Python中如何实现单例模式 点评 单例模式是指让一个类只能创建出唯一的实例 这个题目在面试中出现的频率极高 因为它考察的不仅仅是单例模式 更是对Python语言到底掌握到何种程度 建议大家用装饰器和元类这两种方式来实现单例
  • Jenkins+RobotFramework 失败用例重执行方案

    背景 接口测试用例运行在Jenkins节点上 在某些情况下 比如网络波动等原因 会导致用例运行失败 此时会触发邮件和钉钉预警 通知给到责任人 按照现有策略 当本次构建失败时 会立马触发第二次构建活动 若第二次构建仍然失败 则会再次触发预警信
  • 编译原理_计算器_flex、bison实现(详细辅助理解)

    编译原理 计算器 flex bison实现 详细辅助理解 个人博客 https www yuque com ngp blog tuanh6 https www yuque com ngp blog tuanh6 P S 这篇文章只能助你理解
  • python在财务分析中的应用,用python做财务数据分析

    大家好 本文将围绕python在财务分析中的应用展开说明 用python做财务数据分析是一个很多人都想弄明白的事情 想搞清楚python与财务数据分析需要先了解以下几个事情 1 说明 Python 处理业财数据的应用场景 并写出相应代码 可
  • VS附加进程调试

    什么是附加进程调试 附加进程调试就是将当前的代码工程附加到一个电脑程序进程中进行调试运行 从而达到调试定位问题的目的 附加进程调试的场景 1 软件运行崩溃 无dump或者dump看不出关键信息 2 当前代码工程编译的库不作为启动项 而是作为
  • SpringBoot+MybatisPlus+Druid极速搭建项目原型

    前言 听说你又有新需求了 什么 又是对某些表的增删改查 什么 还要从数据库一直写到dao层 还要配置mapper xml文件 完事儿之后还要写service层 controller层 什么 遇到条件查询还要写dao层和xml文件中的sql语
  • vscode 如何运行pip_VS Code写Python的一些小技巧

    本文基于 VS Code 1 36 1 为什么要用 VS Code 用 PyCharm 不好吗 VS Code 是开源免费的 PyCharm 是收费的 VS Code 除了 Python 还可以写其他语言 PyCharm 不行 VS Cod
  • 代码迁移_三种类型的代码迁移

    代码迁移 随着代码变老 通常有必要对其进行现代化 有以下动机 我们找到了一种更好的方法 我们需要出于支持 许可或仅出于最佳实践的原因而更新核心库 技术 我们需要在更现代的基础架构上运行该软件 简而言之 几年前编写的软件很少能完美地在我们现有
  • 自变化折线图(两周数据)

  • 小饼干问题 find寻找字符串 substr截取字符串

    所有人的回复都由大写字母 小写字母与 组成 占一行 MJJ认为只要其中包含了连续的10个小写字母 zailaiyihe 就意味着这个人想要再来一盒 题目描述 现在MJJ准备给每一个想要 再来一盒 的人买一盒小饼干 他想知道总共需要买几盒小饼
  • 【多线程例题】顺序打印abc线程

    顺序打印 进阶版 方法一 三个线程竞争同一个锁 通过count判断是否打印 方法二 三个线程同时start 分别上锁 从a开始 打印后唤醒b 三个线程分别打印A B C 方法一 通过count计数打印 三个线程上同样的锁 打印一个 召唤所有
  • msi afterburner怎么调节风扇转速教程

    msi afterburner是集超频 信息检测和参数调节等诸多功能为一体的显卡调节控制软件 要怎么使用msi afterburner调节风扇转速呢 很多小伙伴都不清楚怎么设置吧 下面就来看看详细操作 1 根据Afterburner软件的检
  • java String 转utf-8编码

    Get XML String of utf 8 return XML Formed string public static String getUTF8XMLString String xml A StringBuffer Object
  • Docker学习笔记(四)-docker中的网络与存储

    前言 要了解docker的网络和存储 首先需要知道docker的资源隔离机制 namespace 让某个特定的全局系统资源通过抽象方法使namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例 The purpose of e