vendredi 16 octobre 2015

LES DOCKERS



Je vous propose aujourd'hui de vous pencher sur une technologie qui gagne beaucoup en ce moment : Docker
Docker est une application qui va vous permettre d'empaqueter des applications et ses dépendances dans un conteneur, que l'on pourra ensuite lancer sur n'importe quel serveur Linux.
Conteneurs
Pour comprendre l'engouement autour de docker il faut comprendre la base de cette technologie : les conteneurs.
Le problème à l'heure actuelle c'est que nos applications ont besoin de plus en plus de dépendances et en plus de ça elles ont besoin de fonctionner sur un large éventail de machines. La solution actuelle pour nous simplifier la tâche est alors d'utiliser des machines virtuelles.
Chaque machine virtuelle va inclure notre application, les librairies nécessaires et un système d'exploitation entier. Le problème de cette architecture c'est que les VM pèsent rapidement des dizaines de Go, mais en plus de ça elles utilisent beaucoup de ressources inutilement pour faire fonctionner le système d'exploitation virtuel (il est important de noter que docker ne fonctionne actuellement que sur Linux, et qu'il faut un Kernel 3.10 minimum).
Docker
Qu'est-ce que docker dans tout ça ? Docker permet de profiter de la technologie des conteneurs en profitant d'une API simple. Les commandes sont très simples à retenir et permettent de mettre en place un système de conteneur en place rapidement grâce à un hub collaboratif qui permet à tout le monde de partager des images qui pourront ensuite être utilisées comme base pour construire ces conteneurs.
Comme précisé précédemment Docker ne fonctionne pas sans le Kernel Linux donc si vous êtes sur Windows ou sur Mac vous pourrez quand même vous essayer à Docker grâce à Boot2Dockerqui fournit une petite machine virtuelle prête à l'emploi directement équipée de Docker.
Fonctionnement
Pour commencer à créer notre premier conteneur, on doit commencer par trouver une image qui va nous servir de base pour construire notre conteneur. Pour cela il faut se rendre sur le Hub Docker. Pour se faire la main et découvrir docker on va commencer par lancer un conteneur basé sur l'image Debian.
Attention, même si cette image utilise Debian, le conteneur ne contient que les fichiers de Debian (comprendre par là que vous n'aurez pas un système Debian qui va tourner dans le conteneur, mais seulement accès aux librairies et aux binaires de Debian).
Pour lancer un conteneur, il suffit de taper
docker run <IMAGE>
Si vous ne possédez pas l'image sur votre machine, elle sera automatiquement téléchargée depuis le hub. Pour l'image Debian cette commande va avoir pour effet de lancer bash et d'automatiquement stopper le conteneur après coup (les conteneurs se stoppent dès qu'ils ont exécuté leur commande). Si vous voulez voir tous les conteneurs, il faudra faire un
docker ps -a #montre tous les conteneurs
docker ps # montre tous les conteneurs en cours d'exécution
Si vous souhaitez interagir avec le résultat de la commande, il faudra rajouter les drapeaux -ti
docker run -ti <IMAGE>
Dans le cas de Debian vous vous retrouverez alors sur bash lancé depuis le conteneur. À chaque fois que vous faites un docker run un nouveau conteneur est lancé à partir de l'image que vous avez demandé. Donc aucune des modifications que vous avez faites à votre conteneur ne sera persistée. Si vous souhaitez créer une nouvelle image basée sur les modifications que vous avez faites il vous faudra alors faire un commit pour créer l'image.
docker ps -a # on récupère l'id du conteneur que l'on a modifié
docker diff <ID> # Permet d'obtenir une liste des différentes modifications effectuées   
docker commit <ID> <NOM DE L'IMAGE>
Vous pourrez ensuite utiliser cette image pour construire de nouveau conteneur, la sauvegarder pour l'envoyer ailleurs avec la commande save ou encore la publier sur le hub en utilisant la commande push.
Un cas concret
Alors lancer un conteneur Debian c'est bien sympa, mais à part l'utiliser pour construire nos images cela ne représente pas un grand intérêt. Imaginons que nous voulons installer et utiliser un conteneur pour faire fonctionner Ghost (une plateforme de blogging open source basée sur nodejs).
Je commence par chercher sur le hub pour voir si quelqu'un a déjà cherché à construire une image pour cette technologie. Un dépôt officiel semble correspondre :
docker run --rm -p 8080:2368 --name grafikart-blog-ghost ghost
  • Le drapeau --rm permet de supprimer le conteneur dès qu'il est fermé.
  • Le drapeau --name permet de donner un nom à notre conteneur pour le retrouver plus facilement par la suite
  • Le drapeau -p permet de mapper un port local sur un port du conteneur
