dever 7 年之前
父節點
當前提交
ddef6da6f0

+ 8 - 0
README.md

@@ -224,4 +224,12 @@ ds rm web-nginx:删除nginx集群
 ds num web-nginx 10:将nginx集群的数量增加到10
 
 之后将把consul和daemon加入进去,并实现可视化
+</pre>
+
+<pre>
+2018-6-22更新:
+1、优化底层容器的启动脚本,增加启动进程的记录,方便监控进程的状态,如果进程死掉,可以自动重启。
+2、增加overlay网络的跨主机支持,增加docker run可以直接使用swarm网络,方便docker单机与集群的联通。添加overflow网络时,建议加上overlay_前缀
+3、开始增加daemon进程,现在暂时只有consul,来做服务发现及kv存储。
+
 </pre>

+ 1 - 1
src/core.py

@@ -195,7 +195,7 @@ class Config(object):
 
 class Alias(object):
 	@classmethod
-	def delete(self, config, name):
+	def delete(self, config, name, cluster=False):
 		result = self.get(config, name)
 		for key in result:
 			action = self.action(name, key)

+ 2 - 2
src/docker/build/os/alpine/v3.4/entrypoint.sh

@@ -73,7 +73,7 @@ start()
         start="start_$@"
         state=`define $start`
         if [ $state = 1 ];then
-            echo $start
+            echo $start > /process
             status=`$start`
             echo $status
             netstat -apn
@@ -115,7 +115,7 @@ trap "stop $1" HUP INT QUIT ABRT KILL ALRM TERM EXIT
 while true
 do
     monit $@
-    sleep 10
+    sleep 5
 done
 #exec sh
 exit 0

+ 9 - 2
src/docker/build/os/alpine/v3.4/process.sh

@@ -38,12 +38,19 @@ process_restart()
 {
     process_stop $1
     sleep 5
-    process_start $1
+    p=`process_command`
+    echo `$p`
 }
 process_monit()
 {
     status=`process_status $1`
     if [ "$status" == 1 ]; then
-        process_start $@
+        p=`process_command`
+        echo `$p`
     fi
+}
+process_command()
+{
+    p=$(cat /process)
+    echo $p
 }

+ 2 - 2
src/docker/build/service/consul/consul.sh

@@ -18,10 +18,10 @@ start_consul()
 
 stop_consul()
 {
-	true
+	process_stop consul
 }
 
 monit_consul()
 {
-	true
+	process_monit consul
 }

+ 1 - 1
src/docker/build/web/nginx/concat/nginx.sh

@@ -9,7 +9,7 @@ start_nginx()
 
 stop_nginx()
 {
-    nginx -s stop
+	process_stop nginx
 }
 
 monit_nginx()

+ 5 - 4
src/docker/conf/daemon.conf

@@ -1,17 +1,18 @@
 [base]
 path = {base}
 default = master
+network = overlay_dm
 
 [master]
 image = consul
 volumes = {container}conf/service/consul:/root/consul/config
-command = consul -server -data-dir=/root/consul/data -config-dir=/root/consul/config -client=0.0.0.0 -node={name}
+command = consul -server -bootstrap-expect 3 -data-dir=/root/consul/data -config-dir=/root/consul/config -client=0.0.0.0 -node={name} -dc={name}
 alias = consul
 slave = 2
-slave_command = consul -server -data-dir=/root/consul/data -config-dir=/root/consul/config -client=0.0.0.0 -join={parent}
+slave_command = consul -server -data-dir=/root/consul/data -config-dir=/root/consul/config -client=0.0.0.0 -join={parent} -dc={parent}
 
 [client]
 image = consul
 volumes = {container}conf/service/consul:/root/consul/config
-command = consul -client -client=0.0.0.0 -node={name}
-alias = consul
+command = consul -data-dir=/root/consul/data -client=0.0.0.0 -join=daemon-master -dc=daemon-master
+alias = consul->consul_client

+ 2 - 0
src/docker/conf/web.conf

@@ -6,6 +6,7 @@ default = mysql,php7,nginx
 port = 3309:3306
 volumes = {container}conf/db/mysql:/etc/mysql,/mysql/{name}/data:/var/lib/mysql
 environment = MYSQL_ROOT_PASSWORD=123456
+alias = mysql
 
 [mariadb]
 #使用mariadb来代替mysql
