docker 固定IP

Posted on Posted in docker
Tips: 本文创建于2015年11月23日,已超过 2 年,内容或图片可能已经失效!

docker固定ip这件事,以前一直感觉是个缺陷,后来操作感觉也没什么用,记录下。
具体操作
docker_fixed_ip.sh containername contianerip

  1. #!/bin/bash  
  2. if [ $(id -u) != "0" ]; then  
  3.     echo "Error: Must be root to run this script!"  
  4.     exit 1  
  5. fi  
  6. if [ $# -eq "2" ]; then  
  7.     echo ""  
  8.     echo "start backup ..."  
  9. else  
  10.     echo "You can run the script like this: eg.sh dockername dockerip"  
  11.     exit 1  
  12. fi  
  13. container_name=$1  
  14. container_ip=$2  
  15. container_id=`docker inspect -f '{{.Id}}' $container_name 2> /dev/null`  
  16. if [ ! $container_id ];then  
  17.     echo "容器不存在"  
  18.     exit 2  
  19. fi  
  20. bind_ip=`echo $container_ip | egrep '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'`  
  21. if [ ! $bind_ip ];then  
  22.     echo "IP地址格式不正确"  
  23.     exit 3  
  24. fi  
  25. container_minid=`echo $container_id | cut -c 1-10`  
  26. container_netmask=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f2`  
  27. container_gw=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f1`  
  28. bridge_name="veth_$container_minid"  
  29. container_full_ip=$container_ip/$container_netmask  
  30. pid=`docker inspect -f '{{.State.Pid}}' $container_name 2> /dev/null`  
  31. if [ ! $pid ];then  
  32.     echo "获取容器$container_name的id失败"  
  33.     exit 4  
  34. fi  
  35. if [ ! -d /var/run/netns ];then  
  36.     mkdir -p /var/run/netns  
  37. fi  
  38. ln -sf /proc/$pid/ns/net /var/run/netns/$pid  
  39.   
  40. ip link add $bridge_name type veth peer name X  
  41. brctl addif docker0 $bridge_name  
  42. ip link set $bridge_name up  
  43. ip link set X netns $pid  
  44. ip netns exec $pid ip link set dev X name eth0  
  45. ip netns exec $pid ip link set eth0 up  
  46. ip netns exec $pid ip addr add $container_full_ip dev eth0  
  47. ip netns exec $pid ip route add default via $container_gw  

清理网络

  1. # stop and delete container  
  2. docker stop containername  
  3. docker rm containername  
  4. # delete docker's net namespace (also delete veth pair)  
  5. ip netns delete $pid    #pid上面脚本中获取的  docker inspect -f '{{.State.Pid}}' $container_name  
» 转载请注明来源:若我若鱼 » docker 固定IP

Leave a Reply

Your email address will not be published. Required fields are marked *

sixteen − eight =