這裏做一下日常學習的記錄,代碼運行效果在最後
#!/usr/bin/python
# -*- coding: utf-8 -*-
# -- author : valecalida --
# edit_time: 2020/2/24 下午6:36
from subprocess import getoutput as shell
import sys
total_docker_id = "docker ps -a -q"
unalive_docker_id = "docker ps -a | grep Exited | awk -F ' ' '{print $1}' "
unalive_docker_name = "docker ps -a | grep Exited | awk -F ' ' '{print $NF}'"
alive_docker_id = "docker ps -q"
get_name_part1 = "docker ps -a | grep "
get_name_part2 = " | awk -F ' ' '{print $NF}' | grep -v NAMES"
get_ip_part1 = "docker inspect "
get_ip_part2 = " | grep 'IPAddress' | tail -n 1 | awk -F ':' '{print $2}' | cut -b 3-12"
get_port = " | grep HostPort | head -n 1 | awk -F ':' '{print$2}' | cut -c 3-6"
start_ins = "docker start "
stop_ins = "docker stop "
def alive_instance_info():
"""這是當前存活的實例的個數"""
alive_instances = shell(alive_docker_id).split('\n')
return alive_instances, len(alive_instances)
def get_alive_instances_infos():
"""顯示當前正在運行的docker實例"""
containers_id, _ = alive_instance_info()
containers, containers_ip, containers_name, containers_port, ins_code = [], [], [], [], []
for i in containers_id:
containers_name.append(shell(get_name_part1 + str(i) + get_name_part2))
containers_ip.append(shell(get_ip_part1 + str(i) + get_ip_part2))
containers_port.append(shell(get_ip_part1 + str(i) + get_port))
for k in range(len(containers_id)):
containers.append([str(k + 1),containers_id[k],containers_name[k], containers_ip[k], containers_port[k]])
ins_code.append(k + 1)
return containers, ins_code
def show_alive_instance():
containers, _ = get_alive_instances_infos()
# print(containers)
print("\tNow,the instances running are list as follows: ")
print("\t\t實例編號\t容器的ID\t\t容器的名字\t容器的IP\t\t容器的端口")
for container in containers:
print("\t\t", end="")
for info in container:
print("%4s\t" % info, end="\t")
print("\t")
print()
def unalive_instances():
"""當前沒有運行的實例的ID"""
unalive_instance = shell(unalive_docker_id).split('\n')
return unalive_instance, len(unalive_instance)
def get_unalive_instances_infos():
container_id, _ = unalive_instances()
containers_name = shell(unalive_docker_name).split('\n')
containers_ip, containers, ins_code = [], [], []
for i in container_id:
containers_ip.append("未運行,無IP")
for k in range(len(containers_ip)):
containers.append([str(k + 1), container_id[k], containers_name[k], containers_ip[k]])
ins_code.append(k + 1)
return containers, ins_code
def show_unalive_instance():
containers, _ = get_unalive_instances_infos()
print("\tNow,the instances not running are list as follows: ")
print("\t\t實例編號\t容器的ID\t\t容器的名字\t容器的IP")
for container in containers:
print('\t', end="")
for info in container:
print("\t%4s" % info, end="\t ")
print()
print()
def start_instance(value):
containers = value
for container in containers:
try:
shell(start_ins + container[1])
print("start %s successful" % container[1])
except BaseException as e:
print("開啓實例的時候好像出了點問題...")
def stop_instance(value):
containers = value
for container in containers:
try:
shell(stop_ins + container[1])
print("stop %s successful" % container[1])
except BaseException as e:
print("關閉實例的時候好像出了點問題...")
def docker_menu():
print(">>" * 5, "Docker managemet program by valecalida", "<<" * 5)
print("\t\t1 >> 查看當前docker的運行狀態")
print("\t\t2 >> 開啓指定(全部)容器")
print("\t\t3 >> 關閉指定(全部)容器")
print("\t\tq >> 退出程序(q)")
def main():
while True:
docker_menu()
len_alive = len(shell(alive_docker_id).split())
total = len(shell(total_docker_id).split('\n'))
len_unalive = total - len_alive
user_choice_1 = input("輸入您想要進行的操作的序號 >> ")
if user_choice_1 == 'q':
sys.exit()
elif user_choice_1 == '1':
if len_alive == 0 and len_unalive != 0:
show_unalive_instance()
elif len_unalive == 0 and len_alive != 0:
show_alive_instance()
elif len_alive != 0 and len_unalive != 0:
show_unalive_instance()
show_alive_instance()
elif user_choice_1 == '2':
if len_unalive == 0:
print("\t當前沒有未開啓的docker容器\n")
else:
show_unalive_instance()
containers, ins_code = get_unalive_instances_infos()
user_choice_2 = input("請輸入您想要啓動的docker實例編號(a all) >> ")
try:
if user_choice_2 == 'a':
start_instance(containers)
elif user_choice_2 == 'q':
print("\t正在返回上級菜單...")
elif int(user_choice_2) in ins_code:
for i in range(len(ins_code) + 1):
if int(user_choice_2) == i + 1:
start_instance([containers[i]])
break
else:
continue
else:
print("\t看起來您的輸入好像有點問題...")
except BaseException as e:
print("\t看起來您的輸入好像有點問題...")
elif user_choice_1 == '3':
flag = len(shell(alive_docker_id).split())
if flag == 0:
print("當前沒有在運行的實例,無需執行關閉操作")
else:
show_alive_instance()
containers, ins_code = get_alive_instances_infos()
user_choice_2 = input("請輸入您想要關閉的docker實例編號(a all) >> ")
try:
if user_choice_2 == 'a':
stop_instance(containers)
elif user_choice_2 == 'q':
print("\t正在返回上級菜單...")
elif int(user_choice_2) in ins_code:
for i in range(len(ins_code) + 1):
if int(user_choice_2) == i + 1:
stop_instance([containers[i]])
break
else:
continue
else:
print("\t看起來您的輸入好像有點問題...")
except BaseException as e:
print("\t看起來您的輸入好像有點問題...")
else:
print("\t您的輸入好像不太符合要求")
if __name__ == '__main__':
main()
運行基本情況如下:
$ python3 docker_opetation.py
>>>>>>>>>> Docker managemet program by valecalida <<<<<<<<<<
1 >> 查看當前docker的運行狀態
2 >> 開啓指定(全部)容器
3 >> 關閉指定(全部)容器
q >> 退出程序(q)
輸入您想要進行的操作的序號 >> 1
Now,the instances not running are list as follows:
實例編號 容器的ID 容器的名字 容器的IP
1 9ad0dd958cc7 webug 未運行,無IP
2 2d3586a30e7e mysql 未運行,無IP
Now,the instances running are list as follows:
實例編號 容器的ID 容器的名字 容器的IP 容器的端口
1 03f1ca1331c7 dvwa 172.17.0.2 8001
>>>>>>>>>> Docker managemet program by valecalida <<<<<<<<<<
1 >> 查看當前docker的運行狀態
2 >> 開啓指定(全部)容器
3 >> 關閉指定(全部)容器
q >> 退出程序(q)
輸入您想要進行的操作的序號 >> 2
Now,the instances not running are list as follows:
實例編號 容器的ID 容器的名字 容器的IP
1 9ad0dd958cc7 webug 未運行,無IP
2 2d3586a30e7e mysql 未運行,無IP
請輸入您想要啓動的docker實例編號(a all) >> 1
start 9ad0dd958cc7 successful
>>>>>>>>>> Docker managemet program by valecalida <<<<<<<<<<
1 >> 查看當前docker的運行狀態
2 >> 開啓指定(全部)容器
3 >> 關閉指定(全部)容器
q >> 退出程序(q)
輸入您想要進行的操作的序號 >> 3
Now,the instances running are list as follows:
實例編號 容器的ID 容器的名字 容器的IP 容器的端口
1 9ad0dd958cc7 webug 172.17.0.3 8002
2 03f1ca1331c7 dvwa 172.17.0.2 8001
請輸入您想要關閉的docker實例編號(a all) >> 1
stop 9ad0dd958cc7 successful
>>>>>>>>>> Docker managemet program by valecalida <<<<<<<<<<
1 >> 查看當前docker的運行狀態
2 >> 開啓指定(全部)容器
3 >> 關閉指定(全部)容器
q >> 退出程序(q)
輸入您想要進行的操作的序號 >> q