diff --git a/.gitignore b/.gitignore index a89052c..b4c3f56 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.gv *.pdf +*.png .idea diff --git a/docker-net-graph.py b/docker-net-graph.py index 3ccca07..961fd18 100755 --- a/docker-net-graph.py +++ b/docker-net-graph.py @@ -2,14 +2,13 @@ import os import json import argparse +import random from docker import Client from graphviz import Graph def generate_graph(verbose: bool, file: str): - dot = Graph(comment='Docker Network Graph', - graph_attr=dict(rankdir="TB", packmode='graph', pack='true') - ) + g = Graph(comment='Docker Network Graph', engine="fdp", format='png', graph_attr=dict(splines="true")) docker_client = Client(os.environ.get("DOCKER_HOST", "unix:///var/run/docker.sock")) @@ -32,14 +31,15 @@ def generate_graph(verbose: bool, file: str): if verbose: print('|'.join(iface_labels)) - dot.node(node_id, - shape='record', - label="{ %s | { %s } }" % (name, '|'.join(iface_labels)), - fillcolor='#ff9999', - style='filled') + g.node(node_id, + shape='record', + label="{ %s | { %s } }" % (name, '|'.join(iface_labels)), + fillcolor='#ff9999', + style='filled') for net in docker_client.networks(): net_name = net['Name'] + color = "#%06x" % random.randint(0, 0xFFFFFF) try: gateway = net['IPAM']['Config'][0]['Gateway'] @@ -58,11 +58,11 @@ def generate_graph(verbose: bool, file: str): net_label_html = '
'.join([s for s in ['network', net_name, subnet, gateway] if s is not None]) - dot.node(net_node_id, - shape='record', - label="{ %s| %s }" % (gateway, net_name), - fillcolor='#99ff99', - style='filled') + g.node(net_node_id, + shape='record', + label="{ %s| %s }" % (gateway, net_name), + fillcolor=color, + style='filled') for container_id, container in sorted(net['Containers'].items()): if verbose: @@ -74,11 +74,11 @@ def generate_graph(verbose: bool, file: str): container_iface_ref = "%s:%s" % (container_node_id, container['EndpointID']) - dot.edge(container_iface_ref, net_node_id+":gw_iface") + g.edge(container_iface_ref, net_node_id+":gw_iface", color=color) - print(dot.source) + print(g.source) if file: - dot.render(file) + g.render(file) if __name__ == "__main__":