Getting Started with Docker Swarm

What is Swarm?

From the Docker Docs:

Docker Swarm is native clustering for Docker. It turns a pool of Docker hosts into a single, virtual Docker host. Because Docker Swarm serves the standard Docker API, any tool that already communicates with a Docker daemon can use Swarm to transparently scale to multiple hosts.

Why Swarm?

There are other clustering tools out there, Kubernetes/OpenShift are examples. I’m using Swarm for this post to introduce the concepts of clustering from a Docker perspective. When we create a swarm “cluster” we are creating a pool of nodes that are all running Docker, and since Swarm exposes the Docker API any tool that we develop that communicates w/ Docker will also work with Swarm.

Getting Started

WARNING do not do this in production. This is strictly for development/POC. Security becomes a major concern when moving to prod so please read Protect the Docker daemon socket.

Modify the Docker Daemon

In order for Swarm to work we need to make sure that the docker daemons are configured to listen on a TCP port. Our swarm control node is an Ubuntu machine so we will need to edit the docker config like so:

[[code]]czozOTE6XCJqcmF5QHN3YXJtLmpvaG5yYXkuaW86fg0KJmd0OyBzdWRvIHZpbSAvZXRjL2RlZmF1bHQvZG9ja2VyDQoNCiMgRG9ja2V7WyYqJl19ciBVcHN0YXJ0IGFuZCBTeXNWaW5pdCBjb25maWd1cmF0aW9uIGZpbGUNCg0KZXhwb3J0IGh0dHBfcHJveHk9aHR0cDovLyZsdDtwcntbJiomXX1veHkmZ3Q7OjgwMDANCmV4cG9ydCBodHRwc19wcm94eT0ke2h0dHBfcHJveHl9DQoNCkRPQ0tFUl9PUFRTPVwiLWcgL2RvY2tlciAtSHtbJiomXX0gdW5peDovLy92YXIvcnVuL2RvY2tlci5zb2NrIC1IIHRjcDovLzAuMC4wLjA6MjM3NVwiDQoNCmpyYXlAc3dhcm0uam9obnJheS5pb3tbJiomXX06fg0KJmd0OyBzdWRvIHNlcnZpY2UgZG9ja2VyIHJlc3RhcnQNCmRvY2tlciBzdG9wL3dhaXRpbmcNCmRvY2tlciBzdGFydC9ydW5ue1smKiZdfWluZywgcHJvY2VzcyAxMzU5OVwiO3tbJiomXX0=[[/code]]

This has to be done on every node that will be in the cluster. In this case I have two other nodes which are systemd based. We need to edit the daemon.conf drop in file on those nodes.
[[code]]czo1NTU6XCJqcmF5QG5vZGUxLmpvaG5yYXkuaW86fg0KJmd0OyBzdWRvIHZpbSAvZXRjL3N5c3RlbWQvc3lzdGVtL2RvY2tlci5zZXJ7WyYqJl19dmljZS5kL2RhZW1vbi5jb25mDQoNCltTZXJ2aWNlXQ0KRXhlY1N0YXJ0PQ0KRXhlY1N0YXJ0PS91c3IvYmluL2RvY2tlciBkYWVtb3tbJiomXX1uIC1IIGZkOi8vIC1IIHRjcDovLzAuMC4wLjA6MjM3NSAtZyAvZG9ja2VyIFxcDQotLXN0b3JhZ2UtZHJpdmVyIGRldmljZW1hcHBlcntbJiomXX0gLS1zdG9yYWdlLW9wdCBkbS5mcz14ZnMgXFwNCi0tc3RvcmFnZS1vcHQgZG0udGhpbnBvb2xkZXY9L2Rldi9tYXBwZXIvZHZvbC1kb3tbJiomXX1ja2VyLS1wb29sIFxcDQotLXN0b3JhZ2Utb3B0IGRtLnVzZV9kZWZlcnJlZF9yZW1vdmFsPXRydWUgXFwNCi0tc3RvcmFnZS1vcHQgZG17WyYqJl19LnVzZV9kZWZlcnJlZF9kZWxldGlvbj10cnVlIA0KDQojIFJlbG9hZCB0aGUgc3lzdGVtZCBkYWVtb24NCmpyYXlAbm9kZTEuam9obntbJiomXX1yYXkuaW86fg0KJmd0OyBzdWRvIHN5c3RlbWN0bCBkYWVtb24tcmVsb2FkDQoNCmpyYXlAbm9kZTEuam9obnJheS5pbzp+DQomZ3Q7e1smKiZdfSBzdWRvIHN5c3RlbWN0bCByZXN0YXJ0IGRvY2tlclwiO3tbJiomXX0=[[/code]]

Just to check that you have set everything up correctly we can run the docker client w/ the -H option to point it at a different daemon. On my Ubuntu node point docker at node1 and get its info.
[[code]]czo5MTY6XCJqcmF5QHN3YXJtLmpvaG5yYXkuaW86fg0KJmd0OyBkb2NrZXIgLUggdGNwOi8vbm9kZTEuam9obnJheS5pbzoyMzc1IGl7WyYqJl19bmZvDQpDb250YWluZXJzOiAwDQpJbWFnZXM6IDE1NQ0KU2VydmVyIFZlcnNpb246IDEuOS4wDQpTdG9yYWdlIERyaXZlcjogZGV2aXtbJiomXX1jZW1hcHBlcg0KIFBvb2wgTmFtZTogZHZvbC1kb2NrZXItLXBvb2wNCiBQb29sIEJsb2Nrc2l6ZTogNjUuNTQga0INCiBCYXNlIERle1smKiZdfXZpY2UgU2l6ZTogMTA3LjQgR0INCiBCYWNraW5nIEZpbGVzeXN0ZW06IHhmcw0KIERhdGEgZmlsZToNCiBNZXRhZGF0YSBmaWxlOg17WyYqJl19CiBEYXRhIFNwYWNlIFVzZWQ6IDguOTczIEdCDQogRGF0YSBTcGFjZSBUb3RhbDogNzQ5IEdCDQogRGF0YSBTcGFjZSBBdmFpbGFibHtbJiomXX1lOiA3NDAgR0INCiBNZXRhZGF0YSBTcGFjZSBVc2VkOiAxMi4zNSBNQg0KIE1ldGFkYXRhIFNwYWNlIFRvdGFsOiAxLjAwMiBHQg0Ke1smKiZdfSBNZXRhZGF0YSBTcGFjZSBBdmFpbGFibGU6IDk5MC4xIE1CDQogVWRldiBTeW5jIFN1cHBvcnRlZDogdHJ1ZQ0KIERlZmVycmVkIFJ7WyYqJl19ZW1vdmFsIEVuYWJsZWQ6IHRydWUNCiBEZWZlcnJlZCBEZWxldGlvbiBFbmFibGVkOiB0cnVlDQogRGVmZXJyZWQgRGVsZXRlZCBEZXtbJiomXX12aWNlIENvdW50OiAwDQogTGlicmFyeSBWZXJzaW9uOiAxLjAyLjkzLVJIRUw3ICgyMDE1LTAxLTI4KQ0KRXhlY3V0aW9uIERyaXZle1smKiZdfXI6IG5hdGl2ZS0wLjINCkxvZ2dpbmcgRHJpdmVyOiBqc29uLWZpbGUNCktlcm5lbCBWZXJzaW9uOiAzLjEwLjAtMjI5LjQuMi5lbDd7WyYqJl19Lng4Nl82NA0KT3BlcmF0aW5nIFN5c3RlbTogT3JhY2xlIExpbnV4IFNlcnZlciA3LjENCkNQVXM6IDQ4DQpUb3RhbCBNZW1vcnk6IHtbJiomXX0yNTEuNyBHaUINCk5hbWU6IG5vZGUxDQpJRDogNlVFVjpBRjdOOjVUNVE6MkFQSTpPRjdTOjZGSVg6VkI3RToyUkVNOlZGUkI6QlFBe1smKiZdfTM6NktCQTpGU1VFXCI7e1smKiZdfQ==[[/code]]

Get Swarm

Docker swarm is conveniently designed to be run in a container, so let’s pull it down. NOTE: You will need to do this on all the nodes that will be in the cluster.

