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
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:
docker
adocker-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
-
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žnostmkdir
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í 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
-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 verze3.7
je 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.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 port80
na hostiteli na port80
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 poskytlidocker-compose
příkaz. Když je projekt spuštěn a přejdeme nalocalhost
v 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.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 simage
instrukci, kterou jsme specifikovali, chceme použít10.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 zvolumes
podsekci 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
phpmyadmin
a nakonfiguroval jej tak, aby používal phpmyadmin/phpmyadmin obrázek z dockerhubu. Také jsme použililinks
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, colinks
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 port80
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 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
testdb
databá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.yml
upravíme definiciphp-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žilicontext
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.