Docker-Bridge Network 03 自定义网络
本节介绍自定义bridge network的自定义网络。
1.前言2.创建自定义网络2.1 创建网络2.2 指定网段创建网络3.创建容器3.1 指定网络创建容器3.2 指定IP创建容器4.通信4.1 不同bridge之间是网络隔离的4.2 不同bridge上的容器如何通信4.3 原理5.小结
1.前言
前两节,我们创建的容器默认使用了bridge network,网桥docker0,网段是172.17.0.0/16。那能不能自己定义网络、网段呢?
2.创建自定义网络
Docker提供三种user-defined网络驱动:bridge、overlay和macvlan。本章只介绍bridge方式。
创建之前,查看当前网络,可以发现docker安装时创建了bridge、host、none三个网络。
[root@docker1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c1bb643c9c5a bridge bridge local
59364623cee2 host host local
fb704391fb47 none null local
2.1 创建网络
执行docker network create --driver=bridge mynet1
- docker网络 多了mynet1,驱动为bridge
[root@docker1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c1bb643c9c5a bridge bridge local
59364623cee2 host host local
50ffccecba76 mynet1 bridge local
fb704391fb47 none null local
- 网桥 新增了一个网桥
[root@docker1 ~]# brctl show
bridge name bridge id STP enabled interfaces
br-50ffccecba76 8000.0242c34e7ef4 no
docker0 8000.0242a8646c32 no veth535a8bb
veth895fec0
- 路由表 新增了目的地址为172.18.0.0/16的路由表
[root@docker1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 enp0s3
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-50ffccecba76
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
- 用
docker network inspect命令查看网络详情
可以发现其网段是由docker指定的,为172.18.0.0/16
[root@docker1 ~]# docker network inspect mynet1
[
{
"Name": "mynet1",
"Id": "50ffccecba76af9de29d457743e6859d34b6a70b61f364a66ec15813425b1454",
"Created": "2020-04-19T21:57:34.490552328+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
......
2.2 指定网段创建网络
执行命令docker network create --driver=bridge --subnet=172.21.21.0/24 --gateway=172.21.21.1 mynet2
创建完,路由表、网桥等发生类似的变化,且该网络的网段和网关是我们自己指定的。
3.创建容器
分别用上面两个网络创建容器。
3.1 指定网络创建容器
执行docker run -it -d --network=mynet1 --name=bbox_mynet1 busybox,进入容器,查看其IP
[root@docker1 ~]# docker exec -it bbox_mynet1 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
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
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
3.2 指定IP创建容器
执行docker run -it -d --network=mynet2 --ip=172.21.21.65 --name=bbox_mynet2 busybox,进入容器,查看IP
[root@docker1 ~]# docker exec -it bbox_mynet2 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
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
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:15:15:41 brd ff:ff:ff:ff:ff:ff
inet 172.21.21.65/24 brd 172.21.21.255 scope global eth0
valid_lft forever preferred_lft forever
注意:只有自己定义网段的网络,才允许指定容器IP。
4.通信
当前网络拓扑
4.1 不同bridge之间是网络隔离的
同一个bridge上容器自然可以通信,我们不再测试。那不同bridge上呢?看样子应该不通,毕竟网段都不一样。但是等等,我们前面说过linux系统开启了ip_forward,它本身就是一个路由器,我们查看一下主机的路由表:
[root@docker1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 enp0s3
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-50ffccecba76
172.21.21.0 0.0.0.0 255.255.255.0 U 0 0 0 br-757bb8fb1878
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
从路由表来看,不同bridge的容器是可以通信的。测试一下,从bbox_mynet1 ping bbox1,发现不通。
为什么呢?查看iptables,执行iptables -t filter -vnL
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
0 0 DOCKER-ISOLATION-STAGE-2 all -- br-757bb8fb1878 !br-757bb8fb1878 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER-ISOLATION-STAGE-2 all -- br-50ffccecba76 !br-50ffccecba76 0.0.0.0/0 0.0.0.0/0
33 6167 DOCKER-ISOLATION-STAGE-2 all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
76 9290 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-ISOLATION-STAGE-2 (3 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * br-757bb8fb1878 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * br-50ffccecba76 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * docker0 0.0.0.0/0 0.0.0.0/0
33 6167 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
这几条规则决定了不同bridge之间的流量被DROP了。
可见Docker设计之初就规定了不同bridge之间不能通信。
4.2 不同bridge上的容器如何通信
那如何让两个bridge上的容器通信呢?
现在想让bbox_mynet1能访问bbox1,我在bbox_mynet1里加上一块连接docker0的网卡,如下图:
执行命令将容器bbox_mynet1连接到网络bridge上docker network connect bridge bbox_mynet1
(注意docker network connect docker0 bbox_mynet1是不行的,网络名称必须是docker network ls查出的NAME)
查看容器bbox_mynet1的网卡,可以发现多了网卡eth1:
[root@docker1 ~]# docker exec -it bbox_mynet1 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
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
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
16: eth1@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.5/16 brd 172.17.255.255 scope global eth1
valid_lft forever preferred_lft forever
此时可以ping通bbox1
/ # ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.202 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.101 ms
4.3 原理
为什么通了呢?根据拓扑图,很好理解,查看bbox_mynet1的路由表,里面多了一条指向172.17.0.0/16的路由,并且出口为eth1,而eth1与docker0的接口是veth pair,流量自然走到了docker0上。
/ # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth1
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
5.小结
- Docker支持用户自己创建网络,支持指定CIDR及网关
- 在自定义CIDR的网络上创建容器,可以指定容器IP
- 不同bridge的容器是隔离的,通过iptables Filter table实现
- 想让不同bridge上的容器A访问容器B,需要给容器A添加一个网卡,该网卡连接到容器B所在的bridge上
下一节,我们介绍None & Host网络。点击此处回到docker系列文章目录。
作者原创,转载请声明出处!
本人微信公众号同步更新云计算、容器、网络、编程等文章,欢迎参观!

Docker-Bridge Network 03 自定义网络的更多相关文章
- centos7下安装docker(12.2自定义网络)
通常默认的情况下我们使用的是docker的bridge的网络,用户也可以根据自己的业务需要,创建user-defined docker 提供三种user-defined网络驱动:bridge,over ...
- Docker系列(28)- 自定义网络
自定义网络 网络模式 bridge:桥接docker(默认,自己创建也可以使用bridge模式) none:不配置网络 host:和宿主机共享网络 container:容器网络联通!(用的少!局限性大 ...
- Docker | 自定义网络(网关、子网地址)
了解 docker network 通过下面的命令来获取帮助 docker network --help Commands: connect Connect a container to a netw ...
- Docker 自定义网络
1.创建自定义网络 docker network create -d bridge --subnet 172.25.0.0/16 network_name 2.redis docker 添加到网络 d ...
- Docker Network Configuration 高级网络配置
Network Configuration TL;DR When Docker starts, it creates a virtual interface named docker0 on the ...
- Docker bridge、host、container other、overlay 网络模式
docker run创建Docker容器时,可以用--net 选项指定容器的网络模式,Docker有以下5种网络模式: bridge模式:使用–net =bridge指定,默认设置: host模式:使 ...
- 网络-Docker 提供的几种原生网络和自定义网络(11)
Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络,本章重点讨论前一种 Docker 安装时会自动在 host 上创建三个网络,我们可用 docker netwo ...
- docker学习之network:初识网络配置
起因 我的开发环境需要一个python代码运行环境.reids服务和mysql服务. 由于以前,我的开发环境是mac,而CI和线上运行环境是centos,偶尔会出项本地单元测试跑不过,而CI可以过.这 ...
- Docker的单主机容器网络
作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Do ...
随机推荐
- 题解 P4344 【[SHOI2015]脑洞治疗仪】
前言 这道题目呢,看上去很难,实际上我们可以用线段树解决这道题目. 正文 我们维护 sum.len.tag.lmax.rmax.ans. sum 就是这段区间非脑洞的个数 len 就是这段区间的长度 ...
- 推荐|近期热点机器学习git项目
No1: InterpretML by Microsoft--Machine Learning Interpretability github地址:https://github.com/microso ...
- Qt 事件使用示例 (一)
Qt 事件使用示例,以一个常见的使用来说明:QLabel 当鼠标滑过时改变颜色. 事先说明要想实现这一功能有很多种方法,如Qss实现,本文使用Qt事件的方式来实现. 第一步,我们得实现一个从QLabe ...
- ADO.NET 的使用(二)
一.本篇主要讲ADO.NET的核心DataSet DataSet里面有个DataTable,DataTable还有个对应的DataView 首先呢,假设数据库的数据 id name mob 100 张 ...
- coding++:RateLimiter 限流算法之漏桶算法、令牌桶算法--简介
RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类 <dependency> <groupId>com.google.guava</g ...
- Feign客户端的重构,新建springcloud架构
1,在上篇博文中,已经实现了feign 客户端来远程调用接口的功能,因为feign 客户端在springcloud 开发过程中是比较常用的方式 https://www.cnblogs.com/pick ...
- 《java编程思想》操作符
1. 自动递增和递减 递增和递减运算是两种相当不错的快捷运算,递减操作符是 "--",意为减少一个单位,递增操作符是 "++",意为增加一个单位.这两个操作符各 ...
- [vijos1304]回文数<模拟>
题目链接:https://vijos.org/p/1304 好久没写博客了,最近一直打不出题,感觉自己是废了,今天做了一道模拟水题,但还是半天没过,后来才发现是忘记考虐10以上的进制是带有字母的,然后 ...
- 200行PYTHON代码实现贪吃蛇
200行Python代码实现贪吃蛇 话不多说,最后会给出全部的代码,也可以从这里Fork,正文开始: 目前实现的功能列表: 贪吃蛇的控制,通过上下左右方向键: 触碰到边缘.墙壁.自身则游戏结束: 接触 ...
- 6.Metasploit生成apk攻击Android实例
Metasploit进阶第四讲 生成Android apk文件 01 msfvenom基本参数 msfvenom介绍 承接上回,staged/unstage payload如何利用? msfven ...