PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Wooster by CheckmyWebsite : Packer, Vagrant, VirtualBox : Trio gagnant pour le développement

mardi 3 juin 2014 à 10:00

S’il y a bien un défi quotidien auquel doit faire face tout développeur, designer web, c’est son environnement de développement. Comment retrouver un environnement consistant, que vous travailliez sur Windows, OSX ou Linux ? Et quand les équipes de développement s’aggrandissent, comment être certain que tous les développeurs travaillent sur un environnement identique ?

Je vais donc vous présenter un workflow composé d’outils Open Source vous permettant de construire automatiquement et de façon reproductible un environnement de développement consistant pour l’ensemble de vos développeurs.

Je précise que je découvre ces outils et qu’il y a sûrement moyen de faire mieux que ce qui suit. Il faut donc considérer ceci comme une base à améliorer. Les configurations étant partagées sur Github, vous pouvez participer.

Je vais illustrer le propos en prenant l’exemple d’un blog Wordpress.

Les logiciels nécessaires

Au rayon des logiciels nécessaires, vous allez devoir mettre la main sur :

  • VirtualBox est un système de virtualisation tombé dans l’escarcelle de Oracle et qui permet de virtualiser à peu près n’importe quel type de système d’exploitation. C’est le VMware du desktop !
  • Packer est un logiciel pour créer des images machines identiques pour différentes plate-formes à partir d’un unique fichier de configuration. Il a été créé par la même personne à qui nous devons Vagrant.
  • Vagrant permet de créer et de configurer des environnements de développement légers, portables et reproductibles.

La nature étant bien faite, ces trois logiciels fonctionnent sur les tous les OS majeurs, ce qui fait que quelque chose de commencé sur Windows pourra être continué sur Linux ou OSX. De plus, l’installation est sans souci. N’oubliez pas l’indispensable Git pour versionner votre code, mais cela va de soi !

Préparer un système type avec Packer

Wordpress fonctionne plutôt nativement sur Linux même si c’est possible de faire autrement en utilisant tout un tas d’artifice. Nous allons donc préparer une machine contenant un système Ubuntu 14.04 64 bits fraîchement installé.

C’est Packer qui va nous assurer :

  1. L’installation automatique de Ubuntu à partir de l’ISO officielle. Ce type d’installation porte le doux nom de « unattended installation ».
  2. L’adapation de cette installation à nos exigences personnelles ou à des contraintes d’entreprise.
  3. La préparation d’une « box » au format Vagrant qui nous servira de base pour constituer notre machine virtuelle Wordpress.

Vous pouvez suivre la doc d’installation Packer sur linux si vous le souhaitez. Cette partie est optionnelle, vous pouvez utiliser des systèmes types prêts à l’emploi sur Vagrant Cloud comme nous le verrons plus bas.

Configuration de la construction de la machine

Voici le fichier trusty64.json qui doit se trouver à la racine du dossier qui va servir pour le « build », la construction de notre machine virtuelle Ubuntu.

{
  "variables": {
  },
  "builders": [{
    "type": "virtualbox-iso",
    "name": "trusty64",
    "guest_os_type": "Ubuntu_64",
    "iso_url": "http://releases.ubuntu.com/trusty/ubuntu-14.04-server-amd64.iso",
    "iso_checksum": "01545fa976c8367b4f0d59169ac4866c",
    "iso_checksum_type": "md5",
    "guest_os_type": "Ubuntu_64",
    "http_directory": "http",
    "disk_size": "20000",
    "hard_drive_interface": "sata",
    "ssh_username": "vagrant",
    "ssh_password": "vagrant",
    "ssh_wait_timeout": "1200s",
    "shutdown_command": "echo 'vagrant' | sudo -S shutdown -P now",
    "boot_command": [
        "",
        "/install/vmlinuz noapic ",
        "preseed/url=http://:/preseed.cfg ",
        "debian-installer=en_US auto locale=en_US kbd-chooser/method=USA ",
        "hostname= ",
        "fb=false debconf/frontend=noninteractive ",
        "keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA ",
        "keyboard-configuration/variant=USA console-setup/ask_detect=false ",
        "netcfg/choose_interface=auto ",
        "initrd=/install/initrd.gz -- "
    ],
    "vboxmanage": [
        ["modifyvm", "", "--memory", "512"],
        ["modifyvm", "", "--cpus", "1"],
        ["modifyvm", "", "--natpf1", "ssh,tcp,127.0.0.1,2222,,22"],
        ["modifyvm", "", "--macaddress2", "auto"],
        ["modifyvm", "", "--nic2", "hostonly"],
        ["modifyvm", "", "--hostonlyadapter2", "vboxnet2"]

    ]
  }],
    "provisioners": [{
    "type": "shell",
    "execute_command": "echo 'vagrant' |  sudo -E -S sh ''",
    "script": "./post-install.sh"
  }],
  "post-processors": [{
    "type": "vagrant",
    "compression_level": "4",
    "keep_input_artifact": true
  }]
}

Il est découpé en 4 grandes parties :

  • variables permet comme son nom l’indique d’assigner des variables qui seront ensuite utilisées pendant le build. Non utilisé dans notre exemple.
  • builders permet de préciser le type de machines qui va être construite. Dasn cet exemple, nous construisons une machine virtualbox-iso portant le nom de trusty64.
  • provisioners permet de préciser comment la machine va être provisionnée. Dans le contexte qui nous intéresse, le provisionnement permet d’adapter l’installation standard de Ubuntu à nos goûts et couleurs. C’est un script externe appelé post-install.sh qui va être utilisé.
  • post-processors permet de préciser des traitements à effectuer sur la machine virtuelle construite. Dans cet exemple, packer va construire une machine virtuelle VirtualBox et ensuite, construire à partir de celle-ci une image de base pour Vagrant.

Packer va donc démarrer une machine virtuelle dans VirtualBox, installer l’OS depuis l’ISO, rebooter la machine et procéder au provisionnement de celle-ci via le script post-install.sh.

Construction du socle de base

Une fois ce fichier en place, la magie opère :

packer validate trusty64.json

permet comme son nom l’indique de valider la syntaxe du fichier de configuration de la machine à construire.

Enfin un

packer build trusty64.json

vous fait tout le boulot d’une installation Ubuntu depuis l’ISO en automatique. Il n’y a qu’à s’assoir et regarder le job se faire. Et ça, c’est bien ! Il n’y a plus acune raison de préparer une machine virtuelle à la main avec ceci.

Vous obtenez alors au bout de 5, 10mn un dossier output-trusty64 dans votre répertoire de départ contenant un fichier packer-trusty64.ovf et le disque dur associé packer-trusty64-disk1.vmdk. Vous pouvez importer cette machine dans VirtualBox tel que si vous le souhaitez.

Néanmoins, notre post-processor nous a également générer un fichier packer_trusty64_virtualbox.box qui peut servir d’image de base à Vagrant. Et il serait dommage de se priver de la puissance de celui-ci pour gérer notre environnement au quotidien.

Installer et gérer Wordpress avec Vagrant

Vagrant va utiliser cette base générée par Packer et la compléter pour arriver à une machine virtuelle Wordpress qui n’attend plus que vos renseignements personnels pour commencer à être utilisée.

Vagrant va assurer :

  1. Le démarrage d’une machine virtuelle VirtualBox correctement configurée avec les VBox Additions à partir d’une image générée par Packer ou directement depuis les dépôts publics.
  2. Le provisionnement de cette machine virtuelle avec une installation prête à l’emploi de Wordpress.

Vagrant va aussi permettre de gérer la vie de cette machine virtuelle de façon simple comme nous allons le voir.

Configuration de Vagrant à partir de votre image Packer

Il faut commencer par créer un squelette de fichier de configuration en indiquant à Vagrant à partir de quelle image initialiser celui-ci.

vagrant init packer_trusty64_virtualbox.box

Vous avez alors un fichier Vagrantfile à la racine de votre dossier de départ comme dans le dossier du projet sur Github.

J’ai modifié ce fichier afin d’obtenir au final ce qui suit, débarassé des lignes commentées.

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "./packer_trusty64_virtualbox.box"
  config.vm.hostname = "cmws-wordpress"
  config.vm.network "private_network", ip: "192.168.56.100"
  config.vm.provision :file do |file|
    file.source      = './files'
    file.destination = '/home/vagrant/'
  end
  config.vm.provision "shell", path: "post-install.sh"
end

La syntaxe est celle de Ruby puisque Vagrant est construit en Ruby. Peu de choses en fait dans ce fichier.

  • config.vm.box indique l’image de base à utiliser pour construire une nouvelle machine virtuelle.
  • config.vm.hostname indique le nom de cette machine.
  • config.vm.network permet de préciser les réglages réseaux souhaité pour la machine. Dans cet exemple, nous démarrons un réseau privé hôte avec une assignation d’IP fixe à 192.168.56.100.

Deux lignes un peu plus particulières permettent de préciser comment va être fait le provisionnement de la machine. Dans un premier temps, le dossier files présent à la racine du dossier projet va être transféré vers la machine virtuelle et ensuite le script post-install.sh sera exécuté dans la machine. C’est finalement la même logique que Packer exprimé différemment.

Le dossier files contient les fichiers de configuration pour Nginx et Wordpress et le script post-install.sh se charge de faire une installation basique de Wordpress.

Configuration de Vagrant à partir d’une image publique

Si vous ne souhaitez pas construire le socle de base avec Packer, vous pouvez pointer le paramètre config.vm.box vers une des nombreuses machines mises à disposition sur le dépôt publique Vagrant comme l’exemple ci-dessous.

config.vm.box = "ubuntu/trusty64"

Vous allez alors utiliser l’image officielle Ubuntu Trusty64 du dépôt publique Vagrant. Le reste du fichier Vagrantfile ne change pas.

Gestion du cycle de vie de la machine

Le fichier Vagrantfile d’applomb, ne reste plus qu’à démarrer la machine virtuelle avec

vagrant up

Cett simple commande va :

  1. Aller chercher une image de base pour préparer une nouvelle machine.
  2. Mettre en place la configuration réseau pour la machine
  3. Installer les VirtualBox Additions
  4. Provisionner la machine
  5. Démarrer la machine en mode headless par défaut.

Il suffit ensuite de faire

vagrant ssh

pour se connecter en SSH sur la machine.

Pour vérifier que l’installation et le provisionnement se sont bien passés, rendez-vous sur http://192.168.56.100.

Wordpress prêt à être utilisé
Wordpress prêt à être utilisé

Vous n’avez plus qu’à renseigner l’installation de Wordpress pour commencer à bloguer. Elle est pas belle la vie ?

Pour stopper une machine virtuelle, un simple

vagrant halt

peut suffire et enfin un

vagrant destroy

vous permet de supprimer complètement la machine virtuelle après usage.

Conclusion

Si vous en avez marre de toujours construire des machines virtuelles « from scratch » pour chacun de vos projets; alors Packer, Vagrant sont faits pour vous.

D’autant que Vagrant peut se marier avec Docker, Puppet, Chef, Salt, CFEngine ou Ansible pour le provisionnement. Bref, tout ce qui existe en matière de provisionnement Open Source !

Enfin, rien n’empêche d’embarquer dans cette machine le workflow Yeoman déjà vu sur Wooster pour toujours plus de puissance et performance.

Je pense améliorer la machine virtuelle Wordpress en ce sens et proposer dans le cadre de la reprise d’un ancien projet des machines prêtes à l’emploi pour les principaux CMS du marché (Joomla, Drupal, Prestashop, Magento…). N’hésitez pas à me rejoindre si le cœur vous en dit !

Vous n’avez pas fini d’entendre parler de ces technos sur Wooster !

Gravatar de Wooster by CheckmyWebsite
Original post of Wooster by CheckmyWebsite.Votez pour ce billet sur Planet Libre.

lmns972 : MediaCenter OpenElec en moins de 5 minutes

lundi 2 juin 2014 à 23:10

MediaCenter OpenElec en moins de 5 minutes

Depuis pas mal de temps j’entends parler de raspberryPi mais j’en avais pas donc impossible de tester sans matos .

Depuis peu je m’intéresse à tout ce qui concerne la domotique ipx800 , le rapsberryPi et depuis peu j’apprends la connaissance de BananaPi (merci fwix)  .

Et je reçois quoi ?

commande

Je vous rassure ce n’est pas un cadeau le matos a été commandé sur kubii.fr (pas kyubi de Naruto)

Pré-requis :

Après avoir monté l’ensemble très rapide pas besoins d’un schéma je présume :) .

Récupérer la dernière version de OpenElec

Faire un extract de l’archive

tar xvf OpenELEC-RPi.arm-4.0.x.tar

Se rendre dans le répertoire OpenElec , il suffit d’éxécuter par la suite

./create_sdcard /dev/sdX

sdX correspond à votre carte SD attention à bien choisir la bonne carte .

Brancher l’alimentation de votre PI , xmbc démarre tout seul votre MediaCenter est près .

Pour les amoureux de la ligne de commande il vous suffit juste d’activer le SSH .

Le petit moins ma télécommande ne fonctionne pas car mon téléviseur ne semble pas gérer le HDMI CEC :( .

Cependant il y a une alternative avec Yatse que je n’ai pas encore testé .

SOURCE :

http://wiki.openelec.tv/index.php/Installing_OpenELEC_on_Raspberry_Pi

Like this post? Tip me with bitcoin!

1KFPTQQhr1qUGHXCA8YYigYXEWrsiAvty4

If you enjoyed reading this post, please consider tipping me using Bitcoin. Each post gets its own unique Bitcoin address so by tipping you're not only making my continued efforts possible but telling me what you liked.

Powered by Bitcoin Tips

Cet article MediaCenter OpenElec en moins de 5 minutes est apparu en premier sur Guest Blog.

Gravatar de lmns972
Original post of lmns972.Votez pour ce billet sur Planet Libre.

alterlibriste : Est-ce être extrémiste si l'on n'aime pas les DRM ?

lundi 2 juin 2014 à 21:32

En ce moment, les billets fusent à propos des DRM dans Firefox et l’idée "d’être ou ne pas être (extrémiste), telle est la question", ou encore soyons barbus et fiers de l’être (si vous sortez de coma, allez faire un tour entre-autres sur les blogs de Cyrille, Fred, Damien et antistress).
Regarder passer les balles en comptant les points est d’actualité en cette période de Roland Garros mais comme ça fait quelques années que je ne suis plus cet événement, je vais tenter une petite balle aussi (à défaut de balles neuves ou d’ace, j’espère quand même éviter le filet, encore qu’on est sur le net).

Concernant Firefox, tous les camps ont des points gagnants et, je ne sais plus où, j’ai entendu que de toutes façons, Mozilla est perdant qu’il choisisse ou pas d’implémenter les DRM.
J’ai trouvé le billet de Cyrille très pertinent et j’irai même plus loin.

Mozilla invoque le fait que s’ils ne suivent pas le mouvement, ils seront laissés de côté par les utilisateurs. Mais en fait, ils n’ont aucune marge de manœuvre, ils doivent garder à tout prix des utilisateurs pour justifier l’aumône accordée par Google qui leur a permis de se développer mais qui est leur seul moyen de subsister. Ils ne nous ont pas encore fait de chantage à l’emploi mais ça viendra peut-être. Difficile de dépendre d’un acteur tout puissant à qui il ne faut pas déplaire (d’autant qu’il n’a plus besoin de vous pour asseoir cette toute puissance). Mais c’était aussi un merveilleux moyen d’avoir des fonds sans dépendre de la générosité des utilisateurs. Bref, le business model de Mozilla n’est pas le sujet mais il risque de l’être dans un avenir plus ou moins éloigné (espérons que FirefoxOS permette un autre essor).

Sur l’aspect, soyons libristes mais pas trop quand même, je n’ai pas l’impression qu’être extrémiste puisse nuire à quelqu’un ; RMS n’a jamais nuit aux logiciels libres et c’est en partie grâce à lui si on a aujourd’hui la possibilité d’avoir des machines qui tournent sans logiciels propriétaires. Des moins acharnés que lui ont aussi permis d’intégrer des bouts de propriétaire afin de pallier aux manques ou baisses de performances (uniquement dû au fait que le matériel ou certaines technologies sont totalement fermés). De ce fait, libre à chacun soit d’avoir une machine entièrement libre (faut quand même bien choisir son matos) mais qui ne pourra pas forcément accéder à tous les contenus et avoir des performances optimales, soit de ménager la chèvre et le chou en intégrant le minimum vital tant qu’il n’y a pas d’alternative libre (personnellement, ce sont les drivers d’imprimante et flash pour pouvoir accéder correctement aux contenus multimédia). Libre aussi si je le souhaite de ne pas lésiner sur les programmes proprio si je trouve que GNU/Linux est plus polyvalent, moins troué, moins cher, plus paramétrable, plus performant, etc. que Windows et que je veux tuer des gros méchants sur Steam avec ma carte graphique nVidia et ses drivers proprio.

Maintenant, est-ce être extrémiste de blâmer Mozilla d’intégrer les DRM ?
Certains bottent en touche en disant que de toutes façons le ver était dans la pomme à partir du moment où le W3C avait donné son accord, certes.
Personnellement, je pense qu’effectivement, ils ne peuvent faire autrement mais que cela donnera lieu à une sévère désapprobation des fidèles les plus engagés (d’où forks probables).

Alors que devrait faire Mozilla ?
C’est pourtant simple : proposer une version de base sans support de DRM et un add-on permettant de les lire.
Comme ça tout le monde est content et ceux qui ont besoin des DRM pour regarder des trucs menottés (Game of Thrones semble être l’alibi ultime) pourront installer l’add-on comme moi j’installe Flash en attendant que l’HTML5 ou Gnash permettent réellement de m’en passer.
C’est un pis-aller mais cela n’empêche pas ceux qui n’en veulent pas d’avoir un système sans verrue ni ceux qui veulent en profiter de pouvoir l’utiliser (et même de changer d’avis régulièrement).
Car une implémentation d’office est une porte ouverte à d’autres blobs, que cela va occasionner une perte d’utilisateurs non négligeable (soit pour utiliser un truc vraiment libre, soit parce que tant qu’à faire autant utiliser Chrom*) et que plus jamais Mozilla ne pourra nous dire que la protection de notre vie privée est une priorité car le machin implémenté sera potentiellement probablement ouvert à la NSA (Adobe est une société américaine).

Si vous êtes d’accord avec moi, peut-être qu’il faudra convaincre Tristan de ce genre de possibilité...

Gravatar de alterlibriste
Original post of alterlibriste.Votez pour ce billet sur Planet Libre.

Quack1 : #SSTIC 2014 : Le retour

lundi 2 juin 2014 à 21:00

 

Comme l'année dernière, je serais présent les trois prochains jours au #SSTIC (Symposium sur le Sécurité des Technologies de l'Information et de la Communication) à Rennes !