[[code]]czo0NzI6XCJqcmF5QHN3YXJtLmpvaG5yYXkuaW86fg0KJmd0OyBkb2NrZXIgcHVsbCBzd2FybQ0KVXNpbmcgZGVmYXVsdCB0YWc6IGx7WyYqJl19YXRlc3QNCmxhdGVzdDogUHVsbGluZyBmcm9tIGxpYnJhcnkvc3dhcm0NCmQ2ODFjOTAwYzZlMzogUHVsbCBjb21wbGV0ZQ0KMTg4ZHtbJiomXX1lNmYyNGYzZjogUHVsbCBjb21wbGV0ZQ0KOTBiMmZmYjhkMzM4OiBQdWxsIGNvbXBsZXRlDQoyMzdhZjRlZmVhOTQ6IFB1bGwgY29te1smKiZdfXBsZXRlDQozYjNmYzZmNjIxMDc6IFB1bGwgY29tcGxldGUNCjdlNmM5MTM1YjMwODogUHVsbCBjb21wbGV0ZQ0KOTg2MzQwYWI2MmZ7WyYqJl19MDogUHVsbCBjb21wbGV0ZQ0KYTk5NzVlMmNjMGEzOiBQdWxsIGNvbXBsZXRlDQpEaWdlc3Q6IHNoYTI1NjpjMjFmZDQxNGIwNDg4NntbJiomXX0zN2IxZjA1ZjEzYTU5YjAzMmEzZjlkYTVkODE4ZDMxZGExYTRjYTk4YTg0YzBjNzgxYg0KU3RhdHVzOiBEb3dubG9hZGVkIG5ld2Vye1smKiZdfSBpbWFnZSBmb3Igc3dhcm06bGF0ZXN0XCI7e1smKiZdfQ==[[/code]]

Once the image is pulled down we need to create a file that lists all the nodes in cluster. We do this because using the swarm create command actually reaches out to Docker’s hosted discovery platform and registers the nodes. We are going to use a static file in this case that looks like this.
[[code]]czoxMTE6XCJqcmF5QHN3YXJtLmpvaG5yYXkuaW86fg0KJmd0OyBjYXQgL2RvY2tlci9zd2FybV9ub2Rlcw0KMTAuMTM1LjE2LjEwNDp7WyYqJl19MjM3NQ0KMTAuMjA3LjEzLjM2OjIzNzUNCjEwLjIwNy4xMy4zNToyMzc1XCI7e1smKiZdfQ==[[/code]]

Run the following on the nodes to start join the swarm cluster.
[[code]]czoxNDM6XCJqcmF5QG5vZGUxLmpvaG5yYXkuaW86fg0KJmd0OyBkb2NrZXIgcnVuIC1pdCAtZCAtdiAvZG9ja2VyL3N3YXJtX25vZGV7WyYqJl19czovc3dhcm1fbm9kZXMgc3dhcm0gam9pbiBcXA0KIC0tYWRkcj0xMC4yMDcuMTMuMzU6MjM3NSBmaWxlOi8vL3N3YXJtX25vZGVzXCI7e1smKiZdfQ==[[/code]]

And then on the manager, which is also part of the cluster.
[[code]]czo0NDg6XCJqcmF5QHN3YXJtLmpvaG5yYXkuaW86L2RvY2tlcg0KJmd0OyBkb2NrZXIgcnVuIC1pdCAtZCAtdiAvZG9ja2VyL3N3YXJ7WyYqJl19bV9ub2Rlczovc3dhcm1fbm9kZXMgLXAgODM3NToyMzc1IHN3YXJtIG1hbmFnZSBmaWxlOi8vL3N3YXJtX25vZGVzDQoNCmpyYXlAc3tbJiomXX13YXJtLmpvaG5yYXkuaW86L2RvY2tlcg0KJmd0OyBkb2NrZXIgbG9ncyAzNTcyZWVlMWExDQpJTkZPWzAwMDBdIExpc3RlbmluZyBme1smKiZdfW9yIEhUVFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcj06MjM3NSBwcm90bz10Y3ANCklORk9bMDAwMF0gUmVnaXN0ZXJ7WyYqJl19ZWQgRW5naW5lIHN3YXJtIGF0IDEwLjEzNS4xNi4xMDQ6MjM3NQ0KSU5GT1swMDAwXSBSZWdpc3RlcmVkIEVuZ2luZSBub2RlMSBhdHtbJiomXX0gMTAuMjA3LjEzLjM1OjIzNzUNCklORk9bMDAwMF0gUmVnaXN0ZXJlZCBFbmdpbmUgbm9kZTIgYXQgMTAuMjA3LjEzLjM2OjIzNzVcIntbJiomXX07e1smKiZdfQ==[[/code]]

Success!! You now have a small docker swarm cluster running. You can see information about the cluster by logging in to the swarm manager and using the -H option like so.
[[code]]czoxMTAzOlwianJheUBzd2FybS5qb2hucmF5LmlvOi9kb2NrZXINCiZndDsgZG9ja2VyIC1IIGxvY2FsaG9zdDo4Mzc1IGluZm8NCkN7WyYqJl19b250YWluZXJzOiA0DQpJbWFnZXM6IDE5DQpSb2xlOiBwcmltYXJ5DQpTdHJhdGVneTogc3ByZWFkDQpGaWx0ZXJzOiBoZWFsdGgsIHtbJiomXX1wb3J0LCBkZXBlbmRlbmN5LCBhZmZpbml0eSwgY29uc3RyYWludA0KTm9kZXM6IDMNCiBub2RlMTogMTAuMjA3LjEzLjM2OjIzNzUNe1smKiZdfQogIOKUlCBTdGF0dXM6IEhlYWx0aHkNCiAg4pSUIENvbnRhaW5lcnM6IDENCiAg4pSUIFJlc2VydmVkIENQVXM6IDAgLyA1MA0KICB7WyYqJl194pSUIFJlc2VydmVkIE1lbW9yeTogMCBCIC8gMjY0LjMgR2lCDQogIOKUlCBMYWJlbHM6IGV4ZWN1dGlvbmRyaXZlcj1uYXRpdmUtMHtbJiomXX0uMiwga2VybmVsdmVyc2lvbj0zLjEwLjAtMjI5LjQuMi5lbDcueDg2XzY0LCBvcGVyYXRpbmdzeXN0ZW09T3JhY2xlIExpbnV4IFNle1smKiZdfXJ2ZXIgNy4xLCBzdG9yYWdlZHJpdmVyPWRldmljZW1hcHBlcg0KIG5vZGUyOiAxMC4yMDcuMTMuMzU6MjM3NQ0KICDilJQgU3RhdHV7WyYqJl19czogSGVhbHRoeQ0KICDilJQgQ29udGFpbmVyczogMQ0KICDilJQgUmVzZXJ2ZWQgQ1BVczogMCAvIDUwDQogIOKUlCBSZXNlcnZlZHtbJiomXX0gTWVtb3J5OiAwIEIgLyAyNjQuMyBHaUINCiAg4pSUIExhYmVsczogZXhlY3V0aW9uZHJpdmVyPW5hdGl2ZS0wLjIsIGtlcm5lbHZle1smKiZdfXJzaW9uPTMuMTAuMC0yMjkuNC4yLmVsNy54ODZfNjQsIG9wZXJhdGluZ3N5c3RlbT1PcmFjbGUgTGludXggU2VydmVyIDcuMSwgc3R7WyYqJl19b3JhZ2Vkcml2ZXI9ZGV2aWNlbWFwcGVyDQogc3dhcm06IDEwLjEzNS4xNi4xMDQ6MjM3NQ0KICDilJQgU3RhdHVzOiBIZWFsdGh5DXtbJiomXX0KICDilJQgQ29udGFpbmVyczogMg0KICDilJQgUmVzZXJ2ZWQgQ1BVczogMCAvIDQNCiAg4pSUIFJlc2VydmVkIE1lbW9yeTogMCBCe1smKiZdfSAvIDguMjIxIEdpQg0KICDilJQgTGFiZWxzOiBleGVjdXRpb25kcml2ZXI9bmF0aXZlLTAuMiwga2VybmVsdmVyc2lvbj0zLjE2LjB7WyYqJl19LTQzLWdlbmVyaWMsIG9wZXJhdGluZ3N5c3RlbT1VYnVudHUgMTQuMDQuMiBMVFMsIHN0b3JhZ2Vkcml2ZXI9YXVmcw0KQ1BVczogMXtbJiomXX0wNA0KVG90YWwgTWVtb3J5OiA1MzYuOCBHaUINCk5hbWU6IDM1NzJlZWUxYTFlMlwiO3tbJiomXX0=[[/code]]

