Docker网络配置

        将Docker容器配置到宿主机网络环境中的几种方式:

1、通过虚拟网桥的方式

        基本思路是,创建一个虚拟网桥br0,把宿主机上一网卡如eth0的ip删掉,设置到br0上,然后把eth0加入到br0上;然后先删除到eth0上的默认路由,再添加到br0上的默认路由;接着创建一个虚拟网络peer,如veth-a、veth-b,将peer的veth-a放入容器,veth-b加入到刚创建的虚拟网桥br0;最后设置容器上veth-a的ip,并设置容器默认路由:

//添加网卡
brctl addbr br0
//up网卡
ip link set br0 up
//为br0设置ip地址,地址为当前机器eth0的地址,同时把eth0的地址删掉,然后把eth0连到网桥br0上;删除原来(到eth0的)默认路由规则,并添加默认路由规则到br0,via后边的ip,可以先通过ip route查看应该是什么;由于此命令会导致网络连接中断,如果是远程登录到机器上执行的,需要一步执行
ip addr add 172.16.30.131/24 dev br0; \
ip addr del 172.16.30.131/24 dev eth0; \
brctl addif br0 eth0; \
ip route del default; \
ip route add default via 172.16.30.2 dev br0
//跑个容器,不用docker提供的网络(--net=none),并获取容器id
docker run -itd --name my-ubuntu --net=none ubuntu:14.04 /bin/bash
cpid=$(docker inspect --format '{{.State.Pid}}' my-ubuntu)
//把容器的net ns软连接到/var/run/netns下
ln -s /proc/$cpid/ns/net /var/run/netns/$cpid
//添加网卡peer
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添加到容器网络ns下
ip link set veth-b netns $cpid
//修改容器中虚拟网卡veth-b的名称为eth0
ip netns exec $cpid ip link set veth-b name eth0
//启用eth0
ip netns exec $cpid ip link set eth0 up
//给容器分配ip地址,此地址跟宿主机在同一ip段
ip netns exec $cpid ip addr add 172.16.30.132/24 dev eth0
//分配完地址后,设置默认路由
ip netns exec $cpid ip route add default via 172.16.30.2

 2、通过虚拟网桥方式的pipework版本

        原理同1,但是这里不会删除宿主机网卡eth0的ip,不会设置br0的ip,需要单独设置

//通过pipework给容器my-containe设置一个网卡eth1,网卡ip为172.16.30.139/24,修改容器配置的默认路由172.16.30.2,并把网卡peer的宿主机上的网卡加入到网桥br0(如果br0不存在则创建)
pipework br0 my-container 172.16.30.139/[email protected]

 3、macvlan方式

        先在宿主机网络设备ens33上创建macvlan设备,然后将macvlan设备放入容器,并给容器设置ip和路由就可以在宿主机外部访问了,但是宿主机上访问不了容器;需要在宿主机网卡ens33再创建一个macvlan,然后把eth0 ip迁移到ens33上,然后设置默认路由。

//在宿主机ens33上创建macvlan设备
ip link add link ens33 dev macvlan-a mtu 1500 type macvlan mode bridge
//启动docker容器,并将创建的macvlan设备放入到docker容器中,重命名macvlan-a并设置ip和路由;此时就可以在宿主机之外访问容器ip,宿主机之内访问不了
docker -itd --net=none --name my-docker ubuntu /bin/bash
pid=$(docker inspect --format '{{.State.Pid}}' my-docker)
ip link set macvlan-a netns $pid
ip netns exec $pid set macvlan-a name eth1
ip netns exec $pid ip addr add 172.16.30.151/24 dev eth1
ip netns exec $pid ip link set eth1 up
//将宿主机网卡ens33 ip移到macvlan设备上,此时宿主机就可以访问容器ip了
ip addr del 172.16.30.130/24 dev ens33;\
ip link add link ens33 dev ens33m type macvlan mode bridge;\
ip link set ens33m up;\
ip addr add 172.16.30.130/24 dev ens33m;\
route add default gw 172.16.30.2

 4、pipework版vlan

//在物理机网卡eth0上创建macvlan,并添加到容器中;此时宿主机不能跟容器通信,宿主机之外可以
pipework eth0 my-container 172.16.30.139/[email protected]

 5、通过dhcp给容器分配ip

//先安装udhcpc,也可以安装dhclient、dhcpcd等
docker exec -it new-docker apt-get install && apt install udhcpc
//docker容器new-docker2通过dhcp获取ip,其中容器网卡是eth1,ens33为宿主机ip
pid2=$(docker inspect --format '{{.State.Pid}}' new-docker2)
ln -s /proc/$pid2/ns/net /var/run/netns/$pid2
pipework ens33 new-docker2 dhcp
ip netns exec $pid2 ip link set eth1 up
ip netns exec $pid2 udhcpc -qi eth1 -x hostname:guest
 

 

猜你喜欢

转载自yueyemaitian.iteye.com/blog/2315988