Skip to content

Latest commit

 

History

History
44 lines (35 loc) · 2.68 KB

D02.md

File metadata and controls

44 lines (35 loc) · 2.68 KB

Docker网络实践

Linux bridge是Linux系统中用于实现TCP/IP二层协议交换的设备,简单的理解就是一个二层交换机或者Hub。多个网络设备连接到同一个Linux Bridge,当某个设备收到数据包时,Linux Bridge会将数据转发给其他设备。

Docker容器配置到本地网络

Docker默认创建的Ip和NAT规则(即bridge驱动机制),有时并不能满足实际需求。这时,我们可以利用虚拟网桥、veth pair等设备根据自己需要的网络拓扑组建自己的Docker网络环境,以便docker容器与容器之间,容器与主机之间的通信。接下来,我们以将Docker容器配置到本地网络为例,进行演示说明。

如果想要Docker容器和主机处于同一个网络,那么容器和主机应该一个二层网络中。因此,能够想到的设备就是交换机或虚拟网桥。在虚拟环境中,虚拟网桥可以将容器连在一个二层网络中,只要将主机的网卡桥接到虚拟网桥上,就可以实现容器和主机的网络连接起来。

veth pair设备是一对虚拟网卡,可以实现不同network namespace之间通信。所以,利用虚拟网桥+veth pair设备就可以实现将Docker容器配置到本地网络。具体示例如下:

# 启动不适用网络配置的Docker容器 --net=none
$ sudo docker run -itd --name c1 --net=none ubunu:14.04 /bin/bash
# 创建虚拟网桥br0
$ sudo brctl addbr br0
$ sudo ip link set br0 up

# 将主机eth0桥接到br0上,并将eth0的ip配置到br0。
# eth0的IP是10.103.12.60/22,网关是10.3.9.4
$ sudo ip addr add 10.103.12.60/22 dev br0; \
  sudo ip addr del 10.103.12.60/22 dev eth0; \
  sudo brctl addif br0 eth0; \
  sudo ip route del default; \
  sudo ip route add default via 10.3.9.4 dev br0;

# 找到容器c1的PID,并保存至c1pid中
$ c1pid=$(sudo docker inspect --format '{{ .State.Pid }}' c1)
# 将容器的network namespace添加到/var/run/netns目录下,这样才可以使用ip netns工具管理容器network namespace中的网络环境
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$c1pid/ns/net /var/run/netns/$c1pid

# 创建veth peer设备,并将其中的一端连接到br0上,另一端连接到容器的network namespace
$ sudo ip link add veth-a type veth peer name veth-b
$ sudo brctl addif br0 veth-a
$ sudo ip link set veth-a up
# 将veth-b放到容器c1的network namespace中,重命名为eth0,并为其配置ip和默认路由
$ sudo ip link set veth-b netns $c1pid
$ sudo ip netns exec $c1pid ip link set dev veth-b name eth0
$ sudo ip netns exec $c1pid ip link set eth0 up
$ sudo ip netns exec $c1pid ip addr add 10.103.12.61/22 dev eth0
$ sudo ip netns exec $c1pid route add default via 10.3.9.4