But the really cool part is that we can use the swarm manager to launch containers that will be scheduled in our cluster. I’m going to use the node constraint here to force the container to be launched on node1.
[[code]]czoxMDg4OlwianJheUBzd2FybS5qb2hucmF5LmlvOi9kb2NrZXINCiZndDsgZG9ja2VyIC1IIGxvY2FsaG9zdDo4Mzc1IHJ1biAtaXR7WyYqJl19IC1kIC1lIGNvbnN0cmFpbnQ6bm9kZT09bm9kZTEgLS1uYW1lIHJ2ZF90aWNrIC0tbmV0IGhvc3QgLWUgXCJSSF9FTlY9ZHJodWItcG97WyYqJl19Y1wiIHJlZy5qb2hucmF5LmlvL3lhcm5ob2ovYXBwQSBcIi9hcHBzL2FwcEEvYmluL3N0YXJ0X3J2ZC5zaFwiDQoNCiMgRmlyc3QgYSBsb3tbJiomXX1vayBhdCB3aGF0IGlzIHJ1bm5pbmcgb24gdGhlIGxvY2FsIG1hY2hpbmUNCmpyYXlAc3dhcm0uam9obnJheS5pbzovZG9ja2VyDQome1smKiZdfWd0OyBkb2NrZXIgcHMNCkNPTlRBSU5FUiBJRCAgICAgICAgSU1BR0UgICAgICAgICAgICAgICBDT01NQU5EICAgICAgICAgICAgICB7WyYqJl19ICAgIENSRUFURUQgICAgICAgICAgICAgU1RBVFVTICAgICAgICAgICAgICBQT1JUUw0KIE5BTUVTDQozNTcyZWVlMWExZTIgICAgIHtbJiomXX0gICBzd2FybSAgICAgICAgICAgICAgIFwiL3N3YXJtIG1hbmFnZSBmaWxlOi9cIiAgIDQgbWludXRlcyBhZ28gICAgICAgVXAgNCBtaW57WyYqJl19dXRlcyAgICAgICAgMC4wLjAuMDo4Mzc1LSZndDsyMzc1L3RjcA0KIHRoaXJzdHlfc3BlbmNlDQo0OTlkODZkMTlmOWUgICAgICAgIHtbJiomXX1zd2FybSAgICAgICAgICAgICAgIFwiL3N3YXJtIGpvaW4gLS1hZGRyPTFcIiAgIDUgbWludXRlcyBhZ28gICAgICAgVXAgNCBtaW51dGV7WyYqJl19cyAgICAgICAgMjM3NS90Y3ANCiBlbGF0ZWRfd2VzY29mZg0KDQojIEFuZCBub3cgd2hhdCBpcyBydW5uaW5nIGluIHRoZSBjbHVzdHtbJiomXX1lcg0KanJheUBzd2FybS5qb2hucmF5LmlvOi9kb2NrZXINCiZndDsgZG9ja2VyIC1IIGxvY2FsaG9zdDo4Mzc1IHBzDQpDT05UQUlOe1smKiZdfUVSIElEICAgICAgICBJTUFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkQgICAgICAgICAgICAgICAgICBDUkVBVEV7WyYqJl19RCAgICAgICAgICAgICBTVEFUVVMgICAgICAgICAgICAgIFBPUlRTDQogICAgICAgIE5BTUVTDQoxZDhlODA2NGQ0NGMgICAgICAgIHtbJiomXX1yZWcuam9obnJheS5pby95YXJuaG9qL2FwcEEgICBcIi4vc3RhcnRfYXBwQS5zaCBcIiAgIDE1IHNlY29uZHMgYWdvICAgICAgVXAgMTR7WyYqJl19IHNlY29uZHMNCiAgICAgICAgbm9kZTEvcnZkX3RpY2tcIjt7WyYqJl19[[/code]]

