运行一个容器name=test1
docker run -itd --name test1 --net=none ubuntu /bin/bash
建立一个容器连接的网桥 br0, host.eth0 —br0— veth-a <–> veth-b(eth0) in container
brctl addbr br0
ip link set br0 up
将主机eno1连接到br0上,并把eno1的IP配在br0上, 删除原有路由,添加新的default路由到br0上。由于远程执行,会导致断网,因此在一条命令中执行。
ip addr add 109.105.115.74/24 dev br0; ip addr del 109.105.115.74/24 dev eno1; brctl addif br0 eth0; ip route del default; ip route add default via 109.105.115.1 dev br0;
找到test1的PID,保存到pid中
pid=$(docker inspect --format '{{ .State.Pid }}' test1)
将容器的network namespace添加到/var/run/netns目录下
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
创建用于连接网桥br0和docker容器的网卡设备 veth设备
ip link add veth-a type veth peer name veth-b
将veth-a连到br0上
ip link set veth-a up
brctl addif br0 veth-a
将veth-b放到容器test1里的network nemespace,重命名为eth0,并为其配置IP和默认路由
ip link set veth-b netns $pid
ip netns exec $pid ip link set dev veth-b name eth0
ip netns exec $pid ip link set eth0 up
ip netns exec $pid ip addr add 109.105.115.201/24 dev eth0
ip netns exec $pid ip route add default via 109.105.115.1 dev eth0