docker高级应用之单机持久化固定容器IP

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

过完年了,快1个月没有写博客,现在给大家分享一下我是如何在单机环境,实现持久化固定容器IP。

我是去年6月份开始玩docker,到现在已经9个月了,docker的最新版本也到了1.5.目前我这里对docker已经放到测试环境给研发使用,目前感觉最大的问题就是容器手动重启或者异常关闭后在启动容器,那么容器的ip就回变化(这个是使用默认的docker0做桥接),如果使用pipework手动配置ip,也得重新在来一遍,很是麻烦,所以我写了一个程序来自动化的解决这个问题。

一、程序介绍

使用到的程序有2个:

1、创建容器程序,名字是create_docker_container_use_static_ip.sh,使用shell脚本编写。

2、监控容器状态并自动给重启没有ip的容器设置ip,名字是auto_check_modify_container.py,使用python编写。

创建容器程序的逻辑:

1、运行创建脚本来创建docker container;

2、创建的信息会写入到etcd里进行保存;

3、根据配置信息来创建具体的container。

其中我程序使用openvswitch来坐桥接,并对不同vlan做不同的网段设置。

监控容器并给自动重启设置ip程序逻辑:

1、从etcd里获取容器的信息;

2、根据第一步的信息,进行nmap扫描ssh服务是否启动,未启动的转给下一步;

3、收到上一步的ip,然后根据etcd的容器信息进行重新pipework配置之前的固定ip。

下面是创建容器程序脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/bash
#author:Deng Lei
#email: dl528888@gmail.com
#this script is create new docker container and use pipework add static ip,when container is restart,it also use last static ip
container=$1
images=$2
daemon_program=$3
vlan_tag=$4
#ip_pool='172.16.10.1/24'
bridge=ovs2
default_vlan=1
default_vlan_ip= '172.16.0.1/24'
email= '244979152@qq.com'
local_ip=` /sbin/ifconfig  grep  'inet' grep  -Ev  '(127|117|211|172|::1|fe)'  | awk  '{print $2}' | head  -n 1`
if  [ -z $1 ] || [ -z $2 ];  then
     echo  "Usage: container_name container_image vlan_tag(default:1)"
     echo  "Example: I want create new docker container test1 centos6:latest supervisord vlan 100"
     echo  "The command is: bash `basename $0` test1 centos6:latest supervisord 100"
     exit  1
fi
[ `docker  ps  -a| grep  - v  "NAMES" | awk  '{print $NF}' | grep  "$container"  &>> /dev/null  &&  echo  0 ||  echo  1` - eq  0 ] &&  echo  "The container $container is exist!"  &&  exit  1
[ ` which  pipework &> /dev/null  &&  echo  0||  echo  1` - eq  1 ] &&  echo  "I can't find pipework,please install it!"  &&  exit  1
if  [ -z $3 ]; then
     vlan_tag=${default_vlan}
fi
#create new docker container
docker run --restart always -d --net= "none"  --name= "$container"  $images $daemon_program &>> /dev/null
#check openvswitch bridge exist
if  [ `ovs-vsctl  list-br | grep  ${bridge} &> /dev/null  &&  echo  0||  echo  1` - eq  1 ]; then
     ovs-vsctl add-br ${bridge}
fi
#set up default vlan info
check_default_vlan_exist=`etcdctl get  /app/docker/ ${local_ip} /vlan ${default_vlan} /gateway  2> /dev/null  ||  echo  1`
if  [ ${check_default_vlan_exist} =  "1"  ]; then
     ovs-vsctl add-port $bridge vlan${default_vlan} tag=${default_vlan} --  set  interface vlan${default_vlan}  type =internal
     #ifconfig vlan${default_vlan} ${default_vlan_ip}
     ip link  set  vlan${default_vlan} up
     ip addr add $default_vlan_ip dev vlan${default_vlan}
     etcdctl  set  /app/docker/ ${local_ip} /vlan ${default_vlan} /nowip  $default_vlan_ip &>> /dev/null
     etcdctl  set  /app/docker/ ${local_ip} /vlan ${default_vlan} /gateway  $default_vlan_ip &>> /dev/null
     etcdctl  set  /app/docker/now_vlan_ip  $default_vlan_ip &>> /dev/null
fi
#set up new vlan info
new_vlan_gateway_ip=`etcdctl get  /app/docker/ ${local_ip} /vlan ${vlan_tag} /gateway  2> /dev/null  ||  echo  1`
if  [ ${new_vlan_gateway_ip} =  "1"  ]; then
     sleep  1
     now_vlan_ip=`etcdctl get  /app/docker/now_vlan_ip `
     new_vlan_ip=$( awk  - v  new_ip=` echo  $now_vlan_ip| cut  -d/ -f 1| awk  -F '.'  '{print $1"."$2"."$3+1"."$4}' ` - v  new_ip_netmask=` echo  $now_vlan_ip| cut  -d/ -f2`  'BEGIN{print new_ip"/"new_ip_netmask}' )
     ovs-vsctl add-port $bridge vlan${vlan_tag} tag=${vlan_tag} --  set  interface vlan${vlan_tag}  type =internal
     ip link  set  vlan${vlan_tag} up
     ip addr add ${new_vlan_ip} dev vlan${vlan_tag}
#    ifconfig vlan${vlan_tag} ${new_vlan_ip}
     etcdctl  set  /app/docker/now_vlan_ip  ${new_vlan_ip} &>> /dev/null
     etcdctl  set  /app/docker/ ${local_ip} /vlan ${vlan_tag} /gateway  ${new_vlan_ip} &>> /dev/null
     etcdctl  set  /app/docker/ ${local_ip} /vlan ${vlan_tag} /nowip  ${new_vlan_ip} &>> /dev/null
     new_vlan_gateway_ip=${new_vlan_ip}
fi
 
#calculate new ip
sleep  1
now_container_ip=`etcdctl get  /app/docker/ ${local_ip} /vlan ${vlan_tag} /nowip `
echo  "now container ip is:$now_container_ip"
new_container_ip=$( awk  - v  new_ip=` echo  $now_container_ip| cut  -d/ -f 1| awk  -F '.'  '{print $1"."$2"."$3"."$4+1}' ` - v  new_ip_netmask=` echo  $now_container_ip| cut  -d/ -f2`  'BEGIN{print new_ip"/"new_ip_netmask}' )
etcdctl  set  /app/docker/ ${local_ip} /vlan ${vlan_tag} /nowip  $new_container_ip &> /dev/null
echo  "finish calculate new ip!"
create_time=` date  + "%Y-%m-%d %T" `
` which  pipework` $bridge $container ${new_container_ip}@` echo  ${new_vlan_gateway_ip}| awk  -F  '/'  '{print $1}' ` @${vlan_tag}
etcdctl  set  /app/docker/ ${local_ip} /vlan ${vlan_tag} /container/ ${container}  "{'Physics_ip':'${local_ip}','Container_name':'${container}','Container_ip':'${new_container_ip}','Container_vlan':'${vlan_tag}','Container_vlan_gateway':'${new_vlan_gateway_ip}','Container_create':'${create_time}','Container_status':'running'}"

注意:如果想使用本程序,客户端必须安装openvswitch、etcd与etcdctl、pipework。

监控容器并给自动重启设置ip程序脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/env python
#author:Deng Lei
#email: dl528888@gmail.com
import  sys
import  nmap
import  multiprocessing
import  time
import  socket, struct, fcntl
import  etcd
import  re
from docker  import  Client
import  subprocess
def get_local_ip(iface =  'em1' ):
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     sockfd = sock.fileno()
     SIOCGIFADDR = 0x8915
     ifreq = struct.pack( '16sH14s' , iface, socket.AF_INET,  '\x00' *14)
     try:
     res = fcntl.ioctl(sockfd, SIOCGIFADDR, ifreq)
     except:
     return  None
     ip = struct.unpack( '16sH2x4s8x' , res)[2]
     return  socket.inet_ntoa(ip)
def get_etcd_info(key):
     etcd_result=[]
     r = etcd_client. read ( '%s%s' %(docker_etcd_key,local_ip), recursive=True, sorted=True)
     for  child  in  r.children:
         if  child. dir  is not True and  "Container_name"  in  child.value:
             etcd_result.append(child.value)
     return  etcd_result
def check_by_nmap(ip,port):
     check_result=len(nm.scan( '%s' %ip, '%s' %port)[ 'scan' ])
     if  check_result == 0:
         msg= '%s' %(ip)
         return  msg
def docker_container_stop():
     docker_container=docker_client.containers(all=True)
     container_name=[]
     container_stop_name=[]
     for  in  docker_container:
         if  re.match( 'Exited' ,i[ 'Status' ]):
             container_name.append(i[ 'Names' ])
     for  in  container_name:
         for  in  b:
         container_stop_name.append(c)
     return  container_stop_name
def docker_container_all():
     docker_container=docker_client.containers(all=True)
     container_name=[]
     container_stop_name=[]
     for  in  docker_container:
     container_name.append(i[ 'Names' ])
     for  in  container_name:
         for  in  b:
             container_stop_name.append(c)
     return  container_stop_name
 
if  __name__ ==  "__main__" :
     nm = nmap.PortScanner()
     etcd_client=etcd.Client(host= '127.0.0.1' , port=4001)
     docker_client = Client(base_url= 'unix://var/run/docker.sock' , version= '1.15' , timeout=10)
     local_ip=get_local_ip( 'ovs1' )
     bridge= 'ovs2'
     docker_etcd_key= '/app/docker/'
     port= '22'
     ip_list=[]
     now_etcd_result=get_etcd_info(docker_etcd_key)
     docker_container_stop_name=docker_container_stop()
     docker_container_all_name=docker_container_all()
     for  in  range(len(now_etcd_result)):
         now_info= eval (now_etcd_result[i])
     key= '%s%s/vlan%s/container/%s' %(docker_etcd_key,local_ip,now_info[ 'Container_vlan' ],now_info[ 'Container_name' ])
         if  '/' +now_info[ 'Container_name' ] not  in  docker_container_stop_name and now_info[ 'Container_status' ] !=  'delete' :
         ip_list.append( eval (now_etcd_result[i])[ 'Container_ip' ]. split ( '/' )[0])
          if  now_info[ 'Container_status' ] ==  'stop' :
            now_info[ 'Container_status' ]= 'running'
         etcd_client.write(key,now_info)
         else :
             now_info[ 'Container_status' ]= 'stop'
         etcd_client.write(key,now_info)
     if  '/' +now_info[ 'Container_name' ] not  in  docker_container_all_name:
         print  '%s %s will delete,because docker client had deleted!' %( time .strftime( '%Y-%m-%d %T' ),key)
             now_info[ 'Container_status' ]= 'delete'
         etcd_client.write(key,now_info)
     ip_list=list( set (ip_list))
     if  len(ip_list) == 1:
         num=1
     elif  len(ip_list)>=4 and len(ip_list)<=8:
         num=4
     elif  len(ip_list) >8 and len(ip_list)<=20:
         num=8
     else :
         num=15
     pool = multiprocessing.Pool(processes=num)
     scan_result=[]
     for  in  ip_list:
         pool.apply_async(check_by_nmap, (i,port, ))
         scan_result.append(pool.apply_async(check_by_nmap, (i,port, )))
     pool.close()
     pool. join ()
     result=[]
     for  res  in  scan_result:
         if  res.get() is not None:
             result.append(res.get())
     result=list( set (result))
     if  len(result) <= 0:
         print  '%s Everything is all right!' % time .strftime( '%Y-%m-%d %T' )
         sys. exit (1)
     else :
         print  '%s container need modify container static ip is:%s' %( time .strftime( '%Y-%m-%d %T' ),result)
     for  in  range(len(now_etcd_result)):
         now_info= eval (now_etcd_result[i])
         if  (now_info[ 'Container_ip' ]). split ( '/' )[0]  in  result:
         modify_container=subprocess.Popen( "`which pipework` %s %s %s@%s @%s &>>/dev/null && echo 0 || echo 1" %(bridge,now_info[ 'Container_name' ],now_info[ 'Container_ip' ],now_info[ 'Container_vlan_gateway' ]. split ( '/' )[0],now_info[ 'Container_vlan' ]),shell=True,stdout=subprocess.PIPE)
         if  (modify_container.stdout.readlines()[0]).strip( '\n' ) == 0:
               print  'container_name:%s container_ip:%s modify static ip is  fail!' %(now_info[ 'Container_name' ],now_info[ 'Container_ip' ])
         else :
             print  'container_name:%s container_ip:%s modify static ip is success!' %(now_info[ 'Container_name' ],now_info[ 'Container_ip' ])

注意:使用本脚本必须安装nmap、etcd、docker模块。

其中python里nmap的安装方法是

1
easy_install python-nmap

其中python里etcd的安装方法是

安装基础库

1
yum  install  libffi libffi-devel python-devel

安装程序

1
2
3
git clone https: //github .com /jplana/python-etcd .git
cd  python-etcd
python setup.py  install

其中python里docker的安装方法是

1
easy_install docker-py

二、效果展示

需求:

