Vous avez besoin de faire des tests sur Docker ? Connaissez-vous Play With Docker, connu également sous le nom Docker Playground ou sous le trigramme PWD ? Ce service gratuit permet de créer un cluster de VMs prêtes pour utiliser Docker. Il est possible de créer jusqu’à 5 instances. Le cluster a une durée de vie limitée à 4h. Ce service est vraiment utile pour tester des images Docker ou bien pour des ateliers ou des formations.

Premiers pas

Pour commencer, il faut cliquer sur “Je ne suis pas un robot”. Votre session commence à cet instant. Pour ajouter une VM, il faut cliquer sur “add new instance”. Un terminal s’ouvre alors et il est possible d’exécuter des commandes Docker. Par exemple, il est possible de démarrer un serveur Nginx accessible par tous :

$ docker run -d -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
ff3d52d8f55f: Pull complete
b05436c68d6a: Pull complete
961dd3f5d836: Pull complete
Digest: sha256:12d30ce421ad530494d588f87b2328ddc3cae666e77ea1ae5ac3a6661e52cde6
Status: Downloaded newer image for nginx:latest
2e76f6c801620d46874ba65c9d05e31374f80f023f318d4fa7888cb8d6a0a604
[node2] (local) root@10.0.27.4 ~
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
2e76f6c80162        nginx               "nginx -g 'daemon ..."   52 seconds ago      Up 51 seconds       0.0.0.0:80->80/tcp   practical_ardinghelli
[node2] (local) root@10.0.27.4 ~
$ wget http://pwd10_0_27_4-80.host2.labs.play-with-docker.com/
Connecting to pwd10_0_27_4-80.host2.labs.play-with-docker.com (10.0.27.4:80)
index.html           100% |******************************************************************************************************************|   612   0:00:00 ETA

Quelques secondes après avoir démarré le conteneur de Nginx, un lien “80” s’affiche à côté de l’adresse IP publique de la VM. Ce lien pointe sur la page d’accueil du serveur Nginx !

En moins de 20 secondes, vous avez un serveur web accessible! Git étant disponible sur ces VMs, je vous laisse imaginer tout ce qu’il est possible de faire en très peu de temps. 😉

Docker Machine

Même si c’est sympa de tout faire depuis son butineur, ce serait plus pratique de le faire depuis un terminal. Justement, il existe un driver pour Docker Machine qui permet de commander PWD. Ce driver nécessite d’avoir la dernière version de Go (1.8.1 au moment de la rédaction) pour l’installer :

$ go version
go version go1.8.1 windows/amd64

# installation du driver
$ go get github.com/play-with-docker/docker-machine-driver-pwd

Ensuite, il faut configurer le driver pour pointer vers la session en renseignant l’URL de votre session dans une variable d’environnement :

export PWD_URL="http://host2.labs.play-with-docker.com/p/e894706e-2dd4-42a0-bd7f-08337ba2b490"

Pour créer une nouvelle VM Docker, il suffit alors d’utiliser le driver ainsi depuis votre machine :

$ docker-machine create -d pwd node1
Running pre-create checks...
Creating machine...
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env node1

$ eval $(docker-machine env node1)

$ docker run -d -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx

ff3d52d8f55f: Pull complete 28 MB/23.28 MBB
b05436c68d6a: Pull complete 53 MB/21.53 MBB
961dd3f5d836: Pull complete 194 B/194 BB
Digest: sha256:12d30ce421ad530494d588f87b2328ddc3cae666e77ea1ae5ac3a6661e52cde6
Status: Downloaded newer image for nginx:latest
eefb33f08f01d158620f569867fa414240c023f1afd2c03b2dde5585c286407b

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
eefb33f08f01        nginx               "nginx -g 'daemon off"   6 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp   dazzling_jennings

Malheureusement, la commande docker-machine ssh n’est pas (encore) implémentée. Il n’est donc pas possible de se connecter sur cette VM. Si vous souhaitez exécuter des commandes autres que celles de docker, il faudra repasser par le butineur.
Depuis très peu de temps, le pilote supporte la commande docker-machine ssh. Ceci peut se révéler très pratique pour exécuter des commandes (autres que docker) sur ces VMs sans passer par votre butineur préféré. Voici comment procéder :

$ docker-machine ssh node1
Connecting to 10.0.71.3
###############################################################
#                          WARNING!!!!                        #
# This is a sandbox environment. Using personal credentials   #
# is HIGHLY! discouraged. Any consequences of doing so, are   #
# completely the user's responsibilites.                      #
#                                                             #
# The PWD team.                                               #
###############################################################
[node1] (local) root@10.0.71.3 ~
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
eefb33f08f01        nginx               "nginx -g 'daemon ..."   17 seconds ago      Up 16 seconds       0.0.0.0:80->80/tcp   dazzling_jennings

Docker Swarm

Il est alors très simple de créer un cluster Docker Swarm avec 3 nœuds :

# création du premier nœud "leader"
$ docker-machine create -d pwd node1 && eval $(docker-machine env node1)
Running pre-create checks...
Creating machine...
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env node1

$ docker swarm init --advertise-addr eth0
Swarm initialized: current node (smo5n466e923fjcovafdjeu8p) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-1tdzceflrsymnkq6p3otr70x7t4f86owbtuvs3hklo9whz4ii4-7aqze2ui7w5rttqz21t2wlt3l \
    10.0.46.3:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

$ export SWARM_TOKEN=SWMTKN-1-1tdzceflrsymnkq6p3otr70x7t4f86owbtuvs3hklo9whz4ii4-7aqze2ui7w5rttqz21t2wlt3l

# création du second nœud rejoignant le cluster
$ docker-machine create -d pwd node2 && eval $(docker-machine env node2)
Running pre-create checks...
Creating machine...
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env node2

$ docker swarm join \
  --token $SWARM_TOKEN \
  10.0.46.3:2377
This node joined a swarm as a worker.

# création du troisième nœud rejoignant le cluster
$ docker-machine create -d pwd node3 && eval $(docker-machine env node3)
Running pre-create checks...
Creating machine...
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env node3

$ docker swarm join \
  --token $SWARM_TOKEN \
  10.0.46.3:2377
This node joined a swarm as a worker.

# démarrage d'une service Nginx avec 3 replicas
$ eval $(docker-machine env node1)
$ docker service create \
  --name my_web \
  --replicas 3 \
  --publish 80:80 \
  nginx
tu21f34xc0br26tp9v23vsf93
Since --detach=false was not specified, tasks will be created in the background.
In a future release, --detach=false will become the default.

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
dbc0r6i379sj55h2kah10ln73     node3               Ready               Active
o9ek9mvqjgzxm9hzak7qte46a *   node1               Ready               Active              Leader
qw87kxjhc8tyezg8rxx4ctjzp     node2               Ready               Active

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
tu21f34xc0br        my_web              replicated          3/3                 nginx:latest        *:80->80/tcp

Ces quelques commandes nous ont permis de tester très rapidement Docker Swarm sans avoir à créer des VMs sur notre machine locale. Ce qui se révèle très pratique et confortable. Déjà que Docker apportait une certaine facilité à tester des outils, ils viennent de lever une nouvelle barrière avec PWD.

A noter qu’il est préférable de ne pas utiliser de données sensibles sur cet environnement. On ne sait jamais, elles pourraient être accessibles (par erreur) pour d’autres utilisateurs.

Pour ma part, il ne me reste plus qu’à créer des Docker Stack et à les déposer sur un dépôt Git pour tester tout ça. Et vous ?