启动容器test1和test2

docker run --name test1 -d busybox /bin/sh -c "while true; do sleep 3600; done"
docker run --name test2 -d busybox /bin/sh -c "while true; do sleep 3600; done"

docker网络常用命令

查看所有网络:docker network ls
这里写图片描述

查看某个网络详情:docker network inspect 网络ID
这里写图片描述

bridge

bridge模式:docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。

bridge 存在的目的:隔离各个容器,使得每个容器的端口号都是隔离的。如果不隔离开来,那么容器将和宿主机,容器和容器间都会发生端口占用的情况。
这里写图片描述

查看docker0网桥:ip addr show docker0
这里写图片描述

查看docker0详情:

sudo yum install bridge-utils
brctl show

这里写图片描述

这里的 veth7c94a82 是和容器test1的network namespace相连的。
新建一个test2容器后:
这里写图片描述

bridge 容器上网

NAT(Network Address Translation,网络地址转换),当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
这里写图片描述

创建bridge网络mybridge

docker network create -d bridge mybridge

各处信息同步:
docker network ls:
这里写图片描述

ip a:
这里写图片描述

brctl show
这里写图片描述

两个容器通过mybridge互连

docker network connect mybridge test1
docker network connect mybridge test2

这里写图片描述
查看mybridge信息 docker network inspect mybridge
这里写图片描述

test1中:
ping 172.18.0.3 –ok
ping test2 –ok
ping www.baidu.com –ok
test2中:
ping 172.18.0.2 –ok
ping test1 –ok
ping www.baidu.com –ok

成功实现两个容器互联。

创建bridge网络和link的区别

在test2中link test1后,test2容器有以下改变:
* 被注入环境变量
这里写图片描述
* /etc/hosts添加一行内容
这里写图片描述
* 只能test2 单向ping通test1

在test2和test1都连接bridge后:

  • 没有注入环境变量
  • 没有/etc/hosts修改
  • test2和test1可以相互ping通

当多个容器互联时,使用自定义bridge的方式,是最简单的。如果使用link, 需要通信的容器个数大于 2 个时复杂度会呈指数增长,或者,你可以编辑容器内的 /etc/hosts 文件,但这会产生难以调试的问题。自定义bridge是通过容器间自动 DNS 解析(automatic DNS resolution来实现容器互联的。

用户定义bridge和默认bridge docker0的区别

默认情况下,从容器发送到默认网桥的流量,并不会被转发到外部。要开启转发,需要改变两个设置。这些不是 Docker 命令,并且它们会影响 Docker 主机的内核。

配置 Linux 内核来允许 IP 转发
sysctl net.ipv4.conf.all.forwarding=1

改变 iptables 的政策,FORWARD 政策从 DROP 变为 ACCEPT
sudo iptables -P FORWARD ACCEPT

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