Si je regarde maintenant l'IP de ma machine sur le port 80 je vois bel et bien mon installation de ghost qui fonctionne correctement. En revanche dès que je ferme mon conteneur mes données vont disparaître, car un nouveau run va avoir pour effet de repartir de l'image sans conserver mes éventuelles modifications. Pour remédier à ce problème il est possible de relier un dossier de la machine hôte à un dossier à l'intérieur du conteneur à l'aide du drapeau -v
docker run --rm -p 8080:2368 -v /path/to/ghost/blog:/var/lib/ghost --name grafikart-blog-ghost ghost
De cette manière les données seront stockées sur la machine qui fait fonctionner docker et elles seront ainsi persistées à chaque fois que l'on exécutera un nouveau run de notre image.
Conclusion
Voilà pour un rapide tour du propriétaire. Évidemment, il est possible de pousser le système encore plus loin pour construire une architecture encore plus poussée, mais je voulais garder cette introduction la plus courte possible . Globalement Docker est une technologie intéressante sur plusieurs aspects.
  • Docker propose une manière simple de travailler avec les conteneurs avec une API qui emprunte beaucoup aux principes instaurés par git
  • Les conteneurs vont devenir une nouvelle unité qui deviendra peut-être un nouveau standard (facilitant ainsi le déploiement d'application)
  • Les images sous forme d'oignons permettent un transfert et un déploiement rapide. On n'est pas obligé de tout télécharger en cas d'update de l'image

sources: http://www.grafikart.fr/tutoriels/docker/docker-intro-634


jeudi 29 mai 2014

Le protocole HTTP



Le protocole HTTP

HTTP  (HyperText Transfer Protocol) est un protocole de communication conçu pour formuler des demandes à un serveur web et transférer et recevoir le contenu des pages web. Il fonctionne usuellement grâce à TCP/IP, un protocole réseau de plus bas niveau. Nous sommes habitués en tant qu’internautes  lire le fameux préfixe http:// dans la barre d’adresse du navigateur, mais il est plus rare de s’intéresser à son fonctionnement. De nos jour, les questions de performance et d’optimisation à l’extrême le place sur le devant de la scène. HTTP se base essentiellement sur un dialogue texte, car à l’origine les pages web sont surtout constituées de code HTML. Il a été imaginé par tim Berners-Lee en 1991, s’est vu numéroté en version 0.9 juste après la finalisation de HTTP 1.0, puis a évolué jusqu’à HTTP 1.1

Requête et réponse

La plupart du temps, les pages web sont demandées au serveur grâce aux commandes GET et POST. Il existe bien d’autres, mais elles sont utilisées plus rarement ou pour des développements spécifiques (OPTIONS, CONNECT, HEAD, TRACE, PUT, DELETE).
Chaque requête HTTP débute par une ligne contenant une commande, suivie de l’emplacement de la ressource que le navigateur souhaite obtenir, terminé par HTTP, un slash et un numéro de version.
Cette ligne peut être suivie par une pléthore d’option facultatives, ajoutées par le navigateur, occupant chacune une ligne. Elles ne se sont pas toutes normalisées et obéisse à la syntaxe champ : valeur. On les nomme en-tête HTTP, car elles définissent les modalités d’échange qui sont masquées à l’utilisateur des données qui suivent, tant en envoi qu’en réception.
Ces méta-informations véhiculées par les en-têtes HTTP peuvent concerner :
  •   Le type MIME du document servi,
  •  Le type accepté par l’agent utilisateur,
  •  Les paramètres du cache,
  •  La chaîne d’identification du navigateur,
  •  L’adresse du référant
  •  Et bien d’autres combinaisons.
Le tout est clos par une simple ligne vide et suivi par les données envoyées au serveur dans les cas d’une requête formulée par le navigateur.

Un exemple de requête HTTP

GET /imghp?hl=fr&tab=wi HTTP/1.1
Host: images.google.fr
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9
(.NET CLR 3.5.30729) FirePHP/0.2.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

Le serveur répond de manière similaire avec en introduction le protocole, sa version et un code de retour (200 si tout s’est bien passé, et le fameux 404 si rien n’a été trouvé à l’adresse demandée). D’autres en-têtes peuvent  suivre, ainsi les données utiles délivrées par le serveur qui peuvent être de type texte (HTML, CSS, JavaScript, etc.  ) Ou du type binaire (images, vidéo, sons, etc.).

Un exemple de réponse HTTP

HTTP/1.1 200 OK
X-Powered-By: PHP/5.2.6
Set-Cookie: bbsessionhash=5dc22176091fde3ea648f61564e566dd; path=/; HttpOnly
Cache-Control: private
Pragma: private
Content-Type: text/html; charset=ISO-8859-1
Content-Encoding: gzip
Content-Length: 58840
Date: Fri, 24 Apr 2009 15:05:08 GMT
Server: Apache

Quelques en-têtes HTTP détaillés

En-tête
Usage
Date
Date et heure de formulation de la requête.
Host
Domaine interrogé (permet d’héberger plusieurs noms de domaine sur le même serveur avec la même adresse IP).
Server
Non du serveur
Content-Type
Type MIME de la ressource envoyée par le serveur
Content-Length
Longueur des données envoyées ou reçues dans la partie utile suivant les en-entêtes (en octets).
Cache-control
Encodage de caractères acceptés

Les codes de retour font partir des cinq familles se distinguant sur le chiffre des centaines :
§          1xx : Information
§          2xx : Succès
§          3xx : Redirection
§          4xx : Erreur du client http
§         5xx : Erreur du serveur

Quelques codes détaillés

Code
Signification
Explication
200
OK
Succès
301
Permanently Redirect
Ressource déplacé de façon permanente à une autre adresse
302
Found
Ressource déplacée de façon temporaire à une autre adresse
304
Not modified
Ressouce non modifiée depuis la dernière requête
403
Forbidden
Identification refusée
404
Not found
Ressource non trouvée
410
Gone
Ressource absente, sans adresse de redirection connue
500
Internal server error
Erreur interne au serveur
503
Service unavailable
Serveur temporairement indisponible

Les messages et requêtes HTTP transitant par le navigateur peuvent être analysé relativement facilement grâce aux extensions, par exemple dans l’onglet réseau de Fierbug (pour Firefox) et network des outils de développement (pour Google Chrome).
Quant à HTTPS, une déclinaison fonctionnant avec les protocoles de chiffrement SSI et TLS, on la retrouve surtout dans la conception d’espaces utilisateurs avec  identification sécurisée, et pour les procédures nécessitant de la confidentialité telles que les paiements sur les sites d’e-commerce.