GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak vytvořit zásobník LAMP založený na dockeru pomocí dockeru na Ubuntu 20.04

Zásobník LAMP

LAMP je softwarový balík, na kterém pravděpodobně běží většina webových stránek. Linux představuje základ zásobníku a tradiční implementace zahrnuje Apache jako webový server, databázi MySQL a PHP jako programovací jazyk na straně serveru. Existuje však mnoho možných variant:například MariaDB se často používá místo MySQL, jehož je forkem, a další programovací jazyky, protože místo PHP lze použít Python nebo Perl. V tomto článku uvidíme, jak implementovat základní zásobník LAMP pomocí dockeru a nástroje docker-compose.

V tomto tutoriálu se naučíte:

  • Jak nainstalovat docker a docker-compose na Ubuntu 20.04
  • Jak definovat služby a svazky pomocí docker-compose
  • Jak namapovat hostitelské porty na kontejnerové porty v konfiguračním souboru docker-compose
  • Jak používat připojení připojení a pojmenované svazky
  • Jak vytvořit projekt pomocí docker-compose

Jak vytvořit zásobník LAMP založený na dockeru pomocí dockeru na Ubuntu 20.04

Požadavky na software a použité konvence

Softwarové požadavky a konvence příkazového řádku systému Linux
Kategorie Požadavky, konvence nebo použitá verze softwaru
Systém Nainstalováno Ubuntu 20.04 nebo upgradováno Ubuntu na 20.04 Focal Fossa
Software docker, docker-compose
Jiné Kořenová oprávnění k vytváření kontejnerů dockeru a spouštění služby docker
Konvence # – vyžaduje, aby dané linuxové příkazy byly spouštěny s právy root buď přímo jako uživatel root, nebo pomocí sudo příkaz
$ – vyžaduje, aby dané linuxové příkazy byly spouštěny jako běžný neprivilegovaný uživatel
  1. Instalace balíčků a spuštění služby docker

    Abychom vytvořili zásobník LAMP založený na Dockeru na Ubuntu 20.04 Focal Fossa, první věc, kterou musíme udělat, je nainstalovat software, který potřebujeme:docker a docker-compose , což je nástroj, který nám umožňuje snadno organizovat vícekontejnerové aplikace pomocí yaml konfigurační soubory. Oba balíčky jsou dostupné v oficiálních repozitářích Ubuntu. Můžeme je nainstalovat pomocí apt :

    $ sudo apt install docker docker-compose
    

    Po dokončení instalace musíme spustit docker službu a povolte ji při spouštění. Obě operace můžeme provést jediným příkazem:

    $ systemctl enable --now docker
    
  2. Nastavení projektu

    Prvním krokem na naší cestě je vytvoření adresáře, který použijeme jako kořen našeho projektu. Pro účely tohoto článku jej budeme nazývat linuxconfig . Uvnitř tohoto adresáře vytvoříme další, DocumentRoot , která bude hostit soubory našich webových stránek. Můžeme vytvořit oba adresáře najednou pomocí -p možnost mkdir příkaz:

    $ mkdir -p linuxconfig/DocumentRoot
    

    Uvnitř linuxconfig adresář, definujeme konfiguraci docker-compose pro náš projekt uvnitř souboru yaml, který by se měl ve výchozím nastavení jmenovat docker-compose.yml . V konfiguračním souboru můžeme použít tři hlavní stanzy:services , svazky a sítě .

    Každá sekce se používá ke konfiguraci odpovídajícího aspektu projektu. V tomto tutoriálu použijeme pouze první dva. Implementujeme komponenty zásobníku LAMP jako služby v jejich vlastních samostatných kontejnerech.

    Kontejnery vytvořené pomocí docker-compose budou členy stejné sítě, a proto spolu budou moci ve výchozím nastavení komunikovat. V síti bude každý kontejner schopen odkazovat na ostatní pomocí názvu hostitele shodného s jeho názvem nebo podle názvu používaného k definování služby implementované kontejnerem.

    Ve výchozím nastavení budou kontejnery pojmenovány pomocí názvu adresáře obsahujícího konfigurační soubor jako předponu. V tomto případě jde například o kontejner používaný pro službu s názvem php-httpd , bude mít název linuxconfig_php-httpd_1 .

  3. Definování služby php + httpd

    První služba, kterou definujeme v konfiguračním souboru, bude obsahovat PHP jako modul webového serveru Apache. Použijeme jeden z oficiálních obrázků PHP dostupných na dockerhub jako základ pro náš kontejner, konkrétně ten s -apache přípona, která poskytuje nastavení, které jsme zmínili výše. Začněme psát naši konfiguraci:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
    

    První věc, kterou jsme zadali v konfiguračním souboru, je version . Touto instrukcí deklarujeme, jakou konkrétní verzi složeného souboru budeme používat. V momentě psaní je verze 3.7 je nejnovější a doporučená.

  4. Po deklaraci verze souboru pro psaní jsme začali psát službu sloka; uvnitř ní definujeme služby, které budou tvořit náš zásobník LAMP. První službu jsme nazvali php-httpd . Název služby je zcela libovolný, ale vždy je dobrým zvykem používat takový, který je smysluplný v kontextu projektu.

    image instrukce se používá k určení obrázku, na kterém by měl být kontejner založen, v tomto případě php:7.3-apache .

    ports instrukce se používá k odhalení portů na kontejneru a k vytvoření mapy mezi hostitelskými porty a kontejnerovými porty. Taková mapa je definována oddělením portů pomocí : . Na levé straně určujeme hostitelský port a na pravé straně port uvnitř kontejneru, na který má být mapován. V tomto případě jsme namapovali port 80 na hostiteli na port 80 na kontejneru, protože je to výchozí port používaný webovým serverem Apache.

    Poslední instrukce, kterou jsme použili, je volumes :pomocí něj můžeme určit mapování mezi pojmenovaným svazkem nebo cesta (relativní nebo absolutní) na hostitelském systému k cestě v kontejneru, ke kterému bude připojen.

    V našem nastavení ./DocumentRoot adresář bude hostit soubory webu:bude připojen k /var/www/html adresář uvnitř kontejneru, protože druhý je kořen dokumentu používaný výchozím Apache VirtualHost. Takové nastavení se nazývá bind mount a je zvláště užitečný při vývoji, protože změny, které provedeme v souborech projektu, se okamžitě projeví uvnitř kontejneru. Nevýhodou této konfigurace je, že vytváří závislost mezi kontejnerem a strukturou souborů hostitelského počítače, což snižuje jednu z hlavních výhod používání Dockeru:přenositelnost.

    Adresář, který má být připojen do kontejneru, bude vytvořen automaticky, pokud neexistuje při docker-compose up je spuštěn příkaz:v takovém případě bude vlastnictvím root, pokud není uvedeno jinak.

    Uvnitř DocumentRoot adresář, nyní můžeme vytvořit indexový soubor a pokusit se sestavit náš projekt, abychom ověřili, že nastavení funguje:

    $ echo "<?php phpinfo();" > DocumentRoot/index.php
    $ sudo docker-compose up -d
    

    Po provedení příkazu budou potřebné obrázky dockeru staženy z dockerhubu a vytvořeny kontejnery s nastavením, které jsme poskytli, a spuštěny na pozadí (nebudou blokovat terminál), protože -d možnost, kterou jsme poskytli docker-compose příkaz. Když je projekt spuštěn a přejdeme na localhost v našem prohlížeči bychom měli vidět následující stránku:



    Stránka phpinfo

    Chcete-li projekt zastavit, z adresáře hostujícího docker-compose.yml soubor, můžeme spustit:

    $ sudo docker-compose stop
    

    Definování služby MariaDB

    Nezbytnou součástí zásobníku LAMP je databázová vrstva. V naší konfiguraci použijeme MariaDB a jeho oficiální obrázek dockeru dostupný na dockerhub:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 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: "no"
                MYSQL_ROOT_PASSWORD: "rootpwd"
                MYSQL_USER: 'testuser'
                MYSQL_PASSWORD: 'testpassword'
                MYSQL_DATABASE: 'testdb'
    
    volumes:
        mariadb-volume:
    

    Uvnitř služeb stanza, definovali jsme další službu a nazýváme ji mariadb a s image instrukci, kterou jsme specifikovali, chceme použít 10.5.2 verze oficiálního obrázku.

    V předchozí definici služby jsme použili připojení připojení. Tentokrát jsme místo toho použili pořádný docker pojmenovaný svazek , který má být připojen na /var/lib/mysql uvnitř kontejneru (je to výchozí datový adresář používaný MariaDB). Na rozdíl od připojení vazby nevytvářejí pojmenované svazky závislosti kontejneru na struktuře hostitelského souborového systému. Jsou zcela spravovány Dockerem a představují doporučený způsob uchování dat, která by jinak byla ztracena při zničení kontejnerů.

    Pojmenované svazky lze definovat v hlavních volumes stanza konfiguračního souboru a lze na ni odkazovat z volumes podsekci každé definované služby. V tomto případě jsme náš svazek nazvali mariadb-volume .

    Jako další krok jsme definovali hodnotu některých proměnných prostředí slouží k ovlivnění chování kontejneru. Proměnné prostředí jsou definovány v environment části definice služby. Proměnné, které jsme v tomto případě definovali, mají následující účinek:

    Proměnná Efekt
    TZ Nastavte časové pásmo používané serverem MariaDB
    MYSQL_ALLOW_EMPTY_PASSWORD Povolení nebo zakázání použití prázdného hesla pro uživatele root v databázi
    MYSQL_ROOT_PASSWORD Toto je povinná proměnná a používá se k nastavení hesla uživatele root databáze
    MYSQL_DATABASE Volitelně se používá k zadání názvu databáze, která má být vytvořena při spuštění bitové kopie
    MYSQL_USER Volitelně se používá k zadání jména uživatele, který bude vytvořen s oprávněními superuživatele pro databázi zadanou pomocí MYSQL_DATABASE
    MYSQL_PASSWORD Slouží k zadání hesla pro uživatele vytvořeného se jménem poskytnutým MYSQL_USER

    V tuto chvíli bychom měli mít funkční webový server schopný pracovat s PHP a databázi pro ukládání našich dat.

    Bonus – phpMyAdmin

    Náš základní zásobník LAMP by nyní měl být kompletní. Jako bonus můžeme přidat phpMyAdmin k němu, abyste mohli snadno ovládat naši databázi MariaDB z uživatelsky přívětivého webového rozhraní. Pojďme přidat související definici služby do naší konfigurace sestavování dockeru:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 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: "no"
                MYSQL_ROOT_PASSWORD: "rootpwd"
                MYSQL_USER: 'testuser'
                MYSQL_PASSWORD: 'testpassword'
                MYSQL_DATABASE: 'testdb'
    
        phpmyadmin:
            image: phpmyadmin/phpmyadmin
            links:
                - 'mariadb:db'
            ports:
                - 8081:80
    
    volumes:
        mariadb-volume:
    

    Naši službu jsme pojmenovali phpmyadmin a nakonfiguroval jej tak, aby používal phpmyadmin/phpmyadmin obrázek z dockerhubu. Také jsme použili links klíčové slovo poprvé; k čemu to je? Jak již víme, ve výchozím nastavení a bez potřeby speciálních konfigurací jsou všechny kontejnery vytvořené ve stejné konfiguraci docker-compose schopny spolu komunikovat. Obrázek phpMyAdmin je nakonfigurován tak, aby odkazoval na běžící databázový kontejner pomocí db jméno, proto musíme vytvořit alias se stejným názvem pro naši službu mariadb. To je přesně to, co links se používá pro:k definování dalších aliasů pro dosažení služby z jiné.

    V rámci definice služby jsme také namapovali port 8081 našeho hostitelského počítače na port 80 uvnitř kontejneru (port 80 je již namapován na stejný port v kontejneru php-httpd). Rozhraní phpMyAdmin tedy bude dostupné na localhost:8081 adresa. Pojďme znovu postavit náš projekt a ověřit jej:

    $ sudo docker-compose up -d --build
    


    Přihlašovací stránka PhpMyAdmin

    Můžeme se přihlásit pomocí přihlašovacích údajů, které jsme definovali pro naši databázovou službu, a ověřit, že testdb databáze byla vytvořena:



    Domovská stránka PhpMyAdmin

    Použití vlastního obrázku pro službu

    Ve výše uvedených příkladech jsme v definici služeb vždy používali vanilkové obrázky. Existují případy, kdy můžeme chtít použít vlastní obrázky dockeru založené na nich. Řekněme například, že chceme vytvořit službu php-httpd, ale zahrnout další rozšíření php:jak to můžeme udělat? V kořenovém adresáři projektu definujeme nový adresář a pro usnadnění jej pojmenujeme podle služby:

    $ mkdir php-httpd
    

    Uvnitř tohoto adresáře vytvoříme Dockerfile, používaný k rozšíření základního obrazu, s následujícím obsahem:

    FROM php:7.3-apache
    LABEL maintainer="[email protected]"
    
    RUN apt-get update && apt-get install -y libmcrypt-dev \
        && pecl install mcrypt-1.0.2 \
        && docker-php-ext-enable mcrypt
    

    Zpět v našem docker-compose.yml upravíme definici php-httpd servis. Nemůžeme odkazovat přímo na obrázek jako dříve. Místo toho určíme adresář obsahující náš vlastní soubor Dockerfile jako kontext sestavení:

    version: '3.7'
    
    services:
        php-httpd:
            build:
                context: ./php-httpd
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    [...]
    

    V build v sekci definujeme konfigurace, které se použijí v době sestavení. V tomto případě jsme použili context odkazovat na adresář obsahující soubor Dockerfile:uvedený adresář se používá jako kontext sestavení a jeho obsah je odeslán démonovi Docker při sestavení kontejneru. Abychom mohli použít modifikaci, musíme projekt znovu postavit.

    Mimochodem, chcete-li se dozvědět více o dalších rozšířeních v obrázku php docker, můžete se podívat na oficiální dokumentaci a konkrétně na rozšíření PECL sekce.

    Závěry

    V tomto tutoriálu jsme viděli, jak vytvořit základní zásobník LAMP pomocí technologie kontejnerů s Docker a docker-compose. Viděli jsme, jak definovat různé služby v konfiguračním souboru docker-compose.yml a jak nakonfigurovat připojení připojení, pojmenované svazky a mapování portů hostitele a kontejneru. Také jsme viděli, jak používat vlastní obrázky. Podrobný seznam pokynů, které lze použít v konfiguračním souboru docker-compose, najdete v referenční příručce k docker-compose.


Ubuntu
  1. Jak nainstalovat LAMP Stack na Ubuntu 18.04

  2. Jak používat loutkové moduly k vytvoření zásobníku LAMP na Ubuntu 20.04

  3. Jak vytvořit pole RAID pomocí MDADM na Ubuntu

  1. Jak vytvořit VPN na Ubuntu 20.04 pomocí Wireguard

  2. Jak nainstalovat Docker na Ubuntu 22.04

  3. Jak nainstalovat WordPress na Ubuntu 18.04 pomocí LAMP Stack

  1. Jak nainstalovat Outline Knowledgebase Wiki na Ubuntu pomocí Dockeru

  2. Jak spravovat kontejnery Docker pomocí Portainer na Ubuntu

  3. Jak vytvořit VPC pomocí Pythonu Boto3 na Ubuntu