J'essaierais de live-tweeter au maximum et de publier des articles récapitulatifs pour chacune des trois journées :)

Liens directs

 

Pour les lecteurs du Planet-Libre, je rappelle que cet article et les suivants qui concerneront le SSTIC ne sont pas vraiment dans l'optique du libre, mais je pense qu'ils peuvent être intéressants pour avoir accès à un retour sur ce genre de manifestation.

Gravatar de Quack1
Original post of Quack1.Votez pour ce billet sur Planet Libre.

Articles similaires

Nicolargo : Virtualisation légère avec Docker

lundi 2 juin 2014 à 16:34

Dans le petit monde des DevOps, la solution de virtualisation Docker a le vent en poupe. Nous allons dans ce billet essayer de décrypter ce qui ce cache derrière ce nouvel outil et proposer un tutoriel sur l'installation et les premiers pas pour une utilisation souple et efficace.Sélection_178

C'est quoi donc ?

Docker est un logiciel open-source (sous licence Apache 2.0) et un service en ligne optionnel (Docker.io) permettant de gérer des conteneurs ("dockers").

Contrairement aux machines virtuelles classiques qui comprennent un système hôte ("guest OS") et les librairies/applications, les conteneurs ne contiennent, au maximum, que les applications/librairies.

 Sélection_179

Quand je dis au maximum c'est qu'une copie d'un conteneur qui ne change que la partie application ne contiendra que les différences par rapport au conteneur initial.

Sélection_181

Le système hôte est ainsi géré directement par le Docker Engine (en vert dans le premier schéma). On a ainsi une mutualisation qui permet de lancer les conteneurs de manière très rapide: le temps de lancement d'un conteneur est presque le même que le temps de lancement des applications qu'il contient. En effet, le système d'exploitation est déjà lancé. Donc pas de phase de démarrage ni d'initialisation de cette couche. Il faut quand même avoir à l'esprit que même si l'on est pas dans une machine virtuelle, on dispose tout de même d'un environnement isolé (processus, système de fichier, ports réseau). L'utilisateur n'a qu'à se préoccuper que de ce qu'il veut virtualiser (les applications/services) et ne s'occupe pas du reste.

L'autre gros avantage de cette technologie est la portabilité. En effet, il est tout à fait possible de concevoir un conteneur sur son PC portable puis ensuite de le déployer sur son infrastructure de production physique ou virtuelle. La taille des conteneurs étant relativement réduite, on peut donc imaginer un workflow de déploiement basée sur un repo central (type Git) et des Docker Engine installés sur les machines qui font elle même tourner des conteneurs. Il n'y a pas vraiment de limite au nombre de conteneurs qu'une machine puisse faire tourner. La limite vient de l'occupation mémoire/CPU/réseau de vos applications.

Si vous avez encore des questions sur la différence entre Docker et VM, je vous conseille la lecture de cette question sur StackOverflow: "How is Docker.io different from a normal virtual-machine ?".

Installation de Docker

Note (merci à @jb_barth pour le commentaire): jusqu'à la version 0.9, Docker se basait sur la technologie LXC ("Linux Containers") du noyau Linux et ne fonctionnait donc que sur des distributions GNU/Linux avec un noyau >= 2.6.24. La dépendance stricte à LXC a sauté depuis la v0.9.0, le driver par défaut est maintenant libcontainer, une lib pur go produite par le projet pour accéder de façon propre aux APIs dispos dans le kernel. C'est ce qui a permis de supporter des noyaux aussi vieux d'ailleurs, au début c'était >= 3.8

Voici les étapes à suivre pour installer Docker sur une distribution Ubuntu 14.04 LTS. A noter, pour les miséreux développeurs sous Windows ou Mac OS, il est est toujours possible de faire tourner une VM Ubuntu (par exemple avec VirtualBox) et de suivre cette installation.

Docker est directement disponible dans les repositories d'Ubuntu, donc un simple

sudo apt-get install docker.io

suffit pour effectuer l'installation complète de Docker sur notre machine comprenant:

Comme les conteneurs vont utiliser les serveurs DNS de la machine hôte, il est nécessaire de configurer les adresses des serveurs DNS dans le fichier /etc/default/docker.io (par exemple avec les serveurs OpenDNS):

$ vi /etc/default/docker.io
# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="-dns 208.67.220.220 -dns 208.67.220.222"

Pour que la configuration soit prise en compte, il faut relancer le service Docker avec la commande:

sudo service docker.io restart

Un petit ps permet de voir que le service est bien lancé:

0.0   0.1  563M 9.65M   733 root         0 S  0:00.46     0     0 /usr/bin/docker.io -d -dns 208.67.220.220 -dns 208.67.220.222

Récupération des images système

Nous allons commencer par récupérer des images qui vont servir de de bases à notre conteneur. Une liste assez conséquente d'images sont disponibles sur le site officiel du projet. Vous pouvez ainsi récupérer celle qui est le plus proche de l'environnement que vous recherché. Un moteur de recherche est disponible à l'adresse https://index.docker.io/ pour trouver des images conçues par les développeurs du projet et par des contributeurs.

On retrouve ainsi des distributions GNU/Linux minimales comme Ubuntu, CentOS, BusyBox pour ne siter que les images officiellement supportées par le projet Docker.io (il existe également des repos non officiels avec Fedora, RH, Arch...).

Petit mention spéciale pour les images BusyBox qui sont vraiment très légère (moins de 10 Mo) pour un système fonctionnel !

Même si il est possible de directement télécharger l'image au lancement du conteneur, je préfère avoir sur ma machine les images des différentes versions de l'OS que j'utilise le plus: Ubuntu.

Pour récupérer l'ensemble des images du repo Ubuntu qui contient les versio  minimale d'Ubuntu de la version 10.04 à 14.04), il faut saisir la commande suivante:

$ sudo docker.io pull ubuntu
74fe38d11401: Pulling dependent layers
316b678ddf48: Pulling dependent layers
3db9c44f4520: Pulling dependent layers
5e019ab7bf6d: Pulling dependent layers
99ec81b80c55: Pulling dependent layers
a7cf8ae4e998: Pulling dependent layers
511136ea3c5a: Download complete
e2aa6665d371: Downloading [==>                                                ] 2.027 MB/40.16 MB 6m14s

Note: le téléchargement initial des images peut prendre un peu de temps selon la vitesse de votre liaison Internet.

Il est également possible de faire de même avec les autres distributions citées ci-dessus:

$ sudo docker.io pull centos
$ sudo docker.io pull busybox

Une fois le téléchargement terminé, on peut demandé à Docker un status de son état actuel:

$ sudo docker.io info
Containers: 64
Images: 46
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 174
Execution Driver: native-0.1
Kernel Version: 3.13.0-24-generic
WARNING: No swap limit support

ainsi que la liste des images disponibles:

$ sudo docker.io images
REPOSITORY          TAG                   IMAGE ID            CREATED             VIRTUAL SIZE
busybox             buildroot-2013.08.1   352f47ad2ecf        17 hours ago        2.489 MB
busybox             ubuntu-14.04          6a95c08a9391        17 hours ago        5.609 MB
busybox             ubuntu-12.04          1720a1681f1c        17 hours ago        5.455 MB
busybox             buildroot-2014.02     f66342b343ae        17 hours ago        2.433 MB
busybox             latest                f66342b343ae        17 hours ago        2.433 MB
ubuntu              glances_develop       a483f92d9ab3        24 hours ago        556.8 MB
ubuntu              14.04_nicolargo       8574cc29575e        28 hours ago        440.8 MB
ubuntu              13.10                 5e019ab7bf6d        4 weeks ago         180 MB
ubuntu              saucy                 5e019ab7bf6d        4 weeks ago         180 MB
ubuntu              12.04                 74fe38d11401        4 weeks ago         209.6 MB
ubuntu              precise               74fe38d11401        4 weeks ago         209.6 MB
ubuntu              12.10                 a7cf8ae4e998        4 weeks ago         171.3 MB
ubuntu              quantal               a7cf8ae4e998        4 weeks ago         171.3 MB
ubuntu              14.04                 99ec81b80c55        4 weeks ago         266 MB
ubuntu              latest                99ec81b80c55        4 weeks ago         266 MB
ubuntu              trusty                99ec81b80c55        4 weeks ago         266 MB
ubuntu              13.04                 316b678ddf48        4 weeks ago         169.4 MB
ubuntu              raring                316b678ddf48        4 weeks ago         169.4 MB
ubuntu              lucid                 3db9c44f4520        5 weeks ago         183 MB
ubuntu              10.04                 3db9c44f4520        5 weeks ago         183 MB
centos              centos6               0b443ba03958        6 weeks ago         297.6 MB
centos              6.4                   539c0211cd76        14 months ago       300.6 MB
centos              latest                539c0211cd76        14 months ago       300.6 MB

Comme alternative du moteur de recherche https://index.docker.io/, il est bien sûr possible d'utiliser la ligne de commande. Par exemple pour trouver toutes les images Ubuntu disponibles sur le repo central:

sudo docker.io search ubuntu | less

A noter qu'il est tout à fait possible, si vous ne trouvez pas votre bonheur de concevoir "from scratch" votre propre image système en suivant cette documentation sur le site officiel (la procédure se base sur DebootStrap).

Création de son premier conteneur

Bon assez de préliminaires, nous allons maintenant pourvoir créer notre premier conteneur qui va se limiter à exécuter la commande 'ls' (si c'est pas du conteneur de compétition):

$ sudo docker.io run ubuntu:latest /bin/ls -alF
total 8280
drwxr-xr-x  46 root root    4096 May 28 06:50 ./
drwxr-xr-x  46 root root    4096 May 28 06:50 ../
-rw-r--r--   1 root root     102 May 28 06:50 .dockerenv
-rwx------   1 root root 8394118 May 27 15:37 .dockerinit*
drwxr-xr-x   2 root root    4096 Apr 16 20:36 bin/
drwxr-xr-x   2 root root    4096 Apr 10 22:12 boot/
drwxr-xr-x   4 root root    4096 May 28 06:50 dev/
drwxr-xr-x  64 root root    4096 May 28 06:50 etc/
drwxr-xr-x   2 root root    4096 Apr 10 22:12 home/
drwxr-xr-x  12 root root    4096 Apr 16 20:36 lib/
drwxr-xr-x   2 root root    4096 Apr 16 20:35 lib64/
drwxr-xr-x   2 root root    4096 Apr 16 20:35 media/
drwxr-xr-x   2 root root    4096 Apr 10 22:12 mnt/
drwxr-xr-x   2 root root    4096 Apr 16 20:35 opt/
dr-xr-xr-x 236 root root       0 May 28 06:50 proc/
drwx------   2 root root    4096 Apr 16 20:36 root/
drwxr-xr-x   7 root root    4096 Apr 16 20:36 run/
drwxr-xr-x   2 root root    4096 Apr 24 16:17 sbin/
drwxr-xr-x   2 root root    4096 Apr 16 20:35 srv/
dr-xr-xr-x  13 root root       0 May 28 06:50 sys/
drwxrwxrwt   2 root root    4096 Apr 24 16:17 tmp/
drwxr-xr-x  11 root root    4096 Apr 16 20:35 usr/
drwxr-xr-x  14 root root    4096 Apr 16 20:36 var/

Arrêtons-nous un peu sur la commande: sudo docker.io run ubuntu:latest /bin/ls -alF

On demande donc le lancement (run) d'un conteneur basée sur la dernière version d'Ubuntu (ubuntu:latest qui est un lien vers l'image minimale de la version 14.04) qui va exécuter la commande ls (/bin/ls -alF). Comme vous pouvez le voir dans le résultat de la commande, on est dans un environnement isolé avec son propre système de fichier.

Première constatation, la vitesse d’exécution de notre environnement virtuel est vraiment impressionnante. Sur une petit commande,on peut voir que l'overhead de lancement du conteneur est négligeable:

$ time sudo docker.io run ubuntu:latest ls -alF /
...
real	0m0.331s
user	0m0.014s
sys	0m0.012s
$ time ls -alF /
...
real	0m0.007s
user	0m0.003s
sys	0m0.004s

Puis un conteneur persistant

Passons maintenant à la création d'un conteneur persistant, c'est à dire un conteneur  qui va faire tourner une tache pendant un temps indéterminé (je prends par exemple un pin infini vers le site Google).

$ sudo docker.io run -d ubuntu:latest ping www.google.fr
7404bfa4beca4ba97459c96f8d93242c4fba6ecf2c5b11d18c09acd2fce9991e

Noter le -d dans la ligne de commande pour détacher le conteneur et ainsi lui permettre de tourner en tache de fond.

En retour on obtient le numéro d'identifiant unique du conteneur qui va nous permettre de le contrôler.

On commence donc par vérifier qu'il tourne bien:

$ sudo docker.io ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
7404bfa4beca        ubuntu:14.04        ping www.google.fr   3 minutes ago       Up 3 minutes                            mad_lumiere

On peut ainsi, l'arrêter:

sudo docker.io stop 7404bfa4beca

Le démarrer:

sudo docker.io start 7404bfa4beca

Le redémarrer (l'équivalent d'un stop/start):

sudo docker.io restart 7404bfa4beca

Lui envoyer des signaux:

sudo docker.io kill 7404bfa4beca

Ensute on supprime le conteneur avec la séquence stop/rm:

sudo docker.io stop 7404bfa4beca
sudo docker.io rm 7404bfa4beca

Un Shell dans un conteneur

Pour accéder à un shell dans le conteneur, il faut utiliser les options suivantes dans la ligne de commande:

$ sudo docker.io run -i -t ubuntu:latest bash
root@bb89ed6cdd3c:/#

Structurer la création des conteneurs avec les Dockerfiles

Les Dockerfiles sont des fichiers textes décrivant les différentes étapes pour la création d'un conteneur. Idéalement, ce sont ces fichiers que vous aller gérer en configuration et que vous aller partager avec les différentes personnes utilisatrices de votre projet. Pour illustrer mes dires, je vais prendre l'exemple d'un dockerfile qui va permettre aux contributeurs du projet Glances de tester simplement la branche de développement du logiciel.

En gros, le dockfile doit:

  1. utiliser un OS de base (Ubuntu 14.04 LTS)
  2. installer les pré-requis système
  3. télécharger la dernière version de Glances sous Github

Le dockfile glances_develop_install correspondant est alors le suivant:

# Install Glances Development branch
#
# $ sudo docker.io build -t ubuntu:glances_develop - < glances_develop_install
#
# VERSION 1.0
# Use the ubuntu base image provided by dotCloud
FROM ubuntu
MAINTAINER Nicolargo, nicolas@nicolargo.com
# Make sure the package repository is up to date
RUN apt-get -y update
# Install prerequirement
RUN apt-get install -y python-dev python-pip git lm-sensors
RUN pip install psutil bottle batinfo https://bitbucket.org/gleb_zhulik/py3sensors/get/tip.tar.gz
# Patch for current Docker version
RUN ln -s /proc/mounts /etc/mtab
# Install Glances from the Pipy repository
RUN git clone -b develop https://github.com/nicolargo/glances.git

Voyons un peu en détail le contenu du fichier.  On commence donc par définir l'OS de base:

FROM ubuntu

On peut bien sûr utiliser l'image/tag que l'on souhaite.

Ensuite on passe aux commandes que l'on souhaite exécuter:

RUN apt-get -y update

RUN apt-get install -y python-dev python-pip git lm-sensors

RUN pip install psutil bottle batinfo https://bitbucket.org/gleb_zhulik/py3sensors/get/tip.tar.gz

RUN ln -s /proc/mounts /etc/mtab

RUN git clone -b develop https://github.com/nicolargo/glances.git

Rien de bien compliqué, il suffit de faire précéder la commande Unix par le mot clé RUN...

Il ne reste plus qu'à lancer la construction du conteneur et son exportation vers une nouvelle image (nommé ubuntu:glances_develop) à partir de la ligne de commande:

sudo docker.io build -t ubuntu:glances_develop - < glances_develop_install

ou alors directement depuis un repos (par exemple GitHub) ou vos Dockers files sont gérés en configuration:

sudo docker.io build -t ubuntu:glances_develop https://raw.githubusercontent.com/nicolargo/dockersfiles/master/glances_develop_install

On vérifie ensuite que l'image a bien été créée:

$ sudo docker.io images | grep glances
ubuntu glances_develop a483f92d9ab3 31 hours ago 556.8 MB

Puis on lance Glances depuis ce conteneur (en le metant à jour par un pull avant le lancement):

sudo docker.io run -i -t --entrypoint /bin/bash ubuntu:glances_develop -c "cd glances ; git pull origin develop ; python -m glances"

Et hop c'est magique:

Glances in a docker

Un des trucs fun avec Docker c'est que si l'on souhaite modifier un conteneur en ajoutant par exemple l'installation d'un nouveau logiciel, il suffit de modifier le Docker file puis de refaire la commande de build. L'installation ne se fera que par delta par rapport au premier conteneur.

Controler la CPU et la mémoire de ses conteneurs

Une fonction intéressante de Docker est sa capacité de contraindre un conteneur en terme de CPU et de MEM. Par exemple on peut limiter le conteneur à 512 Mo de RAM et donner un priorité moins forte en terme de CPU à ce conteneur par rapport aux autres. Il faut cependant que le hôte qu héberge Docker soit compatible avec ces options ce qui n'est pas mon cas:

$ sudo docker.io run -m 512m -i -t --entrypoint /bin/bash ubuntu:glances_develop -c "cd glances ; git pull origin develop ; python -m glances"
WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

Pour activer ces options sous Ubuntu, il faut modifier la configuration du Kernel via GRUB. Pour cela, il est nécessaire de suivre cette procédure.

Conclusion

L'approche est vraiment différente des solutions de virtualisation classiques mais si vous cherchez un outil simple pour valider vos applications Linux dans un environnement controlé alors Docker est définitivement une solution à envisager. Sa souplesse et sa légéreté en font une solution idéale à embarquer sur son PC portable ou à mettre en production sur son infrastructure.

Je vous conseille de vous plonger dans la documentation officielle qui est vraiment complète et très bien faite.

Des expériences à nous faire partager sur l'utilisation de Docker ?

Quelques références:

Cet article Virtualisation légère avec Docker est apparu en premier sur Le blog de NicoLargo.

Gravatar de Nicolargo
Original post of Nicolargo.Votez pour ce billet sur Planet Libre.

Articles similaires