On node1 you can run docker ps and see that container is running on that node.
[[code]]czo0NDU6XCJqcmF5QG5vZGUxOn4NCiZndDsgZG9ja2VyIHBzDQpDT05UQUlORVIgSUQgICAgICAgIElNQUdFICAgICAgICAgICAgICB7WyYqJl19ICAgICAgICAgICAgIENPTU1BTkQgICAgICAgICAgICAgICAgICBDUkVBVEVEICAgICAgICAgICAgIFNUQVRVUyAgICAgICAgICAgIHtbJiomXX0gIFBPUlRTDQogICAgICAgIE5BTUVTDQoxZDhlODA2NGQ0NGMgICAgICAgIHJlZy5qb2hucmF5LmlvL3lhcm5ob2ovYXBwQSAgIFwiLntbJiomXX0vc3RhcnRfYXBwQS5zaCBcIiAgIDIyIG1pbnV0ZXMgYWdvICAgICAgVXAgMjIgbWludXRlcw0KICAgICAgICBydmRfdGljaw0KMDY0OHtbJiomXX1mNTY2ZjFhYSAgICAgICAgc3dhcm0gICAgICAgICAgICAgICAgICAgICAgICAgICBcIi9zd2FybSBqb2luIC0tYWRkcj0xXCIgICAyNyB7WyYqJl19bWludXRlcyBhZ28gICAgICBVcCAyNyBtaW51dGVzICAgICAgIDIzNzUvdGNwDQogICAgICAgIHN1c3BpY2lvdXNfeW9uYXRoXCI7e1smKiZdfQ==[[/code]]

The DOCKER_HOST Variable

If you get tired of typing -H <ip>:<port> you can set the DOCKER_HOST variable in your shell.

[[code]]czo5MTI6XCJqcmF5QHN3YXJtLmpvaG5yYXkuaW86L2RvY2tlcg0KJmd0OyBkb2NrZXIgcHMNCkNPTlRBSU5FUiBJRCAgICAgICAgSU17WyYqJl19QUdFICAgICAgICAgICAgICAgQ09NTUFORCAgICAgICAgICAgICAgICAgIENSRUFURUQgICAgICAgICAgICAgU1RBVFVTICAgICAgIHtbJiomXX0gICAgICAgUE9SVFMNCiBOQU1FUw0KMzU3MmVlZTFhMWUyICAgICAgICBzd2FybSAgICAgICAgICAgICAgIFwiL3N3YXJtIG1hbmFnZXtbJiomXX0gZmlsZTovXCIgICAzMSBtaW51dGVzIGFnbyAgICAgIFVwIDMxIG1pbnV0ZXMgICAgICAgMC4wLjAuMDo4Mzc1LSZndDsyMzc1L3RjcHtbJiomXX0NCiB0aGlyc3R5X3NwZW5jZQ0KNDk5ZDg2ZDE5ZjllICAgICAgICBzd2FybSAgICAgICAgICAgICAgIFwiL3N3YXJtIGpvaW4gLS1hZHtbJiomXX1kcj0xXCIgICAzMSBtaW51dGVzIGFnbyAgICAgIFVwIDMxIG1pbnV0ZXMgICAgICAgMjM3NS90Y3ANCiBlbGF0ZWRfd2VzY29mZg0KDXtbJiomXX0KanJheUBzd2FybS5qb2hucmF5LmlvOi9kb2NrZXINCiZndDsgZXhwb3J0IERPQ0tFUl9IT1NUPXRjcDovL2xvY2FsaG9zdDo4Mzc1e1smKiZdfQ0KDQojIE5vdyBkb2NrZXIgcHMgb25seSBzaG93cyB1cCB0aGUgY2x1c3RlciBhbmQgbm90IHRoZSBsb2NhbCBtYWNoaW5lDQpqcmF7WyYqJl19eUBzd2FybS5qb2hucmF5LmlvOi9kb2NrZXINCiZndDsgZG9ja2VyIHBzDQpDT05UQUlORVIgSUQgICAgICAgIElNQUdFICAgICAgIHtbJiomXX0gICAgICAgICAgICAgICAgICAgIENPTU1BTkQgICAgICAgICAgICAgICAgICBDUkVBVEVEICAgICAgICAgICAgIFNUQVRVUyAgICAge1smKiZdfSAgICAgICAgIFBPUlRTDQogICAgICAgIE5BTUVTDQoxZDhlODA2NGQ0NGMgICAgICAgIHJlZy5qb2hucmF5LmlvL3lhcm5ob2ovYXB7WyYqJl19cEEgICBcIi4vc3RhcnRfYXBwQS5zaCBcIiAgIDI4IG1pbnV0ZXMgYWdvICAgICAgVXAgMjggbWludXRlcw0KICAgICAgICBub2RlMS9ye1smKiZdfXZkX3RpY2tcIjt7WyYqJl19[[/code]]

Happy Hacking!

Related Posts

Filled under: Uncategorized