@@ -13,6 +14,7 @@ image = mariadb
 port = 3310:3306
 volumes = {container}conf/db/mariadb:/etc/mysql,/mysql/{name}/data:/var/lib/mysql
 environment = MYSQL_ROOT_PASSWORD=123456
+alias = mysql
 
 [php5]
 image = php5

+ 1 - 1
src/shell/container/restart

@@ -1,4 +1,4 @@
 #!/usr/bin/env sh
 set -e
 
-docker restart $1
+docker restart --time=5 $1

+ 4 - 0
src/shell/image/pull

@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+set -e
+
+docker pull $1

+ 4 - 0
src/shell/swarm/leave

@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+set -e
+
+docker swarm leave

+ 16 - 8
src/tool/cluster.py

@@ -40,6 +40,12 @@ class Cluster(Docker):
 			self.next(config, action)
 
 class Cluster_Action(Docker_Action):
+
+	@staticmethod
+	def leave():
+		result = Swarm.leave()
+		print result
+
 	@staticmethod
 	def drop():
 		Swarm.drop()
@@ -215,8 +221,6 @@ class Cluster_Action(Docker_Action):
 	def init(self, **param):
 		(ip, ckey) = self.setting()
 		token = Swarm.init(ip)
-		print token
-		return
 		
 		if token and '--token' in token:
 			command = 'ds run daemon-master'
@@ -225,6 +229,8 @@ class Cluster_Action(Docker_Action):
 			token = token.split('docker swarm join --token ')
 			token = token[1].split("\r\n")
 			token = token[0].replace(' ', ':')
+			data = token.split(':')
+			ip = data[1]
 
 			command = 'consul kv put ' + ckey + ' ' + token
 			Core.popen(command, True, bg=True)
@@ -252,14 +258,14 @@ class Cluster_Action(Docker_Action):
 			command = 'dm run daemon-client'
 			Core.popen(command, True, bg=False)
 
-			command = 'consul join ' + config[1]
-			Core.popen(command, True, bg=False)
-
 			print 'join cluster:yes'
 			'''
 
 class Swarm(object):
-
+	@staticmethod
+	def leave():
+		result = Core.shell('docker.leave')
+		return result
 	@staticmethod
 	def name(name):
 		result = Core.shell('docker.name ' + name)
@@ -326,8 +332,10 @@ class Swarm(object):
 	def network(self, config):
 		if 'network' in config:
 			name = 'overlay'
-			driver = '--driver=' + name
-			config['network'] = name + '_' + config['network']
+			# swarm 的 overlay网络,如果想用普通的docker run也能使用,必须加上attachable
+			driver = '--driver=' + name + ' --attachable '
+			if 'overlay' not in config['network']:
+				config['network'] = name + '_' + config['network']
 			self.conf['base']['network'] = config['network']
 
 			result = int(Core.popen('docker network ls | grep ' + config['network'] + ' | wc -l'))

+ 23 - 1
src/tool/docker.py

@@ -233,6 +233,19 @@ class Docker_Action(object):
 		for key in package:
 			Image.push(package[key])
 
+	@classmethod
+	def pull(self):
+		package = self.package()
+		if Args.name != '':
+			if Args.name in package:
+				Image.pull(package[Args.name])
+			else:
+				print 'error ' + Args.name
+			sys.exit()
+
+		for key in package:
+			Image.pull(package[key])
+
 	@classmethod
 	def login(self):
 		if Args.name and Args.name in Docker.core['store']:
@@ -487,7 +500,10 @@ class Container(object):
 	@staticmethod
 	def network(self, config):
 		if 'network' in config:
-			name = 'bridge'
+			if 'overlay' in config['network']:
+				name = 'overlay --attachable '
+			else:
+				name = 'bridge'
 			driver = '--driver=' + name
 			result = int(Core.popen('docker network ls | grep ' + config['network'] + ' | wc -l'))
 			if result == 0:
@@ -515,6 +531,12 @@ class Image(object):
 			for value in stores:
 				#print store + ' ' + value
 				Core.shell('image.push ' + store + ' ' + value, bg=True)
+	@classmethod
+	def pull(self, stores):
+		store = stores[0]
+		if self.check(store) == 1:
+			del stores[0]
+			print Core.shell('image.pull ' + store, True)
 	@staticmethod
 	def show():
 		print Core.shell('image.show')