创建主机test1、test2、test3、test4,需要test1与test2属于vlan100,test3与test4属于vlan300,架构图如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                 ovs2
                   |
                   |
             -----------------   
             |               |
             |               |
vlan100(tag100)         vlan300(tag300)
       |                             |
       |                             |
   -----------              ----------------------      
   |         |               |                  | 
   |         |               |                  |
test1      test2           test3             test4
(tag100)   (tag100)       (tag300)          (tag300)

下面是操作

1、创建ovs1、ovs2网桥,其中em1绑定到ovs1走内网,ovs2是容器的网络

1
2
3
4
5
6
ovs-vsctl add-br ovs1
ovs-vsctl add-br ovs2
ovs-vsctl add-port ovs1 em1
ip link  set  ovs1 up
ifconfig  em1 0
ifconfig  ovs1 10.10.17.3

2、创建test1、test2、test3、test4的容器

1
2
3
4
5
6
7
8
[root@docker-test3 ~] # sh create_docker_container_use_static_ip.sh test1 docker.ops-chukong.com:5000/centos6-http:new /usr/bin/supervisord 100
{ 'Physics_ip' : '10.10.17.3' , 'Container_name' : 'test1' , 'Container_ip' : '172.16.1.2/24' , 'Container_vlan' : '100' , 'Container_vlan_gateway' : '172.16.1.1/24' , 'Container_create' : '2015-03-02 14:59:59' , 'Container_status' : 'running' }
[root@docker-test3 ~] # sh create_docker_container_use_static_ip.sh test2 docker.ops-chukong.com:5000/centos6-http:new /usr/bin/supervisord 100
{ 'Physics_ip' : '10.10.17.3' , 'Container_name' : 'test2' , 'Container_ip' : '172.16.1.3/24' , 'Container_vlan' : '100' , 'Container_vlan_gateway' : '172.16.1.1/24' , 'Container_create' : '2015-03-02 15:00:09' , 'Container_status' : 'running' }
[root@docker-test3 ~] # sh create_docker_container_use_static_ip.sh test3 docker.ops-chukong.com:5000/centos6-http:new /usr/bin/supervisord 300
{ 'Physics_ip' : '10.10.17.3' , 'Container_name' : 'test3' , 'Container_ip' : '172.16.2.2/24' , 'Container_vlan' : '300' , 'Container_vlan_gateway' : '172.16.2.1/24' , 'Container_create' : '2015-03-02 15:00:22' , 'Container_status' : 'running' }
[root@docker-test3 ~] # sh create_docker_container_use_static_ip.sh test4 docker.ops-chukong.com:5000/centos6-http:new /usr/bin/supervisord 300
{ 'Physics_ip' : '10.10.17.3' , 'Container_name' : 'test4' , 'Container_ip' : '172.16.2.3/24' , 'Container_vlan' : '300' , 'Container_vlan_gateway' : '172.16.2.1/24' , 'Container_create' : '2015-03-02 15:00:31' , 'Container_status' : 'running' }

这个脚本第一个参数是创建的容器名,第二个参数是docker images,第三个参数是运行命令,第四个参数是vlan。

下面是当前docker信息

1
2
3
4
5
6
[root@docker-test3 ~] # docker ps -a
CONTAINER ID        IMAGE                                          COMMAND                CREATED              STATUS              PORTS               NAMES
386b4180b3d0        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    About a minute ago   Up About a minute                       test4
92fee54ec498        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    About a minute ago   Up About a minute                       test3
4dc84301894a        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    About a minute ago   Up About a minute                       test2
45d4a73c6ed0        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    2 minutes ago        Up 2 minutes                            test1

下面是openvswitch的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@docker-test3 ~] # ovs-vsctl show
d895d78b-8c89-49bc-b429-da6a4a2dcb3a
     Bridge  "ovs2"
         Port  "vlan300"
             tag: 300
             Interface  "vlan300"
                 type : internal
         Port  "ovs2"
             Interface  "ovs2"
                 type : internal
         Port  "veth1pl11491"
             tag: 100
             Interface  "veth1pl11491"
         Port  "veth1pl12003"
             tag: 300
             Interface  "veth1pl12003"
         Port  "vlan100"
             tag: 100
             Interface  "vlan100"
                 type : internal
         Port  "veth1pl12251"
             tag: 300
             Interface  "veth1pl12251"
         Port  "veth1pl11788"
             tag: 100
             Interface  "veth1pl11788"
         Port  "vlan1"
             tag: 1
             Interface  "vlan1"
                 type : internal
     Bridge  "ovs1"
         Port  "em1"
             Interface  "em1"
         Port  "ovs1"
             Interface  "ovs1"
                 type : internal
     ovs_version:  "2.3.1"

