docker extended

 

docker

 

client

daemon

http :2376

https://github.com/stage1/docker-php

$ docker -H tcp://192.168.10.1:2376 ps

$ export DOCKER_HOST="tcp://192.168.10.1:2376"
$ docker ps

client

local daemon

virtual machine

remote server

docker-machine

 

docker-machine

  • ls
  • create
  • start
  • stop
  • status
  • ssh
  • upgrade
  • rm
  • ...
$ docker-machine create --driver virtualbox demo
...


$ docker-machine ls
NAME           ACTIVE   DRIVER       STATE     URL                         SWARM
demo           -        virtualbox   Running   tcp://192.168.99.100:2376   


$ docker-machine env demo
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/jderusse/.docker/machine/machines/demo"
export DOCKER_MACHINE_NAME="demo"
# Run this command to configure your shell: 
# eval "$(/usr/local/bin/docker-machine env demo)"


$ eval "$(docker-machine env demo)"


$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

https://github.com/docker/machine/blob/master/contrib/completion/bash/docker-machine.bash

available drivers

  • Oracle VirtualBox
  • VMware vSphere
  • Amazon Web Services
  • Microsoft Azure
  • Digital Ocean
  • Google Compute Engine
  • OpenStack
  • ...
  • Generic

https://docs.docker.com/machine/drivers/

$ docker-machine create --driver amazonec2 \
    --amazonec2-access-key AKI******* \
    --amazonec2-secret-key 8T93C********* \
    --amazonec2-vpc-id vpc-****** \
    --amazonec2-ami ami-5f709f34 \
    --amazonec2-root-size 16 \
    demo2
$ tree ~/.docker/
/home/jderusse/.docker/
└── machine
    ├── certs
    │   ├── ca-key.pem
    │   ├── ca.pem
    │   ├── cert.pem
    │   └── key.pem
    └── machines
        ├── demo
        │   ├── boot2docker.iso
        │   ├── ca.pem
        │   ├── cert.pem
        │   ├── config.json
        │   ├── demo
        │   │   ├── demo.vbox
        │   │   ├── demo.vbox-prev
        │   │   └── Logs
        │   │       └── VBox.log
        │   ├── disk.vmdk
        │   ├── id_rsa
        │   ├── id_rsa.pub
        │   ├── key.pem
        │   ├── server-key.pem
        │   └── server.pem
        └── demo2
            ├── ca.pem
            ├── cert.pem
            ├── config.json
            ├── id_rsa
            ├── id_rsa.pub
            ├── key.pem
            ├── server-key.pem
            └── server.pem

docker volume

 

docker volume

  • ls
  • create
  • inspect
  • rm
$ docker volume create --name demo_volume
demo_volume

$ docker run -v demo_volume:/foo debian touch /foo/test

$ docker run -v demo_volume:/bar debian ls -al /bar
total 8
drwxr-xr-x 2 root root 4096 Jan  5 12:12 .
drwxr-xr-x 1 root root 4096 Jan  5 12:12 ..
-rw-r--r-- 1 root root    0 Jan  5 12:12 test

plugins

  • flocker
  • nfs
  • convoy
  • glusterfs
  • rex-ray
  • ...
$ docker volume create --driver nfs --name localhost/demo 

$ docker run --rm -v localhost/demo:/foo debian ls -al /foo

docker network

 

docker network

  • ls
  • create
  • connect
  • disconnect
  • inspect
  • rm
$ docker network create demo

$ docker network ls
NETWORK ID          NAME                DRIVER
b7c9b6d0c133        demo                bridge  
bfc56a57191f        none                null                
0a07e021ffd5        host                host                
a69e42ce961a        bridge              bridge              

$ docker run --rm -ti \
  --name hostA \
  debian bash
$ docker run --rm -ti \
  --name hostB \
  --net demo \
  debian bash
$ docker run --rm -ti \
  --name hostC \
  --net demo \
  debian bash
