Voici la suite de mon retour sur Docker, après une présentation du projet publié hier.
Pour ma part, j’en ai entendu parler en janvier 2014, lors de l’appel aux conférenciers de Devoxx France 2014. Nous avons reçu plus d’une dizaine de propositions de sujets sur Docker. Docker est un phénomène à lui tout seul. C’est l’un des projets open-source de 2013 qui a fait le plus de buzz. J’ai ensuite lu et testé grâce aux articles de David Gageot sur son blog « Java Bien« .
Docker peut s’installer aujourd’hui sur Linux, mais aussi sur Mac OS X et Microsoft Windows, grâce au projet boot2docker, qui vous propose une petite image avec 1Gb de mémoire, souvent suffisante pour des petites applications.
Voyons comment installer Docker et boot2docker sur Mac. Pour cela, il faudra installer XCode, homebrew, virtualbox et enfin boot2docker. Bonne nouvelle : tout cela ne prend pas plus de 10mn.
Installer XCode
Installez XCode via l’AppStore. Ceci vous permettra d’avoir la partie Command Tools avec entre autre, make et gcc, dont nous aurons besoin tout à l’heure. L’installation de XCode est différente selon les versions de Mac OS X.
Installer Homebrew
Homebrew est un gestionnaire de paquets pour Mac OS. Il vous permet d’installer rapidement les outils les plus populaires comme git ou curl par exemple. Pour l’installation, il faudra cependant vous assurer que ruby est installé, ce qui est le cas sur les dernières versions de Mac OS X par défaut.
Ouvrez un terminal et exécutez cette commande :
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
Une fois que brew est installé, vous pouvez alors vérifier son fonctionnement
brew
Vérifiez au passage si votre système est prêt à recevoir les formules, en utilisant la commande doctor
brew doctor ... ... Run `brew missing` for more details.
Si vous souhaitez mettre à jour votre version de brew, vous pouvez aussi utiliser la commande update :
brew update
Installer boot2docker avec Homebrew
Je vous le déconseille (juillet 2014). La version de boot2docker proposée par défaut via Homebrew est la version 1.1.1, qui sera incompatible avec votre installation de docker.
Vous allez vous retrouver avec un client (la commande docker sur votre mac) qui sera plus récente que le serveur (docker sur votre VM, dans boot2docker).
nicolas@macbook :~> docker version Client version: 1.1.1 Client API version: 1.13 Go version (client): go1.3 Git commit (client): dc62f3c 2014/07/14 17:15:31 Error response from daemon: client and server don't have same version (client : 1.13, server: 1.10)
Si vous êtes dans cette situation, il faut alors mettre à jour soit le client, soit boot2docker.
Mettre à jour boot2docker
La commande « download » permet de récupérer la dernière version de boot2docker :
nicolas@macbook :~> boot2docker download 2014/07/14 17:21:05 Downloading boot2docker ISO image... 2014/07/14 17:21:06 Latest release is v1.1.1 2014/07/14 17:23:28 Success: downloaded https://github.com/boot2docker/boot2docker/releases/download/v1.1.1/boot2docker.iso to /Users/nicolas/.boot2docker/boot2docker.iso nicolas@macbook :~> boot2docker version Client version: v1.1.1 Git commit: 8dd1935
Attention, lorsque vous mettez à jour boot2docker, il faut aussi effacer et recréer votre image sur VirtualBox. Si vous ne faites pas cela, vous aurez ce type de message d’erreur:
nicolas@macbook :~> docker run -d -p 43000:80 tutum/wordpress 2014/07/14 19:53:49 Post http://localhost:4243/v1.13/containers/create: EOF
Il faut donc effacer et réinitialiser votre image :
nicolas@macbook :~> boot2docker delete nicolas@macbook :~> boot2docker init 2014/07/14 19:56:25 Creating VM boot2docker-vm... 2014/07/14 19:56:26 Apply interim patch to VM boot2docker-vm (https://www.virtualbox.org/ticket/12748) 2014/07/14 19:56:26 Setting NIC #1 to use NAT network... 2014/07/14 19:56:26 Port forwarding [ssh] tcp://127.0.0.1:2022 --> :22 2014/07/14 19:56:26 Port forwarding [docker] tcp://127.0.0.1:2375 --> :2375 2014/07/14 19:56:26 Setting NIC #2 to use host-only network "vboxnet0"... 2014/07/14 19:56:26 Setting VM storage... 2014/07/14 19:56:31 Done. Type `boot2docker up` to start the VM. nicolas@macbook :~> boot2docker up 2014/07/14 19:56:36 Waiting for VM to be started... .......... 2014/07/14 19:57:06 Started. 2014/07/14 19:57:06 To connect the Docker client to the Docker daemon, please set: 2014/07/14 19:57:06 export DOCKER_HOST=tcp://192.168.59.103:2375
Enfin pour vérifier que client comme serveur sont à jour :
nicolas@macbook :~> export DOCKER_HOST=tcp://192.168.59.103:2375 nicolas@macbook :~> docker version Client version: 1.1.1 Client API version: 1.13 Go version (client): go1.3 Git commit (client): dc62f3c Server version: 1.1.1 Server API version: 1.13 Go version (server): go1.2.1 Git commit (server): bd609d2
Installer docmac (alternatif si l’installation via Homebrew ne fonctionne pas)
Note : ce qui suit ci-dessous a été écrit avant qu’il n’existe une formule homebrew pour boot2docker
Je fais le choix de passer par l’installation de docker via le projet docmac. Celui-ci va installer VirtualBox, une VM pour avoir un linux, puis boot2docker, un linux très léger pour faire fonctionner ensuite le conteneur Docker. Vos conteneurs dockers tourneront donc sur Linux, dans une VM, sur votre Mac 🙂
Ouvrez un terminal puis exécutez la commande suivante :
curl -L https://raw.github.com/thlorenz/docmac/master/bin/docmac.sh | sh
Si curl n’est pas installé, vous pouvez l’installer avec « brew install curl »
Une fois l’installation terminée, vous verrez ceci dans votre terminal :
... Forwarding default docker ports (49000..49900) on boot2docker-vm (this may take a while, so be patient) ... Add "export DOCKER_HOST=tcp://localhost:4243" to your ~/.bashrc" Run "boot2docker up" to start docker vm Run "boot2docker" to see all commands Read boot2docker docs at https://github.com/boot2docker/boot2docker for more information ...
Terminez votre installation en exécutant boot2docker init, afin de créer une VM sur VirtualBox
nicolas@macbook :~> boot2docker init ...
Utilisation de docker
Tout d’abord, démarrons boot2docker :
nicolas@macbook :~> boot2docker up [2014-05-05 15:53:09] Starting boot2docker-vm... [2014-05-05 15:53:29] Started.
Nous pouvons maintenant lancer une commande dans notre conteneur, par exemple un bash. J’exécute la commande docker en mode interactif (-i) en demandant un terminal tty (-t), la commande bash sera l’interpréteur demandé. Pour mon test, j’utilise un conteneur ubuntu. Si Docker n’a pas en local ce conteneur, il va alors le télécharger et l’installer automatiquement :
nicolas@macbook :~> docker run -i -t ubuntu /bin/bash root@40979a94d8d9:/# exit exit nicolas@macbook :~> ...
Ok, et si je veux un Linux avec Apache+PHP+MySQL (LAMP) en 2mn, top chrono ?
Pour vous montrer le principe de docker, prenons un cas simple : vous avez besoin d’un serveur LAMP (Linux + Apache2 + PHP5 + MySQL) correctement configuré, afin d’y installer un blog WordPress. Notez qu’il existe des conteneurs WordPress, mais pour l’instant, nous allons voir comment faire avec un conteneur prêt à l’emploi.
Je vais utiliser le conteneur créé par Tutum. En quelques mots, Tutum est une jeune startup, récemment relocalisée à New-York, qui propose de l’hébergement et du déploiement de conteneurs Docker dans le Cloud. C’est ni du PaaS, ni de l’IaaS… c’est du CaaS (Container as a Service). Stop virtualizing, start containerizing…
nicolas@macbook :~> docker run -d -p 49000:80 -p 49001:3306 tutum/lamp Unable to find image 'tutum/lamp' locally Pulling repository tutum/lamp 433d5cbf42e2: Pulling dependent layers 511136ea3c5a: Download complete ef519c9ee91a: Download complete 07302703becc: Download complete cf8dc907452c: Download complete a7cf8ae4e998: Download complete be0da5e20357: Download complete 4f96aeb75db6: Downloading [=============================> ] 54.41 MB/92.65 MB 2m9s
Le premier download est un peu long, mais ensuite, une fois que le conteneur est prêt, le démarrage est instantané.
Il est important de bien comprendre aussi la redirection des ports TCP. Par défaut, boot2docker configure automatiquement une redirection des ports 49000 à 49500 vers votre machine hôte (ici mon Mac) afin que les ports utilisées par Docker, soient accessibles sur votre hôte. Vous pouvez aussi faire un tunnel ssh, mais avec beaucoup d’images docker, cela devient trop lourd. Je préfère utiliser cette petite astuce.
Pour mon exemple, Apache écoute par défaut sur le port 80, et MySQL sur le port 3306. Oui, mais ça, c’est dans le conteneur. Il faut donc indiquer à docker que vous souhaitez faire suivre le port 80 du conteneur, vers le port 49000 de votre VM, boot2docker avec VirtualBox. Vu qu’ensuite, boot2docker a déjà configuré la redirection des ports vers votre machine hôte… vous pourrez avoir accès donc au serveur web, à partir du navigateur de votre machine hôte.
Là, vous n’avez rien compris… c’est normal.
Un beau dessin vous résume tout ceci :
Si tout se déroule correctement, vous pourrez alors lancer un navigateur et vérifier que http://localhost:49000/ sur votre Mac, et que la page de bienvenue de Tutum s’affiche.
C’est tout pour aujourd’hui. On parlera ensuite Dockerfile et industrialisation.
Références
– Les graphiques sont dessinés avec LucidChart.
– Documentation sur les redirections de Port avec boot2docker
– Docker, why should I care ?
C’est l’article qui me manquait pour raccrocher les wagons et comprendre les tenants et les aboutissants!!
Merci Nicolas!
Installer docker c’est beaucoup plus simple si on utilise un vrai OS libre :o)
$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
To verify that everything has worked as expected:
$ sudo docker run -i -t ubuntu /bin/bash
et voilà …
Mais bon je reconnais qu’il n’y a pas de quoi écrire un article de blog …
PS : désolé mais je n’ai pas pu attendre vendredi