下面是etcd的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@docker-test3 ~] # etcdctl ls / --recursive|grep docker|grep "10.10.17.3/"
/app/docker/ip/vlan/10 .10.17.3 /gate_way
/app/docker/ip/vlan/10 .10.17.3 /now_ip
/app/docker/10 .10.17.3 /vlan300
/app/docker/10 .10.17.3 /vlan300/container
/app/docker/10 .10.17.3 /vlan300/container/test3
/app/docker/10 .10.17.3 /vlan300/container/test4
/app/docker/10 .10.17.3 /vlan300/gateway
/app/docker/10 .10.17.3 /vlan300/nowip
/app/docker/10 .10.17.3 /vlan1
/app/docker/10 .10.17.3 /vlan1/gateway
/app/docker/10 .10.17.3 /vlan1/nowip
/app/docker/10 .10.17.3 /vlan100
/app/docker/10 .10.17.3 /vlan100/gateway
/app/docker/10 .10.17.3 /vlan100/nowip
/app/docker/10 .10.17.3 /vlan100/container
/app/docker/10 .10.17.3 /vlan100/container/test1
/app/docker/10 .10.17.3 /vlan100/container/test2

查看test1的信息

1
2
[root@docker-test3 ~] # etcdctl get /app/docker/10.10.17.3/vlan100/container/test1
{ 'Physics_ip' : '10.10.17.3' , 'Container_name' : 'test1' , 'Container_ip' : '172.16.1.2/24' , 'Container_vlan' : '100' , 'Container_vlan_gateway' : '172.16.1.1/24' , 'Container_create' : '2015-03-02 14:59:59' , 'Container_status' : 'running' }

跟创建容器的信息一样

进入容器,然后查看设置ip情况

1
2
3
4
5
6
7
8
[root@docker-test3 ~] # docker exec  test1 ifconfig eth1|grep "inet addr"
           inet addr:172.16.1.2  Bcast:0.0.0.0  Mask:255.255.255.0
[root@docker-test3 ~] # docker exec  test2 ifconfig eth1|grep "inet addr"
           inet addr:172.16.1.3  Bcast:0.0.0.0  Mask:255.255.255.0
[root@docker-test3 ~] # docker exec  test3 ifconfig eth1|grep "inet addr"
           inet addr:172.16.2.2  Bcast:0.0.0.0  Mask:255.255.255.0
[root@docker-test3 ~] # docker exec  test4 ifconfig eth1|grep "inet addr"
           inet addr:172.16.2.3  Bcast:0.0.0.0  Mask:255.255.255.0

可以看到ip都是之前设置的

然后在test1里ping外网与test2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@docker-test3 ~] # docker exec  test1 ping -c1 www.baidu.com
PING www.a.shifen.com (180.149.131.205) 56(84) bytes of data.
64 bytes from 180.149.131.205: icmp_seq=1 ttl=54  time =1.94 ms
 
--- www.a.shifen.com  ping  statistics ---
1 packets transmitted, 1 received, 0% packet loss,  time  12ms
rtt min /avg/max/mdev  = 1.948 /1 .948 /1 .948 /0 .000 ms
[root@docker-test3 ~] # docker exec  test1 ping -c1 172.16.1.3
PING 172.16.1.3 (172.16.1.3) 56(84) bytes of data.
64 bytes from 172.16.1.3: icmp_seq=1 ttl=64  time =0.431 ms
 
--- 172.16.1.3  ping  statistics ---
1 packets transmitted, 1 received, 0% packet loss,  time  0ms
rtt min /avg/max/mdev  = 0.431 /0 .431 /0 .431 /0 .000 ms

可以看到都是通的

在从test3里ping外网与test4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@docker-test3 ~] # docker exec  test3 ping -c1 www.baidu.com
PING www.a.shifen.com (180.149.131.236) 56(84) bytes of data.
64 bytes from 180.149.131.236: icmp_seq=1 ttl=54  time =2.19 ms
 
--- www.a.shifen.com  ping  statistics ---
1 packets transmitted, 1 received, 0% packet loss,  time  12ms
rtt min /avg/max/mdev  = 2.197 /2 .197 /2 .197 /0 .000 ms
[root@docker-test3 ~] # docker exec  test3 ping -c1 172.16.2.3
PING 172.16.2.3 (172.16.2.3) 56(84) bytes of data.
64 bytes from 172.16.2.3: icmp_seq=1 ttl=64  time =0.504 ms
 
