diff --git a/docker-net-graph.py b/docker-net-graph.py
index 1c69c1a..0e783a0 100644
--- a/docker-net-graph.py
+++ b/docker-net-graph.py
@@ -7,15 +7,38 @@ import json
from graphviz import Graph
dot = Graph(comment='Docker Network Graph',
- graph_attr=dict( rankdir="LR")
+ graph_attr=dict( rankdir="TB", packmode='graph', pack='true')
)
docker_client = Client(os.environ.get("DOCKER_HOST", "unix:///var/run/docker.sock"))
-#pprint.pprint(docker_client.networks())
def dump_json(obj):
print json.dumps(obj, indent=4)
+for c in sorted(docker_client.containers()):
+ name = c['Names'][0]
+ container_id = c['Id']
+
+ node_id = 'container_%s' % container_id
+
+ iface_labels = []
+
+ for net_name, net_info in c['NetworkSettings']['Networks'].iteritems():
+ label_iface = "<%s> %s" % (net_info['EndpointID'], net_info['IPAddress'])
+
+ iface_labels.append(label_iface)
+
+ print '|'.join(iface_labels)
+
+
+ dot.node(node_id,
+ shape='record',
+ label="{ %s | { %s } }" % (name, '|'.join(iface_labels)),
+ fillcolor='#ff9999',
+ style='filled')
+
+
+
for net in sorted(docker_client.networks()):
#print "Net"
net_name = net['Name']
@@ -38,35 +61,24 @@ for net in sorted(docker_client.networks()):
net_node_id = "net_%s" % (net_name,)
- net_label_html = '
'.join([s for s in ['network', net_name, subnet, gateway] if s != None])
+ net_label_html = '
'.join([s for s in ['network', net_name, subnet, gateway] if s != None])
- dot.node(net_node_id, label="<%s>" % net_label_html, shape='note')
+ dot.node(net_node_id,
+ shape='record',
+ label="{ %s| %s }" % (gateway, net_name),
+ fillcolor='#99ff99',
+ style='filled')
for container_id, container in sorted(net['Containers'].iteritems()):
+ dump_json(container)
print " * ", container['Name'], container['IPv4Address'], container['IPv6Address']
container_node_id = 'container_%s' % container_id
- label_html = "container
%s" % container['Name']
-
- dot.node(container_node_id,
- label="<%s>" % label_html,
- shape='component')
-
- label_html = "%s
%s" % (container['IPv4Address'].split('/')[0], container['IPv6Address'])
-
- container_iface_id = "iface_%s" % container['IPv4Address']
+ container_iface_ref = "%s:%s" % (container_node_id, container['EndpointID'])
- dot.node(container_iface_id,
- label="<%s>" % label_html,
- shape='box')
-
-
-
-
- dot.edge(container_node_id, container_iface_id)
- dot.edge(container_iface_id, net_node_id)
+ dot.edge(container_iface_ref, net_node_id+":gw_iface")
print dot.source
dot.render('dng.gv')