手動為容器設置ip地址


1、安裝bridge-utils

# aptitude install -y bridge-utils

2、配置網橋

# vim /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto eth1
iface eth1 inet manual

auto veth0
iface veth0 inet static
        address 122.14.206.140
        netmask 255.255.254.0
        gateway 122.14.206.1
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp on

auto veth1
iface veth1 inet static
        address 192.168.5.86
        netmask 255.255.240.0
        gateway 122.14.206.1
        bridge_ports eth1
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp on

# /etc/init.d/networking restart

3、修改容器IP地址的腳本

# cat mkipinner.sh

#/bin/bash

#判斷是否給定位置參數,如果沒有則提示用法
if [ -z $1 ] || [ -z $2 ] || [ -z $3 ] || [ -z $4 ];
then
    echo "*****Input the necessary parameters: CONTAINERID IP MASK GATEWAY ETHNAME"
    echo "*****Use the script like: sh manual_con_static_ip.sh a122-v00 192.168.5.123 24 192.168.5.1"
    exit
fi

#為4個位置參數設置變量
CONTAINERID=$1
SETIP=$2
SETMASK=$3
GATEWAY=$4

#判斷容器是否已存在
ethlist=($(docker ps|grep -w "$CONTAINERID"|awk '{print $1}'))
if [[ ${#ethlist[@]} -ne 1 ]];then
    echo "can not ensure the container"
    exit 1
fi

#設置變量name等於容器ID,設定虛擬網卡名稱等於veth+$name前6位
echo $*
name=${ethlist[0]}
ETHNAME="veth${name:0:6}"

#判斷該虛擬網卡網卡是否存在,如果存在,則提示是否刪除
ifconfig $ETHNAME > /dev/null 2>&1
if [ $? -eq 0 ]; then
    read -p "$ETHNAME exist,do you want delelte it? y/n " del
    if [[ $del == 'y' ]]; then
    ip link del $ETHNAME
    else
    exit
    fi
fi

#獲取容器PID
pid=`docker inspect -f '{{.State.Pid}}' $CONTAINERID`
mkdir -p /var/run/netns
find -L /var/run/netns -type l -delete

#判斷容器的網絡名稱空間是否已存在,如果存在則刪除
if [ -f /var/run/netns/$pid ]; then
    rm -f /var/run/netns/$pid
fi

#創建名稱空間,將容器的網絡名稱空間軟鏈接到/var/run/netns/
ln -s /proc/$pid/ns/net /var/run/netns/$pid

#添加一對虛擬網卡
ip link add $ETHNAME type veth peer name $pid"1"

#將虛擬網卡添加到網橋veth1
brctl addif veth1 $ETHNAME

#啟動虛擬網卡
ip link set $ETHNAME up

#將虛擬網卡添加到容器的網絡名稱空間
ip link set $pid"1" netns $pid

#刪除容器內已存在的eth1
ip netns exec $pid ip link del eth1 > /dev/null 2>&1

#將容器內的網卡$pid"1"重命名為eth1,並啟動
ip netns exec $pid ip link set dev $pid"1" name eth1
ip netns exec $pid ip link set eth1 up

#為容器的eth1網卡設置IP地址和掩碼,添加默認網關
ip netns exec $pid ip addr add $SETIP/$SETMASK dev eth1
ip netns exec $pid ip route add default via $GATEWAY

4、腳本使用方法

/root/bin/mkipinner.sh <container_name> <ip_address> <netmask_num> <gateway>

示例:

# /root/bin/mkipinner.sh uy01-05-v10 192.168.10.186 20 192.168.1.254

5、單獨修改網關

# ip netns exec `docker inspect -f '{{.State.Pid}}' $CONTAINERID` ip route del default via 192.168.1.248
# ip netns exec `docker inspect -f '{{.State.Pid}}' $CONTAINERID` ip route add default via 192.168.1.254

合成一條命令,盡量減少網絡中斷時間

# for id in `cat id`;do ip netns exec `docker inspect -f '{{.State.Pid}}' $id` ip route del default via 192.168.1.248 && ip netns exec `docker inspect -f '{{.State.Pid}}' $id` ip route add default via 192.168.1.254;done

在容器內測試網絡

# route -n
# curl myip.oupeng.com
122.14.206.132


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM