How Docker is making Devops skills obsolete

How Docker is making Devops work sweet

Steve (marksteve)

  • Web developer at Insync

  • Python, Javascript and Go

  • Docker fan since 0.4

  • Contributed a bit to docker-compose

Machine

It's like terraform, but with more Docker

Install

  • http://docs.docker.com/machine/#installation
  • brew cask install docker-machine
$ docker-machine create --help | wc -l
     117
$ docker-machine create --help | grep digitalocean
   --digitalocean-access-token
Digital Ocean access token [$DIGITALOCEAN_ACCESS_TOKEN]
   --digitalocean-image "ubuntu-14-04-x64"
Digital Ocean Image [$DIGITALOCEAN_IMAGE]
   --digitalocean-region "nyc3"
Digital Ocean region [$DIGITALOCEAN_REGION]
   --digitalocean-size "512mb"
Digital Ocean size [$DIGITALOCEAN_SIZE]
   --driver, -d "none"
Driver to create machine with. Available drivers: amazonec2, azure,
digitalocean, google, none, openstack, rackspace, softlayer, virtualbox,
vmwarefusion, vmwarevcloudair, vmwarevsphere
$ docker-machine create -d digitalocean \
  --digitalocean-access-token $(cat .do_token) \
  --digitalocean-image docker \
  --digitalocean-region sgp1 \
  docker-machine-test
INFO[0000] Creating SSH key...
INFO[0002] Creating Digital Ocean droplet...
INFO[0006] Waiting for SSH...
INFO[0075] Configuring Machine...
INFO[0091] "docker-machine-test" has been created and is now the active machine.
INFO[0091] To point your Docker client at it, run this in your shell:
$(docker-machine env docker-machine-test)
$ docker-machine ls
NAME                  ACTIVE   DRIVER         STATE     
docker-machine-test   *        digitalocean   Running
URL                          SWARM
tcp://128.199.65.118:2376
$ docker ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
$ cat Dockerfile
FROM python:3.4-onbuild
CMD ["python", "app.py"]
$ cat requirements.txt
Flask
$ cat app.py
import os

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return "Hello from {}".format(os.environ['HOSTNAME'])


app.run(host='0.0.0.0')
$ docker build --rm -t marksteve/flask-app .
  ...
$ docker run -d \
  --name flask-app \
  -h flask-app \
  -p 5000:5000 \
  marksteve/flask-app
$ docker ps
  ...
$ curl $(docker-machine ip):5000
Hello from flask-app
$ docker rm -f flask-app
flask-app

Swarm

Docker is web scale

$ docker run --rm swarm create
fcdc4eeff9c6e809e7863b08bc1c8252

$ docker-machine create \
  -d digitalocean \
  --digitalocean-access-token $(cat .do_token) \
  --digitalocean-image docker \
  --digitalocean-region sgp1 \
  --swarm \
  --swarm-discovery \
  token://fcdc4eeff9c6e809e7863b08bc1c8252 \
  docker-swarm-test

$ docker-machine create \
  -d digitalocean \
  --digitalocean-access-token $(cat .do_token) \
  --digitalocean-image docker \
  --digitalocean-region sgp1 \
  --swarm \
  --swarm-master \
  --swarm-discovery \
  token://fcdc4eeff9c6e809e7863b08bc1c8252 \
  docker-swarm-master

$ $(docker-machine env --swarm docker-swarm-master)
$ docker info
Containers: 3
Nodes: 2
 docker-swarm-master: 128.199.198.38:2376
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 490 MiB
 docker-swarm-test: 128.199.65.118:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 490 MiB
$ docker run -d -p 5000:5000 marksteve/flask-app
$ docker run -d -p 5000:5000 marksteve/flask-app
$ docker ps
... PORTS
... 128.199.65.118:5000->5000/tcp
... 128.199.198.38:5000->5000/tcp
$ docker run -d -p 5000:5000 marksteve/flask-app
FATA[0000] Error response from daemon: unable to
find a node with port 5000 available

Discovery

  • Docker hosted (token://)
  • Static file (file://)
  • Etcd (etcd://)
  • Consul (consul://)
  • Zookeeper (zk://)

Strategies

  • BinPacking
  • Random

Filters

  • Constraint
    • docker --label tag=something
    • docker run -e constraint:storage==ssd
  • Affinity
    • docker run -e affinity:container==container_name
    • docker run -e affinity:image==redis
  • Port
  • Dependency
docker rm $(docker ps -aq)
docker-machine rm $(docker ls -q)

Questions?

Made with Slides.com