KMI/WEBA Webové aplikace: Seminář 02

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í

  1. ú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.

  2. úkol 2

    Zprovozněte webový server Apache, s podporou PHP a MySQL v Docker kontejnerech.

  3. úkol 3 (dobrovolný)

    Podívejte se na docker hub a projděte si images, které zde jsou k~dispozici.

  4. úkol 4 (dobrovolný)

    Projděte si dokumentaci k Docker.

  5. úkol 5 (dobrovolný)

    Podívejte se na alternativy k Dockeru, například Podman, LXD.