docker_api.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf import settings
  4. from docker import DockerClient
  5. from docker.errors import DockerException, NotFound, APIError, ContainerError, ImageNotFound
  6. import time
  7. '''
  8. '''
  9. def get_docker_client():
  10. try:
  11. return DockerClient(base_url='unix:/%s' % settings.DOCKER_SOCK_DIR)
  12. except DockerException:
  13. return None
  14. '''
  15. '''
  16. def get_all_images():
  17. client = get_docker_client()
  18. images = []
  19. if not client:
  20. return images
  21. for image in client.images.list():
  22. images.append({
  23. 'id': image.id,
  24. 'short_id': image.short_id,
  25. 'tags': image.tags
  26. })
  27. return images
  28. '''
  29. '''
  30. def get_all_containers():
  31. client = get_docker_client()
  32. containers = []
  33. if not client:
  34. return containers
  35. for container in client.containers.list(all=True):
  36. if container.name in settings.DOCKER_FILTERS:
  37. continue
  38. containers.append({
  39. 'id': container.id,
  40. 'short_id': container.short_id,
  41. 'name': container.name,
  42. 'image': container.image,
  43. 'labels': container.labels,
  44. 'status': container.status,
  45. 'attrs': container.attrs
  46. })
  47. return containers
  48. '''
  49. '''
  50. def get_all_external_ports():
  51. ports = []
  52. for m in map(lambda x: x.get('attrs').get('NetworkSettings').get('Ports'), get_all_containers()):
  53. if not m:
  54. continue
  55. for _, v in m.iteritems():
  56. if not v:
  57. continue
  58. port = map(lambda x: x['HostPort'], v)
  59. ports.extend(port)
  60. return ports
  61. '''
  62. '''
  63. def get_network(name=None):
  64. if not name:
  65. return None
  66. client = get_docker_client()
  67. if not client:
  68. return None
  69. try:
  70. network = client.networks.get(name)
  71. return {
  72. 'id': network.id,
  73. 'short_id': network.short_id,
  74. 'name': network.name,
  75. 'attrs': network.attrs
  76. }
  77. except (NotFound, APIError):
  78. return None
  79. '''
  80. '''
  81. def get_internal_ip(container_name_or_id=None):
  82. # check name
  83. if not container_name_or_id:
  84. return None
  85. # check client
  86. client = get_docker_client()
  87. if not client:
  88. return None
  89. # check network
  90. network = get_network(settings.INTERNAL_NETWORK_NAME)
  91. if not network:
  92. return None
  93. try:
  94. container = client.containers.get(container_name_or_id)
  95. internal_ip = container.attrs.get('NetworkSettings').get('Networks').get(network.get('name')).get('IPAddress')
  96. return str(internal_ip)
  97. except (NotFound, APIError):
  98. return None
  99. '''
  100. '''
  101. def run_container(image=None, name=None, ports=[], volumes=None, net=None, memory_limit=None, memory_swap_limit=None):
  102. if not name:
  103. return False
  104. client = get_docker_client()
  105. if not client:
  106. return False
  107. try:
  108. client.containers.run(
  109. image,
  110. None,
  111. name=name,
  112. detach=True,
  113. ports=ports,
  114. volumes=volumes,
  115. network=net,
  116. mem_limit=memory_limit,
  117. memswap_limit=memory_swap_limit
  118. )
  119. return True
  120. except (ContainerError, ImageNotFound, APIError):
  121. return False
  122. '''
  123. '''
  124. def start_container(id_or_name=None):
  125. if not id:
  126. return None
  127. client = get_docker_client()
  128. if not client:
  129. return None
  130. try:
  131. container = client.containers.get(id_or_name)
  132. container.start()
  133. time.sleep(1)
  134. container.reload()
  135. return {
  136. 'id': container.id,
  137. 'short_id': container.short_id,
  138. 'name': container.name,
  139. 'image': container.image,
  140. 'labels': container.labels,
  141. 'status': container.status
  142. }
  143. except (NotFound, APIError):
  144. return None
  145. '''
  146. '''
  147. def restart_container(id_or_name=None):
  148. if not id:
  149. return None
  150. client = get_docker_client()
  151. if not client:
  152. return None
  153. try:
  154. container = client.containers.get(id)
  155. container.restart()
  156. time.sleep(1)
  157. container.reload()
  158. return {
  159. 'id': container.id,
  160. 'short_id': container.short_id,
  161. 'name': container.name,
  162. 'image': container.image,
  163. 'labels': container.labels,
  164. 'status': container.status
  165. }
  166. except (NotFound, APIError):
  167. return None
  168. '''
  169. '''
  170. def stop_container(id=None):
  171. if not id:
  172. return None
  173. client = get_docker_client()
  174. if not client:
  175. return None
  176. try:
  177. container = client.containers.get(id)
  178. container.stop()
  179. time.sleep(1)
  180. container.reload()
  181. return {
  182. 'id': container.id,
  183. 'short_id': container.short_id,
  184. 'name': container.name,
  185. 'image': container.image,
  186. 'labels': container.labels,
  187. 'status': container.status
  188. }
  189. except (NotFound, APIError):
  190. return None
  191. '''
  192. '''
  193. def execute_command(container_id_or_name=None, command=None):
  194. if not container_id_or_name or not command:
  195. return None
  196. client = get_docker_client()
  197. if not client:
  198. return None
  199. try:
  200. container = client.containers.get(container_id_or_name)
  201. (exit_code, unused_output) = container.exec_run(command)
  202. return (False, True)[exit_code == 0]
  203. except (NotFound, APIError):
  204. return None
  205. '''
  206. '''
  207. def copy_in(container_id_or_name=None, path=None, tarfile=None):
  208. if not container_id_or_name or not path or not tarfile:
  209. return False
  210. client = get_docker_client()
  211. if not client:
  212. return False
  213. try:
  214. file = open(tarfile, 'r')
  215. container = client.containers.get(container_id_or_name)
  216. result = container.put_archive(path, file)
  217. file.close()
  218. return result
  219. except (NotFound, APIError, IOError):
  220. return False
  221. '''
  222. '''
  223. def container_is_running(id_or_name=None):
  224. if not id_or_name:
  225. return False
  226. client = get_docker_client()
  227. if not client:
  228. return False
  229. try:
  230. container = client.containers.get(id_or_name)
  231. return (False, True)[container.status == 'running']
  232. except (NotFound, APIError):
  233. return False