Présentation des développeurs WordPress à docker
L’écran blanc de la mort? Imaginez maintenant une équipe de 20 développeurs exécutant le déploiement dans le même environnement de production. Beaucoup de temps est perdu sur les devops, pas sur le développement. Cela signifie beaucoup d’argent, parce que quelqu’un doit payer pour le temps qu’il a consacré à ces questions. Faisons un pas en arrière et examinons quelques – uns des coupables possibles de ces problèmes: – différentes versions de WordPress (et \/ ou plugins). Différentes versions de PHP – différentes versions du serveur Web (Apache \/ nginx). – Différentes versions de MySQL – systèmes d’exploitation complètement différents – toutes les configurations ci – dessus sont différentes (limites de mémoire \/ processeur, modules installés)
Qu’est – ce que docker a apporté? Une chose: la cohérence. S’assurer que l’environnement est le même partout où il fonctionne; Localement, sur 50 ordinateurs différents, dans un environnement ci (intégration continue) ou un environnement de production, il fonctionnera exactement de la même manière, car il utilisera le même environnement et le même code. Ces problèmes ne sont évidemment pas nouveaux et il existe une alternative qui tente, du moins dans une certaine mesure, d’atténuer le problème de l’incohérence: les vagabonds. Comme docker, il offre un moyen de créer un environnement cohérent, et cela a un coût: il doit exécuter au moins une machine virtuelle, et contrairement à docker, c’est une distribution Linux mature, et j’essaierai de résumer ces problèmes dans ce tutoriel.
Pour illustrer la première de ces questions, de nombreux tutoriels docker montrent le diagramme suivant: À première vue, cela ne semble pas très différent, alors laissez – moi vous montrer un diagramme plus précis qui tient compte des ressources du système: Ce niveau supplémentaire n’a pas l’air si naïf, n’est – ce pas? En fait, ce n’est pas le cas: les systèmes d’exploitation virtuels \/ invités ont besoin d’un grand nombre de ressources verrouillées pour fonctionner, et si vous n’attribuez pas soigneusement les quantités, elles seront certainement épuisées rapidement
Mais j’essaierai d’expliquer pourquoi vous devriez l’éviter. Maintenant que vous avez une connaissance de base de docker, essayons de construire une pile lemp de base (Linux, nginx, MySQL, PHP) que nous utiliserons pour les sites WordPress dans le futur.
Puisque tous les conteneurs docker sont basés sur Linux, il n’est pas nécessaire de les créer spécifiquement, alors concentrons – nous sur nginx comme première partie. Créez un nouveau répertoire de projets et créez un fichier nommé index. Html et insérer le fragment HTML suivant:
Docker World Hello!
Ensuite, en supposant que vous ayez installé docker correctement, lancez cette commande à partir du même répertoire: $docker Run – V $(PWD): \/ usr \/ share \/ nginx \/ html – P 8080: 80 nginx
Comme vous n’avez probablement pas l’image nginx localement, docker la téléchargera à partir du dépôt officiel et l’exécutera avec les paramètres de volume et de port que vous avez entrés. Il ne vous donne aucune indication qu’il fonctionne (au début, il semble suspendu): Puis ouvrez le navigateur et allez à http:\/\/localhost:8080 (ou, si vous utilisez un ordinateur mobile, plus probablement, échangez l’hôte local avec l’IP de l’ordinateur mobile) et ici, bonjour, monde. Pour arrêter le processus, appuyez sur Ctrl + c. Que s’est – il passé? Bien que cela puisse sembler un peu étrange au début, c’est en fait très simple; Le docker a téléchargé l’image (nginx – dernier mot de la commande), Ainsi, un conteneur contenant l’image a été lancé avec deux paramètres spéciaux: monter notre répertoire de projet ($(PWD) pour le Répertoire de travail actuel ou actuel) dans \/ usr \/ share \/ nginx \/ html et cartographier le port 80 du système d’exploitation invité au port 8080 de l’hôte: C’est ce que font les deux caractères, MAPP
Ice ne peut pas être modifié, mais peut être étendu. De même, les images ne peuvent pas être éditées, mais peuvent être étendues. Comme notre image nginx de base ne sait rien de PHP (ou quelque chose comme ça), il est temps que nous l’étendions et que nous utilisions… En bref, dockerfile est un fichier qui contient un ensemble de notes afin que docker puisse créer des images. Voyez – le comme un projet de notre image finale. La seule instruction obligatoire que vous devez entrer dans dockerfile est appelée l’instruction from; Permet au docker de savoir sur quelle image vous souhaitez vous baser. Les dépôts officiels contiennent des images de n’importe quel type de configuration Linux ou de n’importe quelle configuration que vous pouvez imaginer, comme github, ils sont appelés nom d’utilisateur \/ nom d’image: tags, à l’exception des dépôts officiels qui n’ont pas besoin d’un nom d’utilisateur (tags sont toujours optionnels). Ensuite, créez un fichier vide nommé dockerfile (sans extension) à côté de l’index. Html et collez les deux lignes suivantes (bien sûr, changez la Déclaration du responsable pour correspondre à votre nom et à votre courriel): de nginx: 1.10-alpine responsable tomaz Zaman Nos images personnalisées seront basées sur les images alpines officielles de nginx. Alpine est une petite Distribution Linux qui ne pèse que 5 Mo et est très populaire dans la communauté docker parce qu’elle fournit un installateur de paquets standard appelé APK (similaire à Apt – Get – on – Debian \/ UBUNTU) et qu’elle est petite, C’est une bonne chose, parce que vous finirez par transférer des images dans un environnement de production, et il est logique d’utiliser de petites images – en comparaison, Debian a besoin d’environ 200 Mo parce qu’il contient plus de choses dont nous n’avons pas besoin. On a juste besoin de nginx et de ses dépendances. Un autre avantage important de l’utilisation de docker est que les images docker peuvent être étendues. Et des images
Environ 61 Mo. Vous pourriez penser que nous pourrions exécuter la commande initiale (avant d’utiliser dockerfile) pour utiliser la version alpine, en fait, nous pouvons, et j’utilise cet exemple pour vous montrer comment réduire la taille de l’image en étudiant vos options. Dans le cas de nginx, vous en avez plusieurs. Si vous essayez d’exécuter la même commande sans le paramètre – V ($docker Run – P 8080: 80 my WordPress), vous remarquerez notre index. Html n’est plus un serveur: la page d’accueil nginx par défaut est, ce qui n’est pas très utile, donc nous avons ajouté une autre directive dans le dockerfile (ci – dessous): copier l’index. Comme vous pouvez l’imaginer, cette directive reproduit notre index. HTML dans le Répertoire nginx par défaut (écrase tous les fichiers existants avec le même nom). Encore une fois, ce n’est pas grand chose, mais nous rendons notre image autosuffisante. Il devient distribuable. La principale différence entre l’utilisation de volumes et la copie de fichiers est que vous montez généralement des volumes pendant le développement, mais pour la distribution (production), vous devez copier des fichiers dans l’image. Monter des volumes pendant le développement vous permet d’économiser beaucoup de temps parce que vous n’avez pas besoin de reconstruire l’image pour chaque changement: docker échange temporairement le répertoire source sur l’image avec le répertoire source local. Pourquoi est – ce si magique? Comme nous n’avons pas besoin d’installer quoi que ce soit sur notre machine de développement, tout ce qui est nécessaire pour l’exécution est fourni par l’image! Cela signifie que vous n’avez plus besoin d’installer nginx, PHP ou MySQL sur l’ordinateur de développement, ce qui est bien. Si nous ne les désactivons pas, tous ces processus consomment des ressources précieuses, et la plupart du temps nous ne les désactivons pas, ils fonctionnent simplement en arrière – plan. Ainsi, si vous reconstruisez l’image et l’exécutez sans augmenter le volume, vous verrez notre Hello world! ANC
Maintenant. Configurer nginx notre image nginx est maintenant active et fonctionne, mais nous ne l’avons pas encore fait: Nous devons la modifier au besoin. La partie la plus importante, bien sûr, est l’hôte virtuel. Pour en créer un, nous devons écraser la configuration nginx par défaut d’une manière ou d’une autre. Connectez – vous au conteneur pour trouver où il se trouve: $ Docker Run – en mon WordPress \/ bin \/ SH si vous avez déjà utilisé SSH pour vous connecter au serveur, cette commande peut sembler similaire, mais en fait, il n’y a pas SSH ici, et nous allons juste exécuter le shell du conteneur par défaut et le connecter à la ligne de commande (ou terminal, si Vous êtes sur OSX) – la partie en le rend interactif. Normalement, sur les systèmes basés sur Debian \/ Ubuntu, la configuration nginx est d éfinie à \/ etc \/ nginx. Heureusement, cette image utilise la même structure, donc si vous lancez $Ls Al \/ etc \/ nginx \/ conf.d \/ (dans le conteneur), vous verrez en fait un fichier nommé par défaut. Conf, on va bientôt l’écraser. Mais d’abord, vérifions qu’il y a en fait un des hôtes virtuels: $CAT \/ etc \/ nginx \/ conf.d \/ default. Morphologie Notez le bloc serveur {…} Dans la sortie? C’est tout. Créons maintenant notre propre version de ce fichier: lancez $Exit pour vous déconnecter du conteneur et créez un nouveau fichier dans le Répertoire du projet appelé nginx. Morphologie. Saisissez les extraits de code suivants en interne: Server {Server _ name}; Listen 80 default Server; root \/ var \/ www \/ html; index index.php index.html; Access log \/ dev \/ stdout; error log \/ dev \/ stdout info; location \/ {try Files $Uri \/ \/ index.php? $args;} Position ~. Php ${includes FastCGI _ Parameters; FastCGI pass my PHP: 9000; FastCGI index index.php; FastCGI Param script FILENAME $document root $FastCGI script name;}}} À cause de l’index. Php n’existe pas encore, veuillez le créer à côté de l’index. HTML dans le Répertoire du projet et insérer À l’intérieur. Puis ouvrez dockerfile et modifiez – le
Ceci ressemble à ceci: exécuter MkDir – P \/ var \/ www \/ html workdir \/ var \/ www \/ html pour copier nginx à partir de tomazzaman, le responsable de nginx: 1.9-alpine. CONF \/ etc \/ nginx \/ conf.d \/ default. Conf copy De nginx: tomazzaman, le responsable de l’Alpine 1.9, exécute MkDir – P \/ var \/ www \/ html workdir \/ var \/ www \/ html pour copier nginx. CONF \/ etc \/ nginx \/ conf.d \/ default. Conf copy Nous avons ajouté quelques notes ici: copy (que nous connaissons déjà), run et workdir. Nous pouvons maintenant ignorer les deux derniers, mais ils proposent un concept important pour la création d’images: chaque projet a besoin d’un Répertoire d’accueil, le Répertoire par défaut n’est pas nécessairement le meilleur (ou n’existe pas du tout), donc d’abord, nous créons \/ var \/ www \/ html (qui sera le Répertoire racine de notre installation WordPress), puis nous définissons workdir dessus, Cela signifie que toutes les directives ultérieures peuvent être utilisées simplement \/ Décrit le Répertoire de travail actuel. La dernière ligne de ce dockerfile a un exemple: Nous le copions. Pouces \/, Cela signifie que tous les fichiers du Répertoire du projet hôte seront situés dans \/ var \/ www \/ html \/ dans l’image. Workdir est essentiellement identique à l’exécution de commandes CD sur Linux. Si vous essayez de construire et d’exécuter l’image, vous recevrez une erreur parce que par défaut, l’image nginx ne fournit que l’ancien HTML normal. Cependant, dans notre configuration, nous avons introduit un bloc FastCGI (location ~. PHP ${…}) Il pointe vers une autre image (mon PHP) qui n’existe pas encore, alors créons – la maintenant. Image PHP – fpm j’ai vu l’image docker essayer d’exécuter nginx et PHP – fpm dans le même conteneur, ce qui est une grande négation pour moi. Vous souvenez – vous du principe de la pleine responsabilité dont nous avons parlé plus haut? Nous devrions avoir deux images: l’une pour nginx (où le service est responsable) et l’autre pour PHP – fpm (où l’analyse PHP est responsable). Parce que c’est important.
Y a – t – il deux images distinctes? Comme vous verrez bientôt que les processus dans le conteneur ne sont pas (ou du moins ne devraient pas) en arrière – plan, ils devraient fonctionner comme des processus de conteneur primaires et uniques afin que, en cas d’erreur, docker (ou le logiciel de gestion) sache ce qui se passe et tente au moins de redémarrer Le conteneur. Par conséquent, idéalement, l’image = > traitement de premier plan. Bien sûr, si nous exécutons Apache au lieu de nginx, le problème n’existe pas (parce que PHP vient comme un module Apache, il n’y a pas de processus séparé), mais parfois, à des fins d’apprentissage, les choses deviennent trop compliquées. De plus, de nombreux développeurs avancés préfèrent nginx à Apache pour plusieurs raisons, tout comme moi. Pour construire une image PHP, examinons d’abord les options dans le dépôt officiel. Il y en a beaucoup, mais personne n’a intégré MySQL et beaucoup d’autres dépendances WordPress, donc nous avons dû reconstruire la nôtre. Mais ça ne devrait pas être un problème, parce que c’est juste quelques lignes dans le dockerfile, non? Faisons – le. Créez un nouveau dockerfile nommé dockerfile. Php fpm and enter the following Code: from PHP: 7.0.6-fpp: 7.0.6-fpm – Alpine Maintainer tomaz Zaman Run docker PHP ext install – J $(grep – C ^ Processor \/ proc \/ cpuinfo 2 > \/ dev \/ null | 1) iconvv GD mbstring fileinfo Curl xmlleader xmlwriter SPL FTP mysqli Volume \/ var \/ www \/ html from PHP: 7.0.6-fp7.0.6-7.0.6-7.0.6-fpp: 7.0.6-f.7.0.6-f.7.0.6-f.7.0.6-f.6-f PM Alpine Maintainer tomaz Zaman Run docker PHP ext install – J $(grep – C ^ Processor \/ proc \/ cpuinfo 2 > \/ dev \/ null | | 1) iconv GD Mbstring fileinfo Curl xmleader xmlwriter SPL FTP mysqli Volume \/ var \/ www \/ html l’instruction d’exécution ici est légèrement différente, car nous devons installer certaines dépendances qui ne sont pas présentes dans l’image officielle par défaut et dont nous avons besoin pour exécuter WordPress. Heureusement, nous avons la commande docker PHP ext install (Lisez la documentation sur le hub docker)
Si vous ne savez pas d’où il vient, nous l’appelons avec le paramètre J. Au début, cette commande peut sembler effrayante, mais elle permet simplement à l’installateur d’extension de savoir combien de processeurs il peut utiliser. C’est important parce que certaines extensions PHP nécessitent une compilation dynamique, ce qui est coûteux sur le plan informatique. Construisons maintenant l’image PHP – FPM: $docker Build – t my PHP – dockerfile file. Php fpm. Vous verrez beaucoup de choses à l’écran (compilation), mais cela ne prendra pas beaucoup de temps. Heureusement, docker cache les instructions dans ce qu’on appelle un calque – nous le détaillerons dans la prochaine partie de cette série, donc si vous essayez à nouveau d’exécuter la même commande, cela ne prendra qu’environ une seconde. Le dernier bit du fichier dockerfile est l’instruction volume. Cette fois, nous n’avons pas copié le fichier dans l’image, ce qui semblait un peu confus au début, alors laissez – moi expliquer ce qui s’est passé: l’image elle – même n’a pas de fichier source, elle veut monter un volume externe sur elle au moment de l’exécution, un autre avantage de docker est que nous pouvons partager des volumes entre les conteneurs, Cela signifie que nous pouvons connecter n’importe quel répertoire hôte à n’importe quel nombre de conteneurs à la fois et que tout le monde peut y accéder. C’est important parce que le fait de ne pas le faire peut entraîner une incohérence entre les fichiers nginx et PHP – fpm, ce que nous voulons éviter. Alors pourquoi ne pas partager les mêmes données les uns avec les autres? Nos deux images sont prêtes et il est temps de tester le lien entre elles. Tout d’abord, ouvrez l’image PHP – fpm (parce qu’elle d épend de notre configuration nginx) et lancez – la en arrière – plan (ce qui signifie – d): $docker Run – V $(PWD): \/ var \/ www \/ html – name my PHP – D my PHP because this Command Does Not Return anything, run $docker PS to ensure that the Container is running. Attention au récipient.
Arie vient du profil. Nous y définissons deux services, l’un appelé mon nginx (notre image nginx) et l’autre mon PHP. Mon image nginx utilise le répertoire courant comme chemin de construction (à partir de) Parce que docker composition a besoin d’un fichier docker par défaut. De plus, nous avons monté le répertoire actuel du projet sur l’hôte (via la clé de volume) et cartographié les ports dans \/ var \/ www \/ html dans le conteneur, comme nous l’avons fait avec la commande – P, qui n’est plus nécessaire. Enfin, nous l’avons connecté à mon image PHP: docker crée un réseau interne pour l’image en coulisse. En ce qui concerne mon image PHP, la clé Build est légèrement différente parce que son fichier dockerfile n’utilise pas de nom standard (voir ici pour plus de détails). Comme mon image nginx, nous montons les volumes et cartographions les ports. C’est la partie amusante! Pour créer une image en utilisant docker composer, lancez (deux fois pour voir les effets du cache): $docker composer Build une fois compilé, il suffit d’exécuter une autre commande pour voir le conteneur: $docker composer up Yes! C’est tout: docker n’écrit plus de commandes entièrement dans la fenêtre de déplacement! Et MySQL? Une partie très importante de la création d’images à l’aide de docker est les variables d’environnement dont nous n’avons pas discuté. Nous en discuterons plus en détail dans la prochaine partie de ce tutoriel, mais pour une introduction rapide, nous les utiliserons pour créer nos propres images MySQL. Contrairement à notre image PHP – fpm, vous n’avez pas besoin de créer une image MySQL personnalisée (bien que vous puissiez certainement le faire si vous le souhaitez), l’image MySQL formelle nous fournit déjà tout ce dont nous avons besoin! Par conséquent, nous sauterons la commande docker fastidieuse et fastidieuse et ajouterons la configuration directement au fichier de composition docker. Yml. Ajouter la ligne suivante en bas (exécuter
Notez qu’il est retourné comme un autre service: My MySQL: Image: mariadb: 5.5 volumes: – \/ var \/ LIB \/ MySQL Environment: MySQL _ root Password: WP MySQL user: WP MySQL Password: WP also, n’oubliez pas de vous connecter à partir de mon image PHP, puis ajoutez ce lien à la fin: My PHP: (configuration existante) link: – my MySQL si vous essayez d’exécuter $Dock Composite build, Vous remarquerez que l’image MySQL n’a pas été compilée parce qu’elle a été compilée et stockée dans le dépôt officiel, et nous n’avons qu’à la télécharger, qui se produit automatiquement lorsque vous l’exécutez, et continuer ainsi: $docker composer up pour s’assurer qu’elle fonctionne réellement, Passez à votre éditeur de code (mais n’arrêtez pas la composition du docker) et créez un nouveau fichier appelé DB test dans le répertoire principal du projet. PHP et insérer ce qui suit: Je tiens à remercier Mario peshev pour ses commentaires techniques sur cet article.