$ ping -c 1 hostB
ping: unknown host
$ ping -c 1 hostC                                                                                   
PING hostC (172.21.0.4): 56 data bytes
64 bytes from 172.21.0.4: icmp_seq=0 ttl=64 time=0.069 ms
--- hostC ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.069/0.069/0.069/0.000 ms
$ ping -c 1 hostA                                                                               
ping: unknown host
$ docker network connect demo hostA
$ ping -c 1 hostB                                                                                   
PING hostB (172.21.0.3): 56 data bytes
64 bytes from 172.21.0.3: icmp_seq=0 ttl=64 time=0.069 ms
--- hostB ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.069/0.069/0.069/0.000 ms
$ ping -c 1 hostC                                                                                   
PING hostC (172.21.0.4): 56 data bytes
64 bytes from 172.21.0.4: icmp_seq=0 ttl=64 time=0.069 ms
--- hostC ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.069/0.069/0.069/0.000 ms
$ ping -c 1 hostA
PING hostA (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: icmp_seq=0 ttl=64 time=0.069 ms
--- hostA ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.069/0.069/0.069/0.000 ms
$ docker run --rm -ti \
  --name hostA \
  debian bash
$ docker run --rm -ti \
  --name hostB \
  --net demo \
  debian bash
$ docker run --rm -ti \
  --name hostC \
  --net demo \
  debian bash
app:
    build: docker/app
    volumes:
        - .:/srv
    links:
        - db

db:
    image: postgres

BEFORE

app:
    build: docker/app
    volumes:
        - .:/srv
    net: app

db:
    image: postgres
    net: app

AFTER

app:
    build: docker/app
    volumes:
        - .:/srv

db:
    image: postgres

OR

$ docker-compose --x-networking up
$ docker network create front

$ docker network create back


$ docker network connect front app

$ docker network connect front rabbitmq
$ docker network connect back rabbitmq

$ docker network connect back worker

front

back

app

rabbitmq

worker

plugins

  • bridge
  • overlay
  • weave
  • ...
$ docker network create --driver overlay front

$ docker-compose up -d app

$ docker-compose scale app=3

docker swarm

 

docker run --rm swarm

 

$ docker run swarm create
cdd37d9dd457616dfd0c1255fa43cc5f

$ docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-master \
        --swarm-discovery token://cdd37d9dd457616dfd0c1255fa43cc5f \
        swarm-master

$ docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-discovery token://cdd37d9dd457616dfd0c1255fa43cc5f \
        swarm-node-01

$ docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM
demo            -        virtualbox   Running   tcp://192.168.99.100:2376   
swarm-master    *        virtualbox   Running                               swarm-master (master)
swarm-node-01   *        virtualbox   Running                               swarm-master

$ docker-machine env --swarm swarm-master
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:3376"
export DOCKER_CERT_PATH="/home/jderusse/.docker/machine/machines/swarm-master"
export DOCKER_MACHINE_NAME="swarm-master"
$ eval "$(docker-machine env --swarm swarm-master)"

$ docker run -d nginx

$ docker ps
CONTAINER ID  IMAGE  COMMAND                 PORTS            NAMES
d1ef73f4d236  nginx  "nginx -g 'daemon off"  80/tcp, 443/tcp  swarm-node-01/distracted_mccarthy

$ docker run -d nginx

$ docker ps
CONTAINER ID  IMAGE  COMMAND                 PORTS            NAMES
d1ef73f4d236  nginx  "nginx -g 'daemon off"  80/tcp, 443/tcp  swarm-node-01/distracted_mccarthy
4c13d63943b6  nginx  "nginx -g 'daemon off"  80/tcp, 443/tcp  swarm-master/desperate_engelbart
$ eval "$(docker-machine env swarm-master)"

$ docker ps
CONTAINER ID  IMAGE         COMMAND                 PORTS              NAMES
d1ef73f4d236  nginx         "nginx -g 'daemon off"  80/tcp, 443/tcp    distracted_mccarthy
d4b622c7bca7  swarm:latest  "/swarm join --advert"  2375/tcp           swarm-agent
$ eval "$(docker-machine env swarm-master)"

$ docker ps
CONTAINER ID  IMAGE         COMMAND                 PORTS              NAMES
4c13d63943b6  nginx         "nginx -g 'daemon off"  80/tcp, 443/tcp    desperate_engelbart
837fc704ec30  swarm:latest  "/swarm join --advert"  2375/tcp           swarm-agent
d3a6552596e7  swarm:latest  "/swarm manage --tlsv"  2375/tcp, 0.0.0.0  swarm-agent-master
$ docker run swarm create
cdd37d9dd457616dfd0c1255fa43cc5f

$ docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-master \
        --swarm-discovery token://cdd37d9dd457616dfd0c1255fa43cc5f \
        swarm-master



$ docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-discovery token://cdd37d9dd457616dfd0c1255fa43cc5f \
        swarm-node-01



$ docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-master \
        --swarm-discovery="consul://my_consul_host:8500" \
        --engine-opt="cluster-store=consul://my_consul_host:8500" \
        --engine-opt="cluster-advertise=eth1:2376" \
        swarm-master

$ docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-discovery="consul://my_consul_host:8500" \
        --engine-opt="cluster-store=consul://my_consul_host:8500" \
        --engine-opt="cluster-advertise=eth1:2376" \
        swarm-node-01

$ docker network create --driver overlay demo

swarm-master

swarm-node-01

demo

 

 

 

 

side effects

  • not stable (consul unreachable)
  • no links => docker network
  • no volumes_from => docker volume ?
  • no shares with host => everything in containers

Questions ?

Docker extended

By Jérémy DERUSSÉ