Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Microservice Meetup Berlin 2015 Docker Orchestration

Microservice Meetup Berlin 2015 Docker Orchestration

**Docker orchestration talk**

Here you can find my docker slide container decks from my docker orchestration talks:

- [Microservice Meetup Berlin - Docker Orchestration ][3].
- open slidefire presentation container with `docker run -d -p 8000:80 rossbachp/docker-orchestration:mberlin201502`
- pdf [Docker Orchestration][4] is now avaiable!
- [Docker Meetup Frankfurt - Docker Orchestration ][1].
- open slidefire presentation container with `docker run -d -p 8000:80 rossbachp/docker-orchestration:mfrankfurt-2015`
- pdf [Docker Orchestration][2] is now avaiable!

Open slidefire presentation container with `docker run -d -p 8000:80 - open your browser with `http :8000/docker-orchestration:xx`

Feedback welcome

[Peter Rossbach][5]

[1]: http://www.meetup.com/Docker-Frankfurt/events/219160756/
[2]: https://speakerdeck.com/rossbachp/docker-meetup-frankfurt-2015-docker-orchestration
[3]: http://www.meetup.com/Microservices-Meetup-Berlin/events/219979690/
[4]: https://speakerdeck.com/rossbachp/microservice-meetup-berlin-2015-docker-orchestration
[5]: http://twitter.com/PRossbach

Peter Rossbach

February 16, 2015
Tweet

More Decks by Peter Rossbach

Other Decks in Programming

Transcript

  1. 17 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ URL=https://github.com/docker/machine/releases/download $ curl -L ${URL}/v0.1.0-rc2/docker-machine_darwin-amd64 \ >~/bin/docker-machine_darwin-amd64 $ cd ~/bin $ ln -s docker-machine_darwin-amd64 docker-machine $ chmod +x docker-machine_darwin-amd64 $ export PATH=~/bin:$PATH
  2. 18 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ git clone https://github.com/docker/machine.git $ cd machine $ boot2docker start $ boot2docker shellinit $ script/build -osarch="darwin/amd64" $ cp docker-machine_darwin_amd64 ~/bin/ $ cd ~/bin $ ln -s docker-machine_darwin-amd64 docker-machine $ chmod +x docker-machine_darwin-amd64 git fetch origin pull/464/head:swarm git checkout swarm
  3. 19 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ cd ~/bin $ docker-machine ls INFO[0000] Creating CA: /Users/peter/.docker/machines/ca.pem INFO[0001] Creating client certificate: /Users/peter/.docker/machines/.clien NAME ACTIVE DRIVER STATE URL $ ls -a .docker/machines/ . .. .client ca.pem key.pem
  4. 20 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ time docker-machine create -d virtualbox dev INFO[0000] Downloading boot2docker.iso to /Users/peter/.docker/images/boot2d INFO[0019] Creating SSH key... INFO[0020] Creating VirtualBox VM... INFO[0027] Starting VirtualBox VM... INFO[0027] Waiting for VM to start... INFO[0061] "dev" has been created and is now the active machine INFO[0061] To connect: docker $(docker-machine config dev) ps real 1m1.937s user 0m6.904s sys 0m6.231s
  5. 21 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ time docker-machine create -d virtualbox dev2 INFO[0000] Creating SSH key... INFO[0000] Creating VirtualBox VM... INFO[0008] Starting VirtualBox VM... INFO[0008] Waiting for VM to start... INFO[0042] "dev2" has been created and is now the active machine INFO[0042] To connect: docker $(docker-machine config dev2) ps real 0m42.850s user 0m6.031s sys 0m5.960s
  6. 22 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker-machine ls NAME ACTIVE DRIVER STATE URL dev virtualbox Running tcp://192.168.99.100:2376 dev2 * virtualbox Running tcp://192.168.99.101:2376 $ docker-machine config dev --tls --tlscacert=/Users/peter/.docker/machines/.client/ca.pem \ --tlscert=/Users/peter/.docker/machines/.client/cert.pem \ --tlskey=/Users/peter/.docker/machines/.client/key.pem \ -H tcp://192.168.99.100:2376 $ docker $(docker-machine config dev) ps ... $ docker $(docker-machine config dev2) run \ --rm busybox /bin/sh -c 'echo hello machine `hostname`' Unable to find image 'busybox:latest' locally busybox:latest: The image you are pulling has been verified 511136ea3c5a: Pull complete df7546f9f060: Pull complete ea13149945cb: Pull complete 4986bf8c1536: Pull complete Status: Downloaded newer image for busybox:latest hello machine 117ade53e1d6 $ docker $(docker-machine config dev2) ps -a REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE busybox latest 4986bf8c1536 5 weeks ago 2.433 MB
  7. 24 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker-machine ssh dev ## . ## ## ## == ## ## ## ## === /""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| Boot2Docker version 1.4.1, build master : 86f7ec8 - Tue Dec 16 23:11:29 UTC Docker version 1.4.1, build 5bc2ff8
  8. 25 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ # URL=https://github.com/tianon/boot2docker/releases/download/v1.5.0-rc1 $ URL= https://github.com/boot2docker/boot2docker/releases/download/v1.5.0/boot2docker.iso $ docker-machine create -d virtualbox \ --virtualbox-boot2docker-url=${URL}/boot2docker.iso \ dev3 $ docker $(docker-machine config dev3) ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS heisenberg:~ peter$ docker $(docker-machine config dev3) version Client version: 1.4.1 Client API version: 1.16 Go version (client): go1.3.3 Git commit (client): 5bc2ff8 OS/Arch (client): darwin/amd64 Server version: 1.5.0 Server API version: 1.17 Go version (server): go1.4.1 Git commit (server): 7e803ba
  9. 26 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker-machine NAME: docker-machine - Create and manage machines running Docker. USAGE: docker-machine [global options] command [command options] [arguments...] VERSION: 0.1.0 COMMANDS: active Get or set the active machine create Create a machine config Print the connection config for machine inspect Inspect information about a machine ip Get the IP address of a machine kill Kill a machine ls List machines restart Restart a machine rm Remove a machine env Display the commands to set up the environment for the Docker client ssh Log into or run a command on a machine with SSH start Start a machine stop Stop a machine upgrade Upgrade a machine to the latest version of Docker url Get the URL of a machine help, h Shows a list of commands or help for one command
  10. 27 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    --debug, -D Enable debug mode --storage-path Configures storage path [$MACHINE_STORAGE_PATH --tls-ca-cert '/Users/peter/.docker/machines/ca.pem' CA to verify remotes against [$MACHINE_TLS_CA_CE --tls-ca-key '/Users/peter/.docker/machines/key.pem' Private key to generate certificates [$MACHINE_T --tls-client-cert '/Users/peter/.docker/machines/.client/cert.pem' Client cert to use for TLS [$MACHINE_TLS_CLIENT_C --tls-client-key '/Users/peter/.docker/machines/.client/key.pem' Private key used in client TLS auth [$MACHINE_TLS --help, -h show help --version, -v print the version
  11. 28 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker-machine upgrade tomcat INFO[0000] Stopping machine... INFO[0006] Downloading boot2docker... INFO[0467] Starting machine... INFO[0467] Waiting for VM to start... $ docker $(docker-machine config tomcat) info Containers: 11 Images: 178 Storage Driver: aufs Root Dir: /mnt/sda1/var/lib/docker/aufs Backing Filesystem: extfs Dirs: 200 Execution Driver: native-0.2 Kernel Version: 3.18.5-tinycore64 Operating System: Boot2Docker 1.5.0 (TCL 5.4); master : a66bce5 - Tue Feb 10 23:31:27 UTC 2015 CPUs: 4 Total Memory: 999.9 MiB Name: tomcat ID: GY5Q:RHHX:E4ZA:BGCI:TT57:AKLT:IOHG:JLB7:TOBD:AVXL:T4JT:A7AU Debug mode (server): true Debug mode (client): false Fds: 13 Goroutines: 16 EventsListeners: 0 Init Path: /usr/local/bin/docker Docker Root Dir: /mnt/sda1/var/lib/docker Username: rossbachp Registry: [https://index.docker.io/v1/]
  12. 34 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    curl -L https://github.com/docker/swarm/releases/download/v0.1.0-rc2/docker- chmod +x ~/bin/docker-swarm_darwin-amd64 ls -sf ~/bin/docker-swarm_darwin-amd64 ~/bin/docker-swarm curl -L https://github.com/docker/swarm/archive/v0.1.0-rc3.tar.gz | tar xzf cd swarm-v0.1.0-rc3 docker build -t "infrabricks/swarm:v0.1.0-rc3" . mkdir .swarm docker run --rm -v `pwd`/.swarm:/root/.swarm infrabricks/swarm:v0.1.0-rc3
  13. 35 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ swarm NAME: swarm - a Docker-native clustering system USAGE: swarm [global options] command [command options] [arguments...] VERSION: 0.1.0 (HEAD) COMMANDS: create, c create a cluster list, l list nodes in a cluster manage, m manage a docker cluster join, j join a docker cluster help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --debug debug mode [$DEBUG] --log-level, -l "info" Log level (options: debug, info, warn, error, fatal, panic) --help, -h show help --version, -v print the version DOCKER_OPTS="-H 0.0.0.0:2375"
  14. 36 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ echo "192.168.33.89:2375" >>swarm.nodes $ echo "192.168.33.90:2375" >>swarm.nodes $ swarm manage \ --discovery file://swarm.nodes -H=192.168.33.1:4375 $ swarm manage \ --discovery 192.168.33.89:2375,192.168.33.90:2375 \ -H=192.168.33.1:4375
  15. 37 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker -H 192.168.33.1:4375 info Containers: 6 Nodes: 2 dockerhost1: http://192.168.33.89:2375 dockerhost2: http://192.168.33.90:2375 $ DOCKER_HOST=192.168.33.1:4375 $ docker ps CONTAINER ID IMAGE COMMAND CREATED \ STATUS PORTS NAMES 9c79ad1c4958 nginx:latest "nginx -g 'daemon of 3 hours ago \ Up 3 hours 443/tcp, 192.168.33.90:8080->80/tcp \ dockerhost2/multiple-machine_nginx_1421067200 b791d3e7bcc9 tomcat:8.0 "catalina.sh run" 8 hours ago \ Up 8 hours 192.168.33.89:8081->8080/tcp \ dockerhost1/multiple-machine_tomcat1_1421047290 be35e34173c2 tomcat:8.0 "catalina.sh run" 28 hours ago \ Up 28 hours 192.168.33.89:8080->8080/tcp \ dockerhost1/multiple-machine_tomcat_1420977182 ...
  16. 40 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ CLUSTER_TOKEN=`swarm create` ## At every host... $ swarm join \ --addr=<node-ip>:2375 \ token://${CLUSTER_TOKEN} ## single swarm master $ swarm manage \ -H=<swarm_ip:swarm_port> \ token://${CLUSTER_TOKEN} ## docker clients connect swarm master $ docker -H <swarm_ip:swarm_port> info ... ## At every host... $ swarm join --addr=<node-ip>:2375 etcd://<etcd_ip>/<path> ## single swarm master $ swarm manage -H=<swarm_ip:swarm_port> etcd://<etcd_ip>/<path> ## docker clients connect swarm master docker -H <swarm_ip:swarm_port> info ...
  17. 41 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ swarm join \ # This can be an internal IP as long as the other # Docker hosts can reach it. --addr=192.168.33.89:2375 consul://192.168.33.1/swarm \ $ swarm manage \ -H=192.168.33.1:4375 consul://192.168.33.1/swarm \
  18. 42 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    docker run -m 1g ... docker run -c 1 ... docker run -p 80:80 ...
  19. 43 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker run -c 1 -p 9082:8080 -d tomcat:8.0 35d50a29ed0fde780c0826ef16ff24d2582609f877ee092c780d9aeb6f27fc75 $ docker ps CONTAINER ID IMAGE COMMAND CREATED \ STATUS PORTS NAMES 35d50a29ed0f tomcat:8.0 "catalina.sh run" 16 minutes ago\ Up Less than a second 192.168.33.89:9082->8080/tcp \ dockerhost1/insane_brattain 9c79ad1c4958 nginx:latest "nginx -g 'daemon of 5 hours ago\ Up 5 hours 443/tcp, 192.168.33.90:8080->80/tcp \ dockerhost2/multiple-machine_nginx_1421067200 ... $ docker run -c 1 -p 9083:8080 -d tomcat:8.0 f5bc6a274e82426df98eaca5e88fb01f43e03455dfebdb9ee4a3b00a7eab202e $ docker ps CONTAINER ID IMAGE COMMAND CREATED\ STATUS PORTS NAMES f5bc6a274e82 tomcat:8.0 "catalina.sh run" 16 minutes ago\ Up Less than a second 192.168.33.90:9083->8080/tcp \ dockerhost2/stupefied_albattani 35d50a29ed0f tomcat:8.0 "catalina.sh run" 17 minutes ago\ Up Less than a second 192.168.33.89:9082->8080/tcp \ dockerhost1/insane_brattain 9c79ad1c4958 nginx:latest "nginx -g 'daemon of 5 hours ago\ Up 5 hours 443/tcp, 192.168.33.90:8080->80/tcp \ dockerhost2/multiple-machine_nginx_1421067200 ...
  20. 45 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    lsb_release -a DOCKER_OPTS="--label region=de-berlin \ --label storage=ssd-vdi \ --label role=loadbalancer" docker -d ${DOCKER_OPTS} --label stage=prod docker run -e "constraint:operatingsystem=fedora" ... docker run -e "constraint:storagedriver=aufs" docker run -e "constraint:region=de-berlin"
  21. 49 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker $(docker-machine config dev2) \ build -t infrabricks/swarm:HEAD github.com/docker/swarm $ docker $(docker-machine config dev2) run -d \ -p 8400:8400 -p 8500:8500 -p 8600:53/udp \ infrabricks/consul -bootstrap
  22. 50 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ cd ~/.docker/machines/dev2 $ openssl x509 -in server.pem -noout -text X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Client Authentication, TLS Web Server Authentication X509v3 Basic Constraints: critical CA:FALSE X509v3 Subject Alternative Name: IP Address:192.168.99.101
  23. 51 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ cd /root $ mkdir swarm $ cd swarm $ openssl genrsa -out server-key.pem 2048 $ openssl req -subj "/O=dev2" -new -key server-key.pem -out server.csr $ echo "keyUsage=digitalSignature,keyEncipherment" >extfile.cnf $ echo "extendedKeyUsage=serverAuth,clientAuth" >> extfile.cnf $ echo "basicConstraints=CA:FALSE" >> extfile.cnf $ echo "subjectAltName=IP:$(docker-machine ip dev2)" >>extfile.cnf $ openssl x509 -req -days 365 -in server.csr \ -CA ~/.docker/machines/ca.pem \ -CAkey ~/.docker/machines/key.pem \ -CAcreateserial -out server.pem -extfile extfile.cnf $ scp -i ~/.docker/machines/dev2/id_rsa \ server-key.pem server.pem \ docker@$(docker-machine ip dev2):/tmp $ docker-machine ssh dev2 > mkdir swarm > cp /tmp/server-key.pem swarm/server-key.pem > cp /tmp/server.pem swarm/server.pem > exit
  24. 52 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker $(docker-machine config dev2) run -d \ -v `pwd`/.swarm:/root/.swarm \ -v /var/lib/boot2docker:/var/lib/boot2docker \ -v /home/docker/swarm:/home/docker/swarm \ -p 3376:3376 \ --restart=always \ infrabricks/swarm:HEAD manage \ --tlsverify \ --tlscacert=/var/lib/boot2docker/ca.pem \ --tlscert=/home/docker/swarm/server.pem \ --tlskey=/home/docker/swarm/server-key.pem \ -H tcp://0.0.0.0:3376 \ consul://$(docker-machine ip dev2):8500/swarm
  25. 53 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker $(docker-machine config dev2 | sed s/2376/3376/) ps CONTAINER ID IMAGE COMMAND CREATED $ docker $(docker-machine config dev2) run -d \ --restart=always \ infrabricks/swarm:HEAD join \ --addr=$(docker-machine ip dev2):2376 \ consul://$(docker-machine ip dev2):8500/swarm $ docker $(docker-machine config dev2) run --rm \ infrabricks/swarm:HEAD list \ consul://$(docker-machine ip dev2):8500/swarm 192.168.99.101:2376 $ docker $(docker-machine config dev2 | sed s/2376/3376/) ps CONTAINER ID IMAGE COMMAND 8f20f6498ebd infrabricks/swarm:HEAD "swarm join --addr=1 30 mi 80efa70506e7 infrabricks/swarm:HEAD "swarm manage --tlsv 8f4912369654 infrabricks/consul:latest "/usr/bin/consul age 31 mi
  26. 54 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ export DOCKER_TLS_VERIFY=yes $ export DOCKER_CERT_PATH=/Users/peter/.docker/machines/.client $ export DOCKER_HOST=tcp://$(docker-machine ip dev2):3376 $ docker version Client version: 1.4.1 Client API version: 1.16 Go version (client): go1.3.3 Git commit (client): 5bc2ff8 OS/Arch (client): darwin/amd64 Server version: swarm/0.1.0 Server API version: 1.16 Go version (server): go1.3.3 Git commit (server): 1c1e758
  27. 55 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    _dm() { _MACHINE=$1 shift docker $(docker-machine config $_MACHINE) $@ } alias dm="_dm $@" _dsm() { docker $(docker-machine config dev2| sed s/2376/3376/) $@ } alias dsm="_dsm $@" dm dev ps dms ps
  28. 56 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker stop $(docker ps -q) $ sudo /etc/init.d/docker stop $ cd /var/lib/boot2docker # add label $ sudo vi .profile EXTRA_ARGS='--tlsverify --tlscacert=/var/lib/boot2docker/ca.pem \ --tlskey=/var/lib/boot2docker/server-key.pem \ --tlscert=/var/lib/boot2docker/server.pem \ -H tcp://0.0.0.0:2376 \ --label region=de-bochum --label storage=ssd-vdi \ --label role=swarmmaster --label stage=dev' CACERT=/var/lib/boot2docker/ca.pem SERVERCERT=/var/lib/boot2docker/server.pem SERVERKEY=/var/lib/boot2docker/serverkey.pem DOCKER_TLS=no $ sudo /etc/init.d/docker start
  29. 57 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    docker-machine create -d virtualbox \ --swarm --swarm-master \ --swarm-discovery token://<TOKEN-FROM-ABOVE> swarm-master docker-machine create -d virtualbox \ --swarm \ --swarm-discovery token://<TOKEN-FROM-ABOVE> swarm-node-01
  30. 62 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    status: build: . tomcat: image: infrabricks/tomcat:8 ports: - "8080" volumes_from: - status volumes: - tomcat-users.xml:/opt/tomcat/conf/tomcat-users.xml environment: constraint: zone==dev constraint: disk==ssd SERVICE_8080_NAME: status_http SERVICE_8009_NAME: status_ajp SERVICE_TAGS: tomcat SERVICE_REGION: bee42.1
  31. 63 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    shipyardrethinkdbdata: image: shipyard/rethinkdb entrypoint: /bin/bash command: -l rethinkdb: image: shipyard/rethinkdb expose: - "8080" - "28015" - "29015" volumes_from: - shipyardrethinkdbdata shipyard: image: shipyard/shipyard ports: - "5080:8080" links: - rethinkdb:rethinkdb
  32. 65 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ export DOCKER_TLS_VERIFY=yes $ export DOCKER_CERT_PATH=/Users/peter/.docker/machines/.client $ export DOCKER_HOST=tcp://$(docker-machine ip dev2):2376 $ docker-compose up -d $ open http://$(docker-machine ip dev2):5080 $ docker $(docker-machine config dev2) run --rm -it shipyard/shipyard-cli admin/shipyard
  33. 71 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ cat > powerstrip-demo/adapters.yml <<EOF version: 1 endpoints: "POST /*/containers/create": pre: [slowreq] adapters: slowreq: http://slowreq/slowreq-adapter EOF
  34. 72 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker run -d --name powerstrip-slowreq \ --expose 80 \ clusterhq/powerstrip-slowreq:v0.0.1 $ docker run -d --name powerstrip \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $PWD/powerstrip-demo/adapters.yml:/etc/powerstrip/adapters.yml \ --link powerstrip-slowreq:slowreq \ -p 2375:2375 \ clusterhq/powerstrip:v0.0.1
  35. 76 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ brew install bash-completion $ cat >>~/.bash_profile <<EOT if [ -f $(brew --prefix)/etc/bash_completion ]; then . $(brew --prefix)/etc/bash_completion fi EOT $ curl -L https://raw.githubusercontent.com/docker/fig/master/contrib/comple $ curl -L https://raw.githubusercontent.com/docker/docker/master/contrib/com $ . ~/.bash_profile
  36. 77 / 86 © 2015 <[email protected]>, @PRossbach, Microservice Meetup Berlin

    $ docker run -d -p 8000:80 rossbachp/docker-orchestration:mberlin-201502 $ open http://<docker host>:8000/docker-orchestration