--- 172.16.2.3  ping  statistics ---
1 packets transmitted, 1 received, 0% packet loss,  time  0ms
rtt min /avg/max/mdev  = 0.504 /0 .504 /0 .504 /0 .000 ms

也是通的

3、关闭test1并测试

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@docker-test3 ~] # docker stop test1
test1
[root@docker-test3 ~] # docker ps -a
CONTAINER ID        IMAGE                                          COMMAND                CREATED             STATUS                     PORTS               NAMES
386b4180b3d0        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    12 minutes ago      Up 12 minutes                                  test4
92fee54ec498        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    12 minutes ago      Up 12 minutes                                  test3
4dc84301894a        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    12 minutes ago      Up 12 minutes                                  test2
45d4a73c6ed0        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    12 minutes ago      Exited (0) 2 seconds ago                       test1
[root@docker-test3 ~] # ping -c2 172.16.1.2
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
 
--- 172.16.1.2  ping  statistics ---
2 packets transmitted, 0 received, 100% packet loss,  time  999ms

可以看到test1关闭了,给予的ip也不能通了,下面启动容器,然后使用我自动检测与重新设置容器ip

1
2
3
4
5
6
7
8
9
10
11
[root@docker-test3 ~] # docker start test1
test1
[root@docker-test3 ~] # docker ps -a
CONTAINER ID        IMAGE                                          COMMAND                CREATED             STATUS              PORTS               NAMES
386b4180b3d0        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    13 minutes ago      Up 13 minutes                           test4
92fee54ec498        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    13 minutes ago      Up 13 minutes                           test3
4dc84301894a        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    13 minutes ago      Up 13 minutes                           test2
45d4a73c6ed0        docker.ops-chukong.com:5000 /centos6-http :new   " /usr/bin/supervisor    13 minutes ago      Up 2 seconds                            test1
[root@docker-test3 ~] # python auto_check_modify_container.py
2015-03-02 15:14:03 container need modify container static ip is:[ '172.16.1.2' ]
container_name:test1 container_ip:172.16.1.2 /24  modify static ip is success!

可以看到启动容器后,程序自动搜集之前的ip信息,并重新配置了

在test1里测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@docker-test3 ~] # docker exec  test1 ifconfig eth1|grep "inet addr"
           inet addr:172.16.1.2  Bcast:0.0.0.0  Mask:255.255.255.0
[root@docker-test3 ~] # docker exec  test1 ping -c1 www.baidu.com
PING www.a.shifen.com (180.149.131.236) 56(84) bytes of data.
64 bytes from 180.149.131.236: icmp_seq=1 ttl=54  time =2.18 ms
 
--- www.a.shifen.com  ping  statistics ---
1 packets transmitted, 1 received, 0% packet loss,  time  12ms
rtt min /avg/max/mdev  = 2.183 /2 .183 /2 .183 /0 .000 ms
[root@docker-test3 ~] # docker exec  test1 ping -c1 172.16.1.3
PING 172.16.1.3 (172.16.1.3) 56(84) bytes of data.
64 bytes from 172.16.1.3: icmp_seq=1 ttl=64  time =0.382 ms
 
--- 172.16.1.3  ping  statistics ---
1 packets transmitted, 1 received, 0% packet loss,  time  0ms
rtt min /avg/max/mdev  = 0.382 /0 .382 /0 .382 /0 .000 ms

测试都没有问题

大家以后使用的时候,可以先使用我的程序创建容器,然后把检测程序放到crontab里,每分钟自动运行,这样就能实现持久化固定ip。




 本文转自 reinxu 51CTO博客,原文链接:http://blog.51cto.com/dl528888/1616527,如需转载请自行联系原作者


相关文章
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
22 2
|
3天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
6天前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
54 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
4天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
5天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
5天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
5天前
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
7天前
|
NoSQL Redis Docker
【赵渝强老师】使用Docker Compose管理容器
Docker Compose 通过 YAML 文件管理多个容器,简化复杂系统的部署和管理。本文介绍了 Docker Compose 的基本概念,并通过一个包含 Redis DB 和 Python Web 模块的示例,展示了如何使用 Docker Compose 部署和管理多容器应用。手动部署和 Docker Compose 部署的对比突显了 Docker Compose 在系统复杂度增加时的优势。
|
15天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
11天前
|
关系型数据库 MySQL API