centos7 docker宿主机配置桥接物理网络终极实战

1、停止docker daemon,并删除docker0

systemctl stop docker.service

ip link set dev docker0 down
brctl delbr docker0


2、创建桥接物理网络:

2.1、思路整理

(1)新建br0桥接网络,brctl show可以查看(需安装bridge-utils)

(2)将宿主机物理网卡IP、掩码、网关、dns(或者dhcp)配置到br0上

(3)删除宿主机物理网卡IP、掩码、网关、dns(或者dhcp)配置

(4)将宿主机物理网卡加入到br0

2.2、配置实战

思路可以有一个,但是方案必须要有多种,此处列举两个方案

2.2.1、更改网卡配置文件实现(推荐)

此方案见本人另外一篇博客:

http://zhaoyfcomeon.blog.51cto.com/8429349/1968869

2.2.2、bctrl and ip命令实现

brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.184.100/24 dev br0 #为br0分配物理网络中的ip地址
ip addr del 192.168.184.99/24 dev ens0 #将宿主机网卡的IP清空
brctl addif br0 ens0 #将宿主机网卡挂到br0上
ip route del default #删除原路由
ip route add default via 192.168.184.2 dev br0 #为br0设置路由

3、设置docker服务启动参数

这里要注意的是,不同的linux操作系统docker的配置文件所在不同
centos 在/etc/sysconfig/docker
其他操作系统请前往下面的网址

https://docs.docker.com/installation/#installation
vim /etc/sysconfig/docker 
在OPTIONS='--selinux-enabled'这行中修改为
OPTIONS='--selinux-enabled -b=br0'
即让docker服务启动时使用br0网卡进行桥接

4、启动docker服务

systemctl start docker
systemctl status docker

5、安装pipework

git clone https://github.com/jpetazzo/pipework
cp ~/pipework/pipework /usr/local/bin/

6、启动一个none网络驱动的容器

这里最好不要让docker自动获取ip,下次启动会有变化而且自动获取的ip可能会和物理网段中的ip冲突

docker run -itd --net=none --name=test centos /bin/bash

7、为test容器设置一个与桥接物理网络同地址段的ip@网关

方法有两种,思路和原理是一样的

7.1、使用pipework工具,此工具是shell脚本

pipework br0 test 192.168.184.11/24@192.168.184.2

重点:pepework操作内容:

  • 查看主机中是否存在br0网桥、不存在就创建;

  • 向test中加入一块名为eth1的网卡,并配置IP地址为192.168.184.11/24

  • 若test中已经有默认路由,则删掉,把192.168.184.2设为默认路由的网关;

  • 将test容器连接到之前创建的br0上。

7.2、使用ip命令

配置使ip命令可以控制c4容器的network namespace
docker inspect --format "{{ .State.Pid }}" c4
467
ln -s /proc/467/ns/net /var/run/netns/467
配置虚拟网卡对
ip link add veth-a type veth peer name veth-b
将veth-a添加到br0网桥中
brctl addif br0 veth-a
ip link set veth-a up
将veth-b添加到容器中
ip link set veth-b netns 467
更改veth-b在容器中的名字
ip netns exec 467 ip link set veth-b name eth0
ip netns exec 467 ip link set eth0 up
ip netns exec 467 ip addr add 9.115.211.30/24 dev eth0
ip netns exec 467 ip route add default via 9.115.211.1
容器的dns是同步的宿主机/etc/resolv.con的配置

8、进入容器查看ip

docker exec -it test /bin/bash