Zprovoznění webového serveru a dalších služeb
Webový server je software, který zprostředkovává webovou stránku klientům, kteří o ni požádají pomocí HTTP požadavku. Existuje celá řada webových serverů. Mezi ty nejznámější patří: Apache, IIS, nginx, node.js (později uvidíme, že node.js je něco víc než jen webový server).
Zprovoznit webový server je poměrně snadné. Stačí jej nainstalovat a spustit. Pokud chceme na webovém serveru provozovat statické webové stránky, jednoduše umístíme soubory (HTML, CSS, JS) na určené místo a máme hotovo. V případě, že chceme provozovat dynamické webové stránky, musíme k webovému serveru přidat server aplikační (zabezpečující vykonávání programového kódu, který stránku sestavuje) a případně databázový (sloužící pro perzistentní uložení dat). V principu se opět nejedná o nic složitého.
V následujících seminářích si mimo jiné ukážeme tvorbu dynamických stránek s využitím jazyka PHP a databáze MySQL. Nyní si ukážeme, jak připravit vše potřebné.
Ve spojení s výše uvedenými technologiemi se obvykle využívá webový server Apache. Standardně je tato trojice součásti tzv. LAMP balíčků. Podle OS jsou nejběžnější: WAMP, XAMPP, MAMP. Případně je možné nainstalovat jednotlivé služby samostatně.
Nevýhodou tohoto řešení je, že instalace je společná pro všechny vyvíjené projekty. Navíc je obvykle třeba služby konfigurovat a přenesení této konfigurace, nemluvě o problémech s různými verzemi software (či knihoven), na jiný stroj může být obtížné. Lepším způsobem je využít při nasazení webové stránky/aplikace kontejnerizaci.
Docker
Docker je dnes běžně používaná (de facto standard) technologie pro kontejnerizaci. Kontejner představuje izolované prostředí, ve kterém běži (ne nutně webová) aplikace. Přesněji řečeno v kontejneru běží (docker) image, který aplikaci obsahuje.
Instalace
Instalace je popsána na stránkách docs.docker.com. Aplikace Docker desktop obsahuje vše potřebné pro práci s kontejnery. Kontrolu instalace je možné provést následujícím příkazem
docker version
Je třeba ověřit, že běží klient i server a verze je větší nebo stejná jako 20.10.17
.
Vytvoření image a spuštění kontejneru
Abychom mohli aplikaci v kontejneru spustit, musíme nejprve vytvořit docker image, který bude aplikaci obsahovat. Sestavení image je popsáno v konfiguračním souboru Dockerfile.yml
ve formátu YAML. Dodejme, že přípona .yaml
bude fungovat také. (pozor na přípony na různých OS se chování mírně liší). Nejprve si ukážeme ukázkový příklad.
Vytvoříme složku hello-world
, v ní složku public-html
a soubor Dockerfile.yml
obsahující následující příkaz.
FROM httpd:2.4
Příkaz FROM
určuje základ (base image), ze kterého bude vytvořen náš image. Využijeme existující image httpd
, který je volně dostupný na Docker hubu. Za znak dvojtečky zapíšeme verzi, kterou chceme využít. Následně vytvoříme image následujícím příkazem.
docker build -t hello-world .
Přehled vytvořených image lze zobrazit příkazem
docker image ls
Následně spustíme image v kontejneru.
docker run -p 8080:80 -v /Users/trneckam/docker/WEBA/hello-world/public-html/:/usr/local/apache2/htdocs/ hello-world
-p 8080:80
zajistí mapování lokálního portu 8080
na port 80
v kontejneru. -v /Users/trneckam/docker/WEBA/hello-world/public-html/:/usr/local/apache2/htdocs/
zajistí mapování lokální složky /Users/trneckam/docker/WEBA/hello-world/public-html/
do složky v kontejneru /usr/local/apache2/htdocs/
. Do lokální složky public-html
umístíme soubor index.html
. Mapování se může na různých OS lišit. V případě OS Windows je možné psát cestu C:\path\to\host\folder\
, případně //c/path/to/host/folder/
.
Webový server je nyní dostupný na lokální adrese http://localhost:8080
. Ukončíme jej pomocí CTRL + C
. Případně je možné spustit kontejner na pozadí pomocí parametru -d
. Přehled kontejnerů je možné zobrazit pomocí příkazu.
docker container ls
Ukončení běhu kontejneru se provádí příkazem docker stop name
, kde name
je jméno kontejneru z předchozího výpisu.
Pokud bychom chtěli webový server distribuovat i s obsahem složky public-html
, stačí upravit Dockerfile.yml
následovně.
FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/
Následně vytvořit image a spustit příkazem docker run -p 8080:80 hello-world
.
Příkaz COPY
provede překopírování obsahu z lokálního adresáře do adresáře v kontejneru. Existuje celá řada příkazů, kterými je možné upravit používaný image.
Jednou z možností, jak vytvořit image obsahující webový, aplikační a databázový server, je využít existující image, například ubuntu
obsahující jádro OS a do něj doinstalovat potřebné náležitosti. Následující konfigurační soubor ukazuje instalaci a spuštění Apache.
FROM ubuntu:latest
RUN apt update
RUN apt -y install apache2
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
CMD ["apachectl", "-D", "FOREGROUND"]
Nevýhodou uvedeného způsobu ale monolitická architektura (vše v jednom kontejneru). Zajímavější alternativou je vytvořit několik spolupracujících kontejnerů. K tomuto slouží nástroj docker-compose
.
docker-compose
Nástroj docker-compose
umožňuje vytvořit několik spolupracujících kontejnerů. Opět je nejprve potřeba vytvořit a nakonfigurovat image, případně využít existující. Postup sestavení všech image je specifikován v souboru docker-compose.yml
. Výhodou docker-compose
je možnost specifikování všech parametrů přímo v konfiguračním souboru. Spouštění kontejnerů je tedy jednodušší.
Nyní si vytvoříme komplexní prostředí obsahující webový server Apache, podporu jazyka PHP, MySQL databázi a administrační rozhraní pro databázi. Pro databázi a její administraci nám postačí existující nezměněné image. Pro webový server, který bude podporovat PHP a MySQL databázi, musíme modifikovat výchozí image. Následuje obsah docker-compose.yml
.
version: "3.9"
services:
# Apache a PHP
www:
build: ./docker/php-apache # cesta k Dockerfile
volumes:
- ./src:/var/www/html/
ports:
- 8080:80
# MySQL databáze
db:
image: mysql:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: toor # nastavení hesla pro uživatele root
# administrace databáze
adminer:
image: adminer:latest
restart: always
ports:
- 8081:8080
Dockerfile.yml
umístěný ve složce ./docker/php-apache
vypadá následovně.
FROM php:8.1-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
Image sestavíme a spustíme příkazy.
#sestavení
docker-compose build
#spuštění
docker-compose up
Případně je možné obojí spustit současně docker-compose up --build
.
Po spuštění běží webový server na portu 8080
a administrační rozhraní na portu 8081
. Konfigurační soubory a adresářová struktura je předpřipravena v souboru docker-web-server.zip.
Kam dál?
Možnosti kontejnerizace jsou daleko nad rámec tohoto kurzu. Ukázali jsme pouze základní spuštění běhového prostředí pro klasickou PHP/MySQL aplikaci, kterým se budeme v příštích seminářích věnovat. Kontejnerizace mimo jiné umožňuje: škálovatelnost a průběžnou integraci (continuous integration).
Zadání
-
úkol 1
Spusťte nebo nainstalujte některý z LAMP balíčků. Na školních počítačích je nainstalován XAMPP. Vytvořte HTML soubor a spusťte jej na webové serveru.
-
úkol 2
Zprovozněte webový server Apache, s podporou PHP a MySQL v Docker kontejnerech.
-
úkol 3 (dobrovolný)
Podívejte se na docker hub a projděte si images, které zde jsou k~dispozici.
-
úkol 4 (dobrovolný)
Projděte si dokumentaci k Docker.
-
úkol 5 (dobrovolný)
Podívejte se na alternativy k Dockeru, například Podman, LXD.