Cet article dĂ©bute sans doute une sĂ©rie dĂ©diĂ©e Ă Docker. En effet aucun admin sys et dĂ©veloppeur nâa pu ignorer lâexistence de cette technologie en train de rĂ©volutionner notre mĂ©tier. Je ne vais pas ressasser sur Docker ce que lâon trouve dĂ©jĂ partout sur Internet, pour rĂ©sumer, il fourni les outils au codeur de dĂ©velopper dans un environnement qui sera identique Ă la production, et de mettre lui mĂȘme en production. En se soustrayant des administrateurs systĂšmes, les livraisons sont plus rapide, et fonctionne dans un conteneur Ă©tanche. Pour un Ă©diteur, la fourniture dâun conteneur garantira la bonne exĂ©cution du produit, lâimage docker contenant toutes les bibliothĂšques et logiciels nĂ©cessaires, indĂ©pendamment de lâOS hĂŽte.
Pour lâadministrateur systĂšme, plus besoin de jongler entre X versions de bibliothĂšques (PHP, java, ⊠) ce qui se finissait le plus souvent par dĂ©ployer une VM par produit.
Docker fait parti de ces outils du mouvement devops, oĂč le dĂ©veloppeur est responsable et a la maitrise de son application du dĂ©veloppement Ă la production.
Comme toujours sur MacOS le plus simple est dâutiliser homebrew. Un simple brew install docker suffit. Le client docker sera installĂ© et permettra de piloter ses conteneurs Docker. Cependant pour les piloter sur sa machine de dĂ©veloppement il faut y ajouter les paquets docker-machine et docker-machine-driver-xhyve (on reverra ce dernier Ă la fin).
il permet de gĂ©rer des environnements serveur de docker. En une ligne il peut installer un serveur Docker sur une machine distante ou locale, il faut pour cela dĂ©ployer votre clĂ© ssh publique dans lâenvironnement root cible :
ssh-copy-id -i .ssh/id_rsa.pub root@IP`
puis on peut lancer docker-machine :
docker-machine create --driver generic --generic-ip-address=x.x.x.x server`
server doit ĂȘtre indiquĂ© dans le fichier .ssh/config :
cat .ssh/config
Host server
User root
Hostname IP
âdriver est une option qui permet de dĂ©ployer un serveur docker sur un cloud public en utilisant lâAPI du cloud, ou sur un serveur Linux type deb/yum en spĂ©cifiant generic. Voir la liste des drivers. Avec lâoption generic, docker-machine ajoutera sâil est absent le dĂ©pĂŽt docker dans le rĂ©pertoire /etc/apt/sources.list.d sur un serveur Linux deb/yum (ubuntu,debian,centos..)
docker-machine create --driver generic --generic-ip-address=192.168.0.35 nuc
Running pre-create checks...
Creating machine...
(nuc) No SSH key specified. Assuming an existing key at the default location.
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with ubuntu(systemd)...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env nuc
on peut visualiser le serveur créé avec docker-machine ls :
docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
nuc - generic Running tcp://192.168.0.35:2376 v1.12.1
et se connecter en ssh :
docker-machine ssh nuc
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-38-generic x86_64)
Documentation: https://help.ubuntu.com
Management: https://landscape.canonical.com
Support: https://ubuntu.com/advantage
0 packages can be updated.
0 updates are security updates.
Last login: Sun Oct 2 11:55:15 2016 from 192.168.0.40
root@nuc:~#
il faut ensuite positionner les variables dâenvironnement associĂ©es Ă ce serveur
eval $(docker-machine env nuc)
le client docker du Mac peut ensuite gérer ce serveur :
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.1
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 0
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: host null bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 15.6 GiB
Name: nuc
ID: OJBG:ERG4:2QIF:2BPI:N5E3:ULNQ:NJC7:WCM6:MGV7:E3JG:M74I:52AT
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: fredix
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Labels:
provider=generic
Insecure Registries:
127.0.0.0/8
Comme on le voit le serveur nuc est une Ubuntu 16.04.1 LTS sur mon réseau local.
Le premier test est dâinstaller une image Alpine Linux qui va afficher une ligne Hello world :
docker run --rm alpine /bin/echo 'Hello world'
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
c0cb142e4345: Pull complete
Digest: sha256:ca7b185775966003d38ccbd9bba822fb570766e4bb69292ac23490f36f8a742e
Status: Downloaded newer image for alpine:latest
Hello world
Lâimage de alpine nâĂ©tait pas prĂ©sente, docker lâa tĂ©lĂ©chargĂ© du hub docker , puis exĂ©cutĂ© la commande echo. Si on souhaite lancer un conteneur qui utilise Alpine, lâimage ne sera pas tĂ©lĂ©chargĂ©e Ă nouveau. lâoption -rm demande Ă docker de supprimer le conteneur dĂšs quâil a terminĂ© sa tĂąche. Lorsque le conteneur a terminĂ© sa tĂąche un docker ps nâaffiche rien, si lâoption -rm nâest pas positionnĂ©e il est visible avec un docker ps -a :
docker run alpine /bin/echo 'Hello world'
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b9bc74dd21a alpine "/bin/echo 'Hello wor" 7 seconds ago Exited (0) 6 seconds ago grave_ramanujan
un conteneur stoppĂ© peut ĂȘtre relancĂ©
docker start grave_ramanujan
puis voir la sortie dans le fichier de logs
docker logs grave_ramanujan
Hello world
Ce conteneur utilise une image Alpine linux :
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest ee4603260daa 8 days ago 4.803 MB
On peut stopper un conteneur, le supprimer, et supprimer Ă©galement une image si plus aucun conteneur ne lâutilise :
docker stop grave_ramanujan
docker rm grave_ramanujan
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest ee4603260daa 8 days ago 4.803 MB
docker ami
docker rmi ee4603260daa
Error response from daemon: conflict: unable to delete ee4603260daa (must be forced) - image is being used by stopped container 7b9bc74dd21a
On voit quâon ne peut pas supprimer lâimage car utilisĂ©e par notre conteneur.
docker rm grave_ramanujan
grave_ramanujan
docker rmi ee4603260daa
Untagged: alpine:latest
Untagged: alpine@sha256:ca7b185775966003d38ccbd9bba822fb570766e4bb69292ac23490f36f8a742e
Deleted: sha256:ee4603260daafe1a8c2f3b78fd760922918ab2441cbb2853ed5c439e59c52f96
Deleted: sha256:9007f5987db353ec398a223bc5a135c5a9601798ba20a1abba537ea2f8ac765f
Cet exemple Hello World est trĂšs basique, mais il existe des images docker trĂšs complĂšte, comme le cloud opensource cozycloud qui contient tous les composants nĂ©cessaire (base de donnĂ©es, serveur web, âŠ).
Un autre driver docker-machine permet de sâabstenir de lâusage dâun serveur Linux. Auparavant il fallait installer virtualbox, mais depuis Yosemite, OSX embarque un hyperviseur en natif. Le projet xhyve un fork de bhyve exploite cet hyperviseur, il suffit dâinstaller avec brew le driver docker-machine-driver-xhyve pour lâutiliser :
brew install docker-machine-driver-xhyve
docker-machine create --driver xhyve xhyve1
âŠ
docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
xhyve1 - xhyve Running tcp://192.168.64.9:2376 v1.12.1
eval $(docker-machine env xhyve1)
docker run alpine /bin/echo 'Hello world'
Si on se connecte en ssh avec docker-machine on constate que Linux est un Boot2Docker. Ce systĂšme est uniquement dĂ©diĂ© Ă faire tourner des conteneurs Docker, vim nâĂ©tant mĂȘme pas installĂ©.
docker-machine ssh xhyve1
.
## ## ==
## ## ## ## ===
/"""""""""""""""""\___/ ===
~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.12.1, build HEAD : ef7d0b4 - Thu Aug 18 21:18:06 UTC 2016
Docker version 1.12.1, build 23cf638
docker@boot2docker:~$ lsb_release -a
Boot2Docker 1.12.1 (TCL 7.2); HEAD : ef7d0b4 - Thu Aug 18 21:18:06 UTC 2016
VoilĂ pour dĂ©buter, nâhĂ©sitez pas Ă tester cozycloud ou mattermost pour voir comment sâinstalle et se lance en quelques minutes une application complexe en local dans votre machine ou votre propre serveur.
DerniĂšre info et non des moindres, lorsquâun conteneur est supprimĂ© toutes les donnĂ©es quâil contient le sont Ă©galement ; il faudra donc utiliser des volumes docker pour mettre en place une persistence sur le serveur hĂŽte.