【轉】docker中使用固定IP(重啟后消失)


Docker中使用固定IP

博客分類:
 
方法一: pipwork工具 
1. 安裝 
下載pipework工具, 然后配置到path路徑. 
$ git clone https://github.com/jpetazzo/pipework.git 
$ sudo cp -rp pipework/pipework /usr/local/bin/ 
$ sudo yum -y install apring bridge-utils 

2. 網絡設定 
# 刪除容器之后刪除網絡  
ip link set br0 down 
brctl delbr br0 
# 創建網絡 
brctl addbr br0; 
ip link set dev br0 up; 
ip addr add 192.168.2.1/24 dev br0; 

docker stop db; 
docker start db; 
pipework br0 db 192.168.2.103/24; 




3. 創建容器和設定IP 
docker run -d -e SERVERADMIN="mail@domain.com" -e DEFAULT_LOGS_DIR="/logs/httpd/defaults" --name=apache -v /home/pandy/docker-resources/apache/conf:/etc/httpd/conf -v /home/pandy/docker-resources/apache/html:/var/www/html pandy/apache 
pipework br0 apache 192.168.2.100/24; 




方法二: Docker中使用固定IP:  http://yaxin-cn.github.io/Docker/docker-container-use-static-IP.html 
注意:重啟電腦之后ip依然改變 
創建容器 
docker run -i -t --rm --net='none' --name test centos:centos7 /bin/bash 
container id =>b3ae71122656 
docker inspect -f "{{.State.Pid}}"  b3ae71122656   //這個容器id對應的pid 
輸出:8948    , 注意, 記住這個符號 

創建一個鏈接, 打開另一個終端, 輸入 
sudo mkdir -p /var/run/netns 
sudo ln -s /proc/8948/ns/net /var/run/netns/8948 

然后 創建一對端到端的網卡,將veth_db84e747c3綁定到docker0網橋,並啟動。將另一塊網卡X放到container內部 
sudo ip link add veth_db84e747c3 type veth peer name X 
sudo brctl addif docker0 veth_db84e747c3 
sudo ip link set veth_db84e747c3 up 
sudo ip link set X netns 8948 

在docker容器里面查看:ip addr 
[root@b3ae71122656 /]# ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
    inet 127.0.0.1/8 scope host lo 
       valid_lft forever preferred_lft forever 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever 
6: X: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 
    link/ether c6:d8:5f:f6:fa:6a brd ff:ff:ff:ff:ff:ff 
    
然后對container內部新添加的網卡進行配置(可以通過man ip-netns更詳細查看) 
sudo ip netns exec 8948 ip link set dev X name eth0   //重新命名容器內部的網卡叫eth0 
sudo ip netns exec 8948 ip link set eth0 up 
sudo ip netns exec 8948 ip addr add 172.17.111.10/16 dev eth0   //配置網卡 
sudo ip netns exec 8948 ip route add default via 172.17.42.1 

測試: 
ping 172.17.111.10 
PING 172.17.111.10 (172.17.111.10) 56(84) bytes of data. 
64 bytes from 172.17.111.10: icmp_seq=1 ttl=64 time=0.097 ms 
64 bytes from 172.17.111.10: icmp_seq=2 ttl=64 time=0.076 ms 

命令組成的文件 
Python代碼   收藏代碼
  1. #!/usr/bin/env bash   
  2. # filename: bind_addr.sh  
  3. # 調用方式:[root@bogon pandy]# ./bind_addr.sh test 192.168.2.11  
  4. if [ `id -u` -ne 0 ];  
  5.   then echo '必須使用root權限' exit   
  6. fi   
  7.   
  8. if [ $# != 2 ];   
  9.   then echo "使用方法: $0 容器名字 IP" exit 1   
  10. fi   
  11.   
  12. container_name=$1 bind_ip=$2 container_id=`docker inspect -f '{{.Id}}' $container_name 2> /dev/null`   
  13.   
  14. if [ ! $container_id ];  
  15.   then echo "容器不存在" exit 2  
  16. fi   
  17.   
  18. bind_ip=`echo $bind_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])$'`   
  19.   
  20. if [ ! $bind_ip ];  
  21.   then echo "IP地址格式不正確" exit 3  
  22. fi   
  23.   
  24. container_minid=`echo $container_id | cut -c 1-10`  
  25. container_netmask=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f2`  
  26. container_gw=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f1`  
  27. bridge_name="veth_$container_minid"  
  28. container_ip=$bind_ip/$container_netmask  
  29. #pid=`docker inspect -f '{{.State.Pid}}' salt-master 2> /dev/null`  
  30. pid=`docker inspect -f '{{.State.Pid}}' $container_name 2> /dev/null`  
  31. echo "pid=$pid"  
  32. if [ ! $pid ];  
  33.   then echo "獲取容器$container_name的id失敗" exit 4   
  34. fi   
  35.   
  36. if [ ! -d /var/run/netns ];  
  37.   then mkdir -p /var/run/netns   
  38. fi  
  39.   
  40. ln -sf /proc/$pid/ns/net /var/run/netns/$pid   
  41.   
  42. echo "開始設定IP"  
  43. echo "====================================================="  
  44. ip link add $bridge_name type veth peer name X   
  45. brctl addif docker0 $bridge_name   
  46. ip link set $bridge_name up   
  47. ip link set X netns $pid   
  48. ip netns exec $pid   
  49. ip link set dev X name eth0   
  50. ip netns exec $pid   
  51. ip link set eth0 up   
  52. ip netns exec $pid   
  53. ip addr add $container_ip dev eth0   
  54. ip netns exec $pid   
  55. ip route add default via $container_gw  
  56. echo "====================================================="  


免責聲明!

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



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