作为一个运维或者测试,可以不了解每天发布的五花八门的各种开源工具,但最好了解下docker,因为这东西必将在将来改变软件的微观和宏观架构。在虚拟化方兴未艾的时代,又迎来了docker这么个东东,继续在对传统软件架构进行拆分,多进程玩腻了,玩玩多容器?
根据几天的粗浅测试,发现几个有意思的特点:
1、隔离级别的问题。对于Application Container,从图中可以看到,其隔离级别必然是不如虚拟机的。但是,虽然看上去,docker容器的1号进程与宿主机完全不同,但是还是和宿主机存在联系,比如,在docker容器启动一个apache,会发现宿主机上也多了3个apache进程,而且是完全不同的进程号。
2、启动多个服务的问题。网上有人说可以把要启动的服务打包到一个脚本里,然后把这脚本COPY到镜像里,最后用CMD启动即可,俺始终没有试验成功。最后,还是supervisord管用,想拉多少服务都没问题。注意,在centos6.5的基本源里没有supervisord,必须先安装epel
3、IP地址问题。运行docker容器的时候,如:
# docker run --name=mysql_contain1 -h=mysql_host1 -d -P docker_mysql
可以设定容器名,可以设定容器主机名,但貌似没法设IP地址?
宿主机有个docker0的虚拟网卡,其地址是192.168.42.1,发现新建的docker容器ip地址就接着后面不断累加。
4、如果我们有了一个mysql镜像,是否可以根据宿主机负载阀值动态启动容器把负载接过去?做了个小实验,当宿主机的mysql连接数超过500的时候,启动一个mysql容器,代码没啥意义,纯属测试:
#!/usr/bin/python
# Filename: db3.py
# Description: a demo to access mysql based on dynamic docker containers
# Python 2.7.6
import MySQLdb
import commands
import os
import random
import time
image_name=‘docker_mysql‘
master_host_ip=‘127.0.0.1‘
prefix_cont=‘mysql_cont‘
num_thread=500
def getDockerip():
i=random.randint(1,10000)
shell=‘mysqladmin -uroot -proot status|awk \‘{print $4}\‘‘
try:
thread = int(commands.getoutput(shell))
except Exception:
print ‘get thread number of master sql error‘
exit(1)
if ( thread > num_thread ):
str=prefix_cont+‘%d‘ %i
os.environ[‘cont_name‘]=str
os.environ[‘image_name‘]=image_name
ret=os.system(‘docker run --name="$cont_name" -d -P $image_name >docker.log 2>&1‘)
if ( ret <> 0 ):
print ‘create docker for mysql error‘
exit(2)
shell2=‘docker inspect "$cont_name"|grep IPAddress|grep -Eo \‘[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\‘‘
str_ip=commands.getoutput(shell2)
return str_ip
return master_host_ip
def insertData(v):
des_host_ip=getDockerip()
print des_host_ip
print ‘begin to insert data to ‘+des_host_ip
time.sleep(3)
try:
my_conn=MySQLdb.connect(host=des_host_ip,port = 3306,user=‘root‘,passwd=‘root‘,db =‘db_test‘)
cur = my_conn.cursor()
sql="insert into t(id) values(‘%d‘)" %(v)
cur.execute(sql)
cur.close()
my_conn.commit()
my_conn.close()
print ‘insert data to ‘+des_host_ip+‘ successfully!‘
except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
exit(3)
insertData(2015)
(待续)