• 【转】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" | awk '{print $2}' | cut -d / -f2`  
    26. container_gw=`ip addr show docker0 | grep "inet" | 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 "====================================================="  
  • 相关阅读:
    数学笔记目录
    机器学习笔记目录
    物理学笔记目录
    二阶递推公式的通项公式
    分析Analysis 笔记
    从傅里叶变换到小波变换
    电动力学 期末复习
    电动力学 期中复习
    热学 期中复习
    理论力学第一章 Lagrange方程
  • 原文地址:https://www.cnblogs.com/puremans/p/6415692.html
Copyright © 2020-2023  润新知