宿主机上docker0 Linux 网桥设备是怎么来的?

简介: 在默认安装情况下, Docker 会在宿主机上创建一个名为 docker0 的 Linux 网桥设备。该网桥设备拥有一个私有网络地址及其所属子网。

在默认安装情况下, Docker 会在宿主机上创建一个名为 docker0 的 Linux 网桥设备。该网

桥设备拥有一个私有网络地址及其所属子网。

分配给 docker0 网桥的子网地址为

  • 172.[17-31].42.1/16
  • 10.[0-255].42.1/16
  • 192.168.[42-44].1/24

中第一个没有被占用的子网地址。因此,很多时候你的 docker0 网桥设备的地址都是 172.17.42.1。所有容器都会连接到该网桥设备上,并从中分配一个位于子网 172.17.42.0/16 中的 IP 地址。容器链接到网桥的网络接口会把 docker0 网络设备作为网关。

d54dcaf3f1624f738249d72c37f75a54.png创建新容器时, Docker 会创建一对网络设备接口,并将它们放到两个独立的网络命名空间:一个网络设备放到容器的网络命名空间(即 eth0);另一个网络设备放到宿主机的网络命名空间,并连接到 docker0 网桥设备上。

通过Pipework理解容器网络

Pipework 能实现的功能几乎都内置在 Docker 中了,但是 Pipework 工具可以对 Docker 网络进行逆向工程。以便更深入了解容器之间以及容器与外部之间是如何通信的

1、启动容器,并下载pipework

2、--net=none 选项启动一个不带网络功能的容器

root@foobar-server:~# docker run -it --rm --net none --name cookbook ubuntu:14.04 bash

f3b3e17fd73d42ec93f890a9885eb96a.png这个容器只有一个本地环回设备,没有其他网络设备,也没有路由信息。如果需要和外部通信,只能手动进行设置。

pipework脚本可以帮我们做这件事情。

3、使用 Pipework 来创建一个完整的网络

root@foobar-server:/vagrant# ./pipework br0 nettest 192.168.1.10/24@192.168.1.254
Warning: arping not found; interface may not be immediately reachable

此时在容器中已经可以看到eth1 设备已启用,并且路由信息已经设置好。


这条命令完成如下四个步骤


• 在宿主机上创建网桥设备 br0。

• 分配 IP 地址 192.168.1.254。

• 在容器内部创建一个网络接口,并为其分配 IP 地址 192.168.1.10。

• 最后在容器内部添加路由信息,将网桥设置为默认网关。

d76139499dd54ef2841bbafcd9e0b7b5.png

126d2a65c40049bda5825698ba3e7d68.png4、查看该 Docker 主机上的网络设备列表


除了默认的 docker0 网桥设备,还会看到多出来一个 br0 设备

root@foobar-server:/vagrant# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 08:00:27:5f:bb:e6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe5f:bbe6/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 62:c5:12:b3:dc:2f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::f011:baff:fe81:370c/64 scope link
       valid_lft forever preferred_lft forever
6: veth1pl7218: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 62:c5:12:b3:dc:2f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::60c5:12ff:feb3:dc2f/64 scope link
       valid_lft forever preferred_lft forever
root@foobar-server:/vagrant#

5、 查看网桥信息

bridge-utils 软件包的 brctl 命令

下面胡原始股由 pipework 创建并连接到 br0 的虚拟以太网接口

此时宿主机上就可以访问容器。也可以在容器内访问其他容器了


6、如何访问宿主机之外的网络?


缺少NAT 地址转换规则,而这个 NAT 地址转换(伪装)规则在默认情况下会由 Docker 自动添加。在Docker 宿主机上添加相应的 iptables 规则


添加NAT规则

iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

访问外网

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
2月前
|
Linux Docker 容器
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻。
1385 4
Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!
|
4月前
|
NoSQL Unix Linux
Linux 设备驱动程序(一)(上)
Linux 设备驱动程序(一)
166 62
|
4月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
50 6
|
4月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
53 5
|
4月前
|
存储 缓存 Unix
Linux 设备驱动程序(三)(上)
Linux 设备驱动程序(三)
46 3
|
4月前
|
缓存 安全 Linux
Linux 设备驱动程序(一)((下)
Linux 设备驱动程序(一)
39 3
|
4月前
|
安全 数据管理 Linux
Linux 设备驱动程序(一)(中)
Linux 设备驱动程序(一)
30 2
|
4月前
|
Linux
Linux 设备驱动程序(四)
Linux 设备驱动程序(四)
27 1
|
4月前
|
存储 数据采集 缓存
Linux 设备驱动程序(三)(中)
Linux 设备驱动程序(三)
43 1
|
4月前
|
存储 前端开发 大数据
Linux 设备驱动程序(二)(中)
Linux 设备驱动程序(二)
32 1

热门文章

最新文章