URL: https://linuxfr.org/users/albang/journaux/migration-d-une-infra-lamp-vers-docker Title: Migration d'une infra lamp vers docker Authors: albang Date: 2015年02月17日T12:39:57+01:00 License: CC By-SA Tags: docker, lamp et consul Score: 43 ## Intro Lecteur de linuxfr depuis un bon bout de temps, voici ma première contribution. Dans cet article, je vous montrerai comment j'ai migré un site web qui tournait sur un serveur dédié vers docker en isolant chaque service dans un container ## L'infra Elle est constituée d'**un serveur web** avec quelques sites web et d'**un serveur mysql**. Pour coller avec la philosophie docker, j'ai isolé chaque site web dans un container. L'idée est de facilement pouvoir migrer un site web sans impacter le reste. l'infra est constituée de : * un container **reverse-proxy Apache** qui va orienter les requêtes vers les différents sites web * un container **apache** qui va servir le WordPress * un container **data** où le contenu du WordPress sera stocké * un container **Mysql** où sera hébergée la base de données ![schema docker](https://raw.githubusercontent.com/albang/albang.github.io/master/assets/media/infradocker.png) ## Le reverse proxy Pourquoi utiliser un reverse proxy ? il est nécessaire de lier un port d'un container à un port de la machine hôte pour que le container soit joignable de l’extérieur. Si je décide de lancer deux containers de site web, seul le premier pourra être lié au port 80 (port standard pour le HTTP). Le second devra être lié à un autre port. C'est techniquement faisable mais très peu pratique. Pour remédier à cela, j'ai créé un container jouant le role de reverse-proxy. Ce container est lié au port 80 de la machine hôte et il va jouer le rôle de "passe plat". Il va rediriger les requêtes sur les container adéquat grâce au nom de serveur demandé (directive servername) dans les requêtes http. Le reverse proxy n'existait pas dans ma précédente infra car tous les sites étaient sur le même Apache. ### DockerFile ```docker FROM ubuntu:14.04 MAINTAINER Alban Garrigue RUN apt-get update RUN apt-get install -y apache2 RUN a2enmod proxy RUN a2enmod proxy_http ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ADD ./alban.garrigue.me.conf /etc/apache2/sites-available/ RUN a2ensite alban.garrigue.me.conf ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR ADD ./alban.garrigue.me.conf /etc/apache2/sites-available/ RUN a2ensite alban.garrigue.me.conf RUN a2dissite 000-default.conf ENTRYPOINT ["/usr/sbin/apache2"] CMD ["-D", "FOREGROUND"] ``` ### la conf Apache ```apache ServerName alban.garrigue.me ProxyPreserveHost On ProxyRequests off ProxyPass / http://alban.garrigue.me/ ProxyPassReverse / http://alban.garrigue.me/ ``` ## Le apache "Wordpress" ### DockerFile ```docker FROM ubuntu:14.04 MAINTAINER Alban Garrigue #RUN apt-get update RUN apt-get update && apt-get install -y apache2 php5 php5-mysql ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR ADD ./alban.garrigue.me.conf /etc/apache2/sites-available/ RUN a2ensite alban.garrigue.me.conf RUN a2dissite 000-default.conf RUN a2enmod rewrite RUN a2enmod expires RUN a2enmod headers RUN a2enmod cgi EXPOSE 80 ENTRYPOINT ["/usr/sbin/apache2"] CMD ["-D", "FOREGROUND"] ``` ### la conf apache La conf apache est assez standard ```apache DocumentRoot /var/www/alban.garrigue/ ServerName alban.garrigue.me Options FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all Options FollowSymLinks AllowOverride All ``` Ce que j'ai du changer dans les fichiers de configuration du WordPress: * L'adresse de la base de données dans le wp-config.php * changer 127.0.0.1 par dbalban (à voir dans le fig.yaml) ## Data only container Le concept de container de données est relativement simple. On ajoute des données à l'image, puis on les expose avec un volume. L'avantage de ce type de container est qu'ils n'ont pas besoin de tourner pour que les autres aient accès à leur données. Cependant il ne bénéficie pas du système de fichier unionfs et les données ne sont pas incluses dans la sauvegarde du container. Pour sauvegarder ces données: ```bash sudo docker run -rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data ``` Pour restaurer les données: ```bash sudo docker run -rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar ``` source: [Stackoverflow](http://stackoverflow.com/questions/21597463/how-to-port-data-only-volumes-from-one-host-to-another) Vous voyez ci dessous qu'il n'y a rien de compliqué. ### DockerFile ```docker FROM stackbrew/busybox:latest MAINTAINER Tom Offermann # Create data directory #RUN mkdir /var/www/ ADD alban.garrigue /var/www/alban.garrigue # Create /data volume VOLUME /var/www/ ``` ## Mysql Je me suis basé sur ce dépôt [github](https://github.com/tutumcloud/tutum-docker-mysql.git) Ce que j'ai modifié dans le DockerFile: * Ajout dump sql pour charger la base * Ajout du login/mot de passe du compte wordpress en variables d'environnement * Ajout du path de mon dump sql pour l'import ### DockerFile ```docker ADD wordpress-alban.sql /tmp/wordpress-alban.sql # Exposed ENV ENV MYSQL_USER ENV MYSQL_PASS ENV STARTUP_SQL /tmp/wordpress-alban.sql ``` ## Fig [Fig.sh](http://www.fig.sh/) permet d'orchestrer le lancement des containers et de les lier entre eux il va résoudre les liens de dépendances pour trouver le bon ordonnancement. Les links vont servir de liens entre les containers en utilisant les fichiers /etc/hosts. Ainsi il faut faire abstraction des adresses IP et raisonner en nom de container. Le fichier fig.yaml permet de lancer clairement des containers avec des options spécifiques. Personnellement je trouve ça plus clair qu'une ligne de commande à rallonge. ### fig.yaml ```yaml reverse: image: reverse-proxy ports: - "80:80" links: - webalban:alban.garrigue.me webalban: image: alban-garrigue-apache volumes_from: - webalbanstockage links: - dbalban dbalban: image: alban-garrigue-mysql webalbanstockage: image: alban-garrigue-data ``` Résumé : Ça serait vous mentir si je vous dis que tout cela est tombé sous le sens du premier coup. J'ai eu du mal à comprendre la persistance des données, les concepts d'images et de containers. Les containers sont le résultat de l'instanciation d'une image. Les données à l’intérieur sont aussi pérennes que le container. Le container est arrêtable et redémarrable, si votre docker plante tout n'est pas perdu. Cependant si vous ré-instanciez l'image, vous ne bénéficierez pas des données du conteneur précédent. Les topics de stack overflow sont une source d'information précieuse. Tout ce petit monde avance très vite et de nombreux outils se développent. Je vais prochainement tester : weave qui permet de gérer la partie réseau inter container et multi host (intéressant) consul qui fait de la découverte de service

AltStyle によって変換されたページ (->オリジナル) /