Comment créer une pile de lampe basée sur Docker en utilisant Docker sur Ubuntu 20.04

Comment créer une pile de lampe basée sur Docker en utilisant Docker sur Ubuntu 20.04

La pile de lampe

Lamp est la pile logicielle sur laquelle l'exécution de la majorité des sites Web. Linux représente les bases de la pile, et l'implémentation traditionnelle comprend Apache en tant que serveur Web, la base de données MySQL et PHP comme langage de programmation côté serveur. Il existe cependant de nombreuses variations possibles: MariaDB, par exemple, est souvent utilisée à la place de MySQL, dont il s'agit d'une fourche et d'autres langages de programmation, car Python ou Perl peuvent être utilisés à la place de PHP. Dans cet article, nous verrons comment implémenter une pile de lampe de base à l'aide de Docker et de l'utilitaire Docker-Compose.

Dans ce tutoriel, vous apprendrez:

  • Comment installer docker et docker-compose sur Ubuntu 20.04
  • Comment définir les services et les volumes à l'aide de Docker-Compose
  • Comment mapper les ports hôtes vers les ports de conteneur dans le fichier de configuration Docker-Compose
  • Comment utiliser des supports de liaison et des volumes nommés
  • Comment construire un projet avec Docker-Compose
Comment créer une pile de lampe basée sur Docker en utilisant Docker sur Ubuntu 20.04

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Installé Ubuntu 20.04 ou amélioré Ubuntu à 20.04 FOCAL FOSSA
Logiciel docker, docker-compose
Autre Autorisations racinaires pour construire des conteneurs Docker et lancer le service Docker
Conventions # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier
  1. Installation de packages et démarrage du service Docker

    Afin de créer une pile de lampe basée sur Docker sur Ubuntu 20.04 Focal Fossa, la première chose que nous devons faire est d'installer le logiciel dont nous avons besoin: docker lui-même, et composer docker, qui est un utilitaire qui nous permet d'organiser facilement des applications multi-continents en utilisant yaml fichiers de configuration. Les deux forfaits sont disponibles dans les référentiels officiels d'Ubuntu. Nous pouvons les installer via apte:

    $ sudo apt installer docker-compose 

    Une fois l'installation effectuée, nous devons démarrer le docker Service et l'activer au démarrage. Nous pouvons effectuer les deux opérations avec une seule commande:

    $ systemctl activer - maintenant docker 
  2. Configuration du projet

    La première étape de notre voyage consiste à créer le répertoire que nous utiliserons comme racine de notre projet. Pour le bien de cet article, nous l'appellerons linuxconfig. À l'intérieur de ce répertoire, nous en créerons un autre, Document de document, qui hébergera nos fichiers de site Web. Nous pouvons créer les deux répertoires à la fois en utilisant le -p option du mkdir commande:

    $ mkdir -p linuxconfig / documentroot 


    À l'intérieur de linuxconfig répertoire, nous définissons la configuration Docker-Compose pour notre projet dans un fichier YAML, qui par défaut doit être appelé composer docker.YML. Il y a trois strophes principales que nous pouvons utiliser dans le fichier de configuration: prestations de service, volumes et réseaux.

    Chaque section est utilisée pour configurer l'aspect correspondant d'un projet. Dans ce tutoriel, nous n'utiliserons que les deux premiers. Nous implémenterons les composants de la pile de lampe en tant que services à l'intérieur de leurs propres conteneurs séparés.

    Les conteneurs créés avec Docker-Compose seront membres du même réseau et pourront donc se parler par défaut. Dans le réseau, chaque conteneur sera en mesure de référencer les autres par un nom d'hôte identique à son nom, ou par le nom utilisé pour définir le service mis en œuvre par le conteneur.

    Par défaut, les conteneurs seront nommés en utilisant le nom du répertoire contenant le fichier de configuration comme préfixe. Dans ce cas, par exemple, le conteneur utilisé pour un service appelé php-httpd, sera nommé linuxconfig_php-httpd_1.

  3. Définition du service PHP + HTTPD

    Le premier service que nous définirons dans le fichier de configuration comprendra Php Comme le module du serveur Web Apache. Nous utiliserons l'une des images PHP officielles disponibles sur docker comme base pour notre conteneur, en particulier celui avec le -apache suffixe, qui fournit la configuration que nous avons mentionnée ci-dessus. Commençons à écrire notre configuration:

    Version: '3.7 'Services: PHP-HTTPD: Image: PHP: 7.Ports 3-Apache: - 80:80 Volumes: - "./ Documentroot: / var / www / html " 
    Copie

    La première chose que nous avons spécifiée dans le fichier de configuration est version. Avec cette instruction, nous déclarons quelle version spécifique du fichier composé que nous allons utiliser. Au moment de l'écriture, version 3.7 est le dernier et recommandé.

  4. Après avoir déclaré la version du fichier de composition, nous avons commencé à écrire le service strophe; À l'intérieur, nous définissons les services qui composeront notre pile de lampe. Nous avons appelé le premier service php-httpd. Le nom du service est complètement arbitraire, mais est toujours une bonne habitude d'en utiliser un qui est significatif dans le contexte du projet.

    Le image L'instruction est utilisée pour spécifier sur quelle image le conteneur doit être basé, dans ce cas PHP: 7.3-APACH.

    Le ports L'instruction est utilisée pour exposer les ports sur le conteneur et pour créer une carte entre les ports hôtes et les ports de conteneur. Une telle carte est définie en séparant les ports avec un :. Sur le côté gauche, nous spécifions le port hôte, et à droite, le port à l'intérieur du conteneur il doit être mappé pour. Dans ce cas, nous avons cartographié le port 80 sur l'hôte du port 80 sur le conteneur, car c'est le port par défaut utilisé par le serveur Web Apache.

    La dernière instruction que nous avons utilisée est volumes: avec lui, nous pouvons spécifier un mappage entre un volume nommé ou un chemin (relatif ou absolu) sur le système hôte sur un chemin sur le conteneur, sur lequel il sera monté.

    Dans notre configuration, le ./ Documentroot Le répertoire hébergera les fichiers du site: il sera monté sur le / var / www / html Répertoire à l'intérieur du conteneur, car ce dernier est la racine du document utilisée par l'Apache VirtualHost par défaut. Une telle configuration est appelée un lier la monture et est particulièrement utile pendant le développement car les modifications que nous apportons sur les fichiers du projet sont immédiatement reflétées à l'intérieur du conteneur. L'inconvénient de cette configuration est qu'il établit une dépendance entre le conteneur et la structure de fichiers de la machine hôte, diminuant l'un des principaux avantages de l'utilisation de Docker: Portabilité.

    Le répertoire à monter à l'intérieur du conteneur sera créé automatiquement s'il n'existe pas lorsque le secouer docker La commande est lancée: dans ce cas, il appartiendra à root s'il n'est pas spécifié autrement.

    À l'intérieur de Document de document Répertoire Nous pouvons maintenant créer un fichier d'index et essayer de créer notre projet pour vérifier que la configuration fonctionne:

    $ echo "documentroot / index.php $ sudo docker-compose up -d 

    Après avoir exécuté la commande, les images Docker nécessaires seront téléchargées depuis DockerHub et les conteneurs que nous serons créés avec les paramètres que nous avons fournis et exécuter en arrière-plan (ils ne bloqueront pas le terminal), en raison de la -d option que nous avons fournie au composer docker commande. Avec le projet en cours d'exécution, si nous naviguons vers hôte local Avec notre navigateur, nous devrions voir la page suivante:



    La page phpinfo

    Pour arrêter le projet, du répertoire hébergeant le composer docker.YML Fichier, nous pouvons exécuter:

    $ sudo docker-compose stop 

    Définir le service MariaDB

    Une partie essentielle de la pile de lampe est la couche de base de données. Dans notre configuration, nous utiliserons Mariadb et son image officielle Docker disponible sur Dockerhub:

    Version: '3.7 'Services: PHP-HTTPD: Image: PHP: 7.Ports 3-Apache: - 80:80 Volumes: - "./ Documentroot: / var / www / html "Mariadb: image: mariaDB: 10.5.2 volumes: - MariaDb-volume: / var / lib / mysql Environment: tz: "Europe / Rome" mysql_allow_empty_password: "non" mysql_root_password: "rootpwd" Mariadb-Volume: 
    Copie

    À l'intérieur de prestations de service strophe, nous avons défini un autre service et l'appeler mariadb Et avec le image instruction que nous avons spécifiée, nous souhaitons utiliser le dix.5.2 Version de l'image officielle.

    Dans la définition de service précédente, nous avons utilisé un support de liaison. Cette fois, au lieu de cela, nous avons utilisé un Docker approprié volume nommé, Pour être monté sur / var / lib / mysql À l'intérieur du conteneur (c'est le répertoire de données par défaut utilisé par MariADB). Contrairement à un support de liaison, les volumes nommés ne créent pas de dépendances du conteneur sur la structure du système de fichiers hôte. Complètement gérés par Docker, ils sont la méthode recommandée de persistance des données qui autrement seraient perdues lorsque les conteneurs sont détruits.

    Les volumes nommés peuvent être définis dans le principal volumes strophe du fichier de configuration et peut être référencé à partir du volumes sous-section de chaque service défini. Dans ce cas, nous avons appelé notre volume mariadb-volume.

    En tant qu'étape suivante, nous avons défini la valeur de certains Variables d'environnement utilisé pour influencer le comportement du conteneur. Les variables d'environnement sont définies dans le environnement Section d'une définition de service. Les variables que nous avons définies dans ce cas ont l'effet suivant:

    Variable Effet
    Tz Définissez le fuseau horaire utilisé par le serveur MariaDB
    Mysql_allow_empty_password Activer ou désactiver l'utilisation du mot de passe vide pour l'utilisateur de la racine DB
    Mysql_root_password Il s'agit d'une variable obligatoire et est utilisée pour définir le mot de passe de l'utilisateur de la racine DB
    Mysql_database Utilisé éventuellement pour spécifier le nom de la base de données à créer sur le démarrage de l'image
    Mysql_user Utilisé éventuellement pour spécifier le nom d'un utilisateur qui sera créé avec des autorisations SuperUser pour la base de données spécifiée avec MySQL_DATABASE
    Mysql_password Utilisé pour spécifier le mot de passe pour l'utilisateur créé avec le nom fourni par MySQL_USER

    À ce stade, nous devrions avoir un serveur Web fonctionnel capable de travailler avec PHP et une base de données pour stocker nos données.

    Bonus - phpmyadmin

    Notre pile de lampe de base devrait maintenant être complète. En prime, nous voulons peut-être ajouter phpmyadmin à lui, afin de contrôler facilement notre base de données MARIADB à partir d'une interface Web conviviale. Ajoutons la définition de service associée à notre configuration docker-compose:

    Version: '3.7 'Services: PHP-HTTPD: Image: PHP: 7.Ports 3-Apache: - 80:80 Volumes: - "./ Documentroot: / var / www / html "Mariadb: image: mariaDB: 10.5.2 volumes: - MariaDb-volume: / var / lib / mysql Environment: tz: "Europe / Rome" mysql_allow_empty_password: "non" mysql_root_password: "rootpwd" mysql_user: 'TESTUSER' MySQL_PASSWORD: 'TestPassword' Image: PHPMYADMIN / PHPMYADMIN Liens: - Ports «MariaDB: DB»: - 8081: 80 Volumes: Mariadb-volume: 
    Copie

    Nous avons nommé notre service phpmyadmin et le configuré pour utiliser le phpmyadmin / phpmyadmin image de dockerhub. Nous avons également utilisé le liens mot-clé pour la première fois; à quoi ça sert? Comme nous le savons déjà, par défaut, et sans aucune configuration spéciale nécessaire, tous les conteneurs créés dans la même configuration Docker-Compose peuvent se parler. L'image PhpMyAdmin est configurée pour référencer un conteneur de base de données en cours d'exécution par le db Nom, nous devons donc créer un alias avec le même nom pour notre service MariaDB. C'est exactement ce liens est utilisé pour: définir des alias supplémentaires pour atteindre un service d'un autre.

    À l'intérieur de la définition du service, nous avons également cartographié le port 8081 de notre machine hôte, à port 80 À l'intérieur du conteneur (le port 80 est déjà mappé au même port à l'intérieur du conteneur PHP-HTTPD). L'interface phpmyadmin sera donc accessible LocalHost: 8081 adresse. Reconstruisons notre projet et vérifions-le:

    $ sudo docker-compose up -d --build 


    La page de connexion phpmyadmin

    Nous pouvons nous connecter avec les informations d'identification que nous avons définies pour notre service de base de données, et vérifier que le testdb La base de données a été créée:



    Page d'accueil phpmyadmin

    Utilisation d'une image personnalisée pour un service

    Dans les exemples ci-dessus, nous avons toujours utilisé des images de vanille dans notre définition de services. Il y a des cas dans lesquels nous pouvons vouloir utiliser des images Docker personnalisées basées sur eux. Par exemple, disons que nous voulons construire le service PHP-HTTPD, mais incluez une extension PHP supplémentaire: comment pouvons-nous le faire? Sur la racine du projet, nous définissons un nouveau répertoire, et pour la commodité, le nommez après le service:

    $ mkdir php-httpd 

    À l'intérieur de ce répertoire, nous créons un dockerfile, utilisé pour étendre l'image de base, avec le contenu suivant:

    De PHP: 7.3-APACHE Étiquette responsable = "Egdoc.dev @ gmail.com "Run apt-get update && apt-get install -y libmcrypt-dev \ && pecl install mcrypt-1.0.2 \ && docker-php-ext-inable mcrypt 

    De retour dans notre composer docker.YML fichier, nous modifions la définition du php-httpd service. Nous ne pouvons pas référencer l'image directement comme nous l'avons fait auparavant. Au lieu de cela, nous spécifions le répertoire contenant notre DockerFile personnalisé comme contexte de construction:

    Version: '3.7 'Services: php-httpd: build: Context: ./ PORTS PHP-HTTPD: - 80:80 Volumes: - "./ Documentroot: / var / www / html "[…] 
    Copie

    Dans le construire Section Nous définissons les configurations qui sont appliquées au moment de la construction. Dans ce cas, nous avons utilisé contexte Pour référencer le répertoire contenant le DockerFile: ledit répertoire est utilisé comme contexte de construction, et son contenu est envoyé au démon Docker lorsque le conteneur est construit. Pour appliquer la modification, nous devons reconstruire le projet.

    Soit dit en passant, pour en savoir plus sur les extensions supplémentaires dans l'image PHP Docker, vous pouvez jeter un œil à la documentation officielle, et en particulier sur Extensions PECL section.

    Conclusions

    Dans ce tutoriel, nous avons vu comment construire une pile de lampe de base en utilisant la technologie des conteneurs avec Docker et Docker-Compose. Nous avons vu comment définir les différents services à l'intérieur du compose Docker.Fichier de configuration YML, et comment configurer les supports de liaison, les volumes nommés et les ports de conteste hôte. Nous avons également vu comment utiliser des images personnalisées. Vous pouvez jeter un œil à la référence Docker-Compose pour la liste détaillée des instructions qui peuvent être utilisées dans le fichier de configuration Docker-Compose.

Tutoriels Linux connexes:

  • Ubuntu 20.04 WordPress avec installation Apache
  • Choses à installer sur Ubuntu 20.04
  • Ampache Raspberry Pi Installation
  • Installation de WordPress OpenLitesPeed
  • Comment travailler avec l'API WooCommerce REST avec Python
  • Comment installer la pile de lampe sur Almalinux
  • Comment configurer le serveur Linux Apache MySQL Python
  • Ubuntu 20.04: WordPress avec l'installation de Nginx
  • Comment changer le mot de passe de l'utilisateur de MariaDB
  • Installez MySQL sur Ubuntu 20.04 LTS Linux