Linux下Python3對Docker進行基本的管理(包含顯示端口,顯示IP,一鍵啓動,一鍵關閉)

這裏做一下日常學習的記錄,代碼運行效果在最後

#!/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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章