本篇主要是Docker网络模式与容器间通信。
上一篇:【Docker基础篇】Docker核心概念与指令

文章目录

  • 一、预备知识点
  • 二、Docker网络模式
    • 1、查看Docker网络模式
    • 2、bridge网络模式
      • - 原理
      • - 实现
      • - 图解
    • 3、host网络模式
      • - 原理
      • - 实现
      • - 图解
    • 4、none网络模式
      • - 原理:
      • - 实现:
    • 5、container 网络模式
      • - 原理:
      • - 实现:
      • - 图解:
  • 三、自定义网络
    • 1、用自定义网络实现容器互连
    • 2、网络的连接、断开与移除
    • 3、DNS

一、预备知识点

了解Docker网络模式前,先准备点计算机网络。

1、Veth:
Veth是Linux中一种虚拟出来的网络设备,veth设备总是成对出现,所以一般也叫veth-pair。veth模拟了在物理世界里的两块网卡,以及一条网线。通过它可以将两个虚拟的设备连接起来,让他们之间相互通信。


如:v-a和v-b是一对veth设备,v-a收到的数据会从v-b发出。相反,v-b收到的数据会从v-a发出。Veth就像一根网线。

Veth设备的特点:

  • veth和其它的网络设备都一样,一端连接的是内核协议栈
  • veth设备是成对出现的,另一端两个设备彼此相连
  • 一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去

veth的2头都直接连着网络协议栈,所以创建一个veth对,主机上就会多2个网卡。

veth的实现和底层理解参考这里。

2、eth0:
ethernet的简写,以太网接口与网卡对应,每个硬件网卡(一个MAC)对应一个以太网接口,其工作完全由网卡相应的驱动程序控制。

如果物理网卡只有一个,而却有eth1,eth2等,则可能存在无线网卡或多个虚拟网卡,虚拟网卡由系统创建或通过应用层程序创建,作用与物理网卡类似。

3、网卡和网桥

参考这里。

二、Docker网络模式

1、查看Docker网络模式

docker network ps

安装 Docker 以后,会默认创建三种网络:bridge、host、none

网络模式 特点
bridge 为每个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为bridge模式
host 容器将不会虚拟出自己的网卡,也不会配置自己的IP,而是使用宿主机的IP和端口
none 容器有独立的Network namespace ,但并没有对其进行任何网络设置,如分配veth和网桥连接、IP等
container 新创建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容器共享IP、端口范围等

2、bridge网络模式

- 原理

bridge模式下,Docker守护进程会创建一个虚拟以太网桥docker0,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。

默认情况下,守护进程会创建一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0接口(容器的网卡)。另一个接口放置在宿主机的命名空间中,以类似 vethxxx这样的名字命名,从而将宿主机上的所有容器都连接到这个内部网络上。

- 实现

首先以busybox为镜像创建容器net01(BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件)

docker run -it --name net01 busybox

ip addr查看信息:

查看宿主机的ip addr信息:

可以看到:
守护进程创建的一对对等虚拟设备接口 veth pair,将其中一个接口设置为容器的 eth0 接口(容器的网卡),另一个接口放置在宿主机的命名空间中,即图中的veth7353413

同时,守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器,并设置 docker0 的 IP 地址为容器的默认网关。

查看网桥信息
brctl show
#指令安装:
yum install -y bridge-utils


容器的IP地址和Gateway信息,可以docker inspect在NetworkSettings中查看

docker inspect 容器名 |grep  -i NetworkSettings -A 50|grep -Ei "Gateway|IPAddress


查看bridge网络模式下的所有容器信息:

docker network inspect bridge


因bridge是创建容器时默认使用的网络模式,所以docker run时不用加–net bridge指定

- 图解


步骤总结就是:

  • Docker Daemon 利用 veth pair 技术,在宿主机上创建一对对等虚拟网络接口设备,假设为 veth0 和 veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。

  • Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0;

  • Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,宿主机的网络报文若发往 veth0,则立即会被 Container 的 eth0 接收,实现宿主机到 Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

3、host网络模式

- 原理

host网络模式的容器,直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP,无需额外进行 NAT 转换,同时容器内服务的端口也可以使用宿主机的端口。

host 网络模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

- 实现

创建host网络模式的容器net02,注意这时要加–net host指定模式:

docker run -it --name net02 --net host busybox

ip addr查看信息,和宿主机的ip addr信息完全一致


再查看host网络模式下的所有容器信息,可以看到net02容器

docker network inspect host

- 图解

4、none网络模式

- 原理:

none 网络模式是指禁用网络功能,只有 lo 接口。

none 网络模式即不为 Docker Container 创建任何的网络环境,容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。

lo,即locate,lo其实是一个系统虚拟的环回接口,它的IP地址是127.0.0.1,利用这个接口可以实现系统内部(一个本地进程为另一个本地进程)发送和接收数据。

- 实现:

–net none指定容器网络模式,创建net03容器

docker run -it --name net03 --net none busybox


docker network inspect none 查看所有 none 网络模式下的容器:

5、container 网络模式

- 原理:

创建容器时通过参数 --net container:容器名称或ID。Container 网络模式即新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用 localhost 高效快速通信,两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是隔离的

- 实现:

基于容器net01创建container网络模式的容器net04

docker run -it --name net04 --net container:net01 busybox

查看net04和net01的addr信息:

可以看到,容器net04直接使用了net01的网卡信息。此时,stop容器net01,容器net04就只剩下lo接口了:

接下来重启net01,再重启net04,可以看到网卡信息恢复正常了:

- 图解:

三、自定义网络

考虑到安全性问题,实际开发中,我们常使用自定义网络来进行容器间的通信。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称(run的时候用–name指定)通信。但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用,即自定义网络,而不是安装Docker后自带的三个网络。

1、用自定义网络实现容器互连

第一步:新建网络,起名test–net

docker network create -d bridge test--net

参数:

  • -d:参数指定 Docker 网络类型,即–driver
  • 更多参数可docker network create --help查看

第二步:运行一个容器并连接到新建自定义网络 test–net

docker run -it --name net05 --net test--net busybox

docker inspect 查看容器的网络信息,在NetworkSettings中:

第三步:再创建一个容器,并连接到新建自定义网络 test–net,并ping上一步中创建的容器

当然,ping容器的Name和IP地址都可以,操作如下图:

可以看到容器net05和net06成功建立了互连关系!

2、网络的连接、断开与移除

  • 连接网络
docker network connect 网络名称 容器名称

docker inspect 查看网络信息可以看到多了一个默认的bridge:

  • 断开网络
docker network disconnect 网络名称 容器名称

断开net05新增的bridge网络,再docker inspect 查看容器网络信息,只剩一个test–net网络了:

  • 移除网络
docker network rm 网络名称

删除某自定义网络,但当通过该自定义网络创建了容器,则该网络无法删除。

3、DNS

最后,关于DNS,可在宿主机的/etc/docker/daemon.json文件中来增加以下内容来设置全部容器的DNS:

{"dns" : ["114.114.114.114","8.8.8.8"]
}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8.8。配置完成后,需要重启docker才能生效,重启所有docker直接systemctl restart docker


systemtl系列指令功能强大,了解更多可跳这里here。

【Docke进阶篇】Docker网络模式与容器间通信相关推荐

  1. docker容器网络 - 同一个host下的容器间通信

    2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...

  2. docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件

    首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...

  3. 【云原生 | Docker 高级篇】06、Docker 网络模式详解

    目录 一.Docker 平台架构图解 ​整体说明: 二.Docker 网络是什么 三.Docker 网络常用基本命令 1.查看网络 2.查看网络源数据 3.删除网络 4.案例 ​四.Docker 能干 ...

  4. docker 获取宿主机ip_Docker基础修炼6——网络初探及单机容器间通信

    如果觉得文章有帮助,欢迎点击头像关注我获取更多原创文章,同时也欢迎转发. 同时也可以在我的历史文章中找到Linux操作系统相关的服务器运维管理入门系列文章,欢迎交流. 前文演示docker容器内部数据 ...

  5. Docker 学习笔记 - 进阶四 Docker网络和 Docker compose

    Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...

  6. 关于docker那点事儿——docker网络模式

    docker网络模式 前言 一.容器网卡.网桥docker0.veth关系 二.docker的4种网络模式 bridge模式 host模式 container模式 none模式 前言 可以说每一次技术 ...

  7. Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问

    前言 自定义网络 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址.Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Over ...

  8. docker网络--理解linux底层实现机制、docker网络模式

    1. Linux网络基础 Linux内核具有非常成熟和高性能的TCP / IP堆栈实现.Docker网络使用linux内核的网络堆栈作为低级原语来创建高级网络驱动程序.简而言之,Docker网络就是 ...

  9. docker容器网络配置之容器间的链接(默认桥接网络下的links)

    一. 遗留的容器连接方式  --link --link是docker 的一个遗留的特征,最终可能被删除.除非绝对需要使用,不然,建议使用 user-defined network 建立容器间的连接.不 ...

最新文章

  1. 数据治理展示血缘关系的工具_Nebula Graph 在微众银行数据治理业务的实践
  2. 深入理解 Event Loop
  3. border属性的CSS缩写顺序
  4. PHP获取重定向URL的几种方法
  5. MQTT数据处理之从tcp连接获取数据过程
  6. 不知道如何选择的时候,付诸行动比选择更重要
  7. [摘录]软件版本GA,RC,alpha,beta,Build 含义
  8. CSS改变插入光标颜色
  9. leetcode344题:反转字符串
  10. 拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
  11. 再还校园一个干净、健康的网络环境
  12. 电子邮件验证及部分常用正则表达式
  13. Java成员方法getinfo_我想问下程序中的setInfo()和getInfo()它们怎调用的??
  14. css背景颜色如何铺满屏幕
  15. WebView 入坑
  16. 【Alpha阶段】第五次scrum meeting
  17. 记一次艰难的SQL注入(过安全狗)
  18. 浏览器上检测电脑是否安装某个应用程序
  19. 中国动力电池PACK行业商业模式创新及发展方向建议报告2022-2028年版
  20. 并联串联混合的电压和电流_【中学物理】电流传感器在串联、并联电路中的应用...

热门文章

  1. 第24章 JVM监控及诊断工具-GUI篇
  2. NYOJ - 笨小熊
  3. 如何阅读LCD规格书
  4. html 网页自动关闭,网页自动关闭怎么回事 怎么解决【图解】
  5. Matlab GUI编程技巧(七):matlablistbox操作-列表框(ListBox)和uilistbox常用操作
  6. 浅试Hyperledger Fabric go 小项目
  7. IEEE Trans、Journal 和 Letter 的论文格式要求
  8. 2023年Q1天猫手机行业品牌销售排行榜
  9. IPSec NAT穿越静态配置和问题
  10. Java String方法