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
| 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 |
-
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:
dockeradocker-compose, což je nástroj, který nám umožňuje snadno organizovat vícekontejnerové aplikace pomocíyamlkonfigurač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
dockerslužbu a povolte ji při spouštění. Obě operace můžeme provést jediným příkazem:$ systemctl enable --now docker
-
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í-pmožnostmkdirpříkaz:$ mkdir -p linuxconfig/DocumentRoot
Uvnitř
linuxconfigadresář, definujeme konfiguraci docker-compose pro náš projekt uvnitř souboru yaml, který by se měl ve výchozím nastavení jmenovatdocker-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 .
-
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
-apachepří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 verze3.7je nejnovější a doporučená. - 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.imageinstrukce 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.portsinstrukce 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 port80na hostiteli na port80na 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í
./DocumentRootadresář bude hostit soubory webu:bude připojen k/var/www/htmladresář 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 upje spuštěn příkaz:v takovém případě bude vlastnictvím root, pokud není uvedeno jinak.Uvnitř
DocumentRootadresář, 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
-dmožnost, kterou jsme poskytlidocker-composepříkaz. Když je projekt spuštěn a přejdeme nalocalhostv našem prohlížeči bychom měli vidět následující stránku:

Stránka phpinfoChcete-li projekt zastavit, z adresáře hostujícího
docker-compose.ymlsoubor, 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
mariadba simageinstrukci, kterou jsme specifikovali, chceme použít10.5.2verze 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/mysqluvnitř 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
volumesstanza konfiguračního souboru a lze na ni odkazovat zvolumespodsekci každé definované služby. V tomto případě jsme náš svazek nazvalimariadb-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
phpmyadmina nakonfiguroval jej tak, aby používal phpmyadmin/phpmyadmin obrázek z dockerhubu. Také jsme použililinksklíč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ídbjméno, proto musíme vytvořit alias se stejným názvem pro naši službu mariadb. To je přesně to, colinksse 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
8081našeho hostitelského počítače na port80uvnitř 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 PhpMyAdminMůž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
testdbdatabáze byla vytvořena:

Domovská stránka PhpMyAdminPouž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.ymlupravíme definiciphp-httpdservis. 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
buildv sekci definujeme konfigurace, které se použijí v době sestavení. V tomto případě jsme použilicontextodkazovat 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.