Docker Compose
Application Overview
cieľ - pripraviť riešenie, aby sme mohli rozbehnúť CMS WordPress. Budeme potrebovať dve bežiace služby:
webový server (Apache2 s nainštalovaným PHP)
databázový server (napr. Maria DB)
One Application per Container Rule
Aj keď by bolo možné zabezpečiť, aby sme všetko nainštalovali do jedného obrazu, ktorý si postupne vytvoríme, nie je to odporúčané riešenie. Jedno zo základných pravidiel pri práci s Dockerom je, že do jedného kontajneru patrí práve jedna aplikácia. To teda znamená, že si vytvoríme jeden kontajner pre webový server a druhý kontajner pre databázový server. A navzájom ich prepojíme (kontajnery budú vedieť medzi sebou komunikovať).
Running Web Server
Webový server postavíme na obraze php:apache
ktorý si stiahneme:
$ docker pull php:apache
Spustíme ho
$ docker run --name webserver php:apache
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Tue Apr 18 02:45:21.779146 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.1.3 configured -- resuming normal operations
[Tue Apr 18 02:45:21.779178 2017] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
Rovnako ho môžeme spustiť spolu s prepínačom -d
, ktorý spustí webserver na pozadí. Takto však bude všetky výpisy/logy vypisovať priamo na obrazovku.
Podľa výpisu je tiež možné vidieť, že sa webový server spustil na adrese 172.17.0.2. Ak spustíme prehliadač na danej adrese, nič neuvidíme, pretože v priečinku /var/www/html/
sa nič nenachádza. Skúsme tu teda niečo nakopírovať.
Copying Files to Web Server
Pre prekopírovanie súborov do bežiaceho kontajnera môžeme použiť príkaz docker cp
, ktorého syntax sa nachádza na slajde (Copying Files). Ak si teda pripravíme priečinok /tmp/work/html/
a v ňom súbor index.html
s nasledovným obsahom:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
Do bežiaceho kontajnera tento súbor následne prekopírujeme
$ docker cp /tmp/work/html/* webserver:/var/www/html/
kde webserver
je meno kontajnera, ktoré sme zadali pri spustení. Po spustení prehliadača s IP adresou 172.17.0.2 následne vidíme celý dokument.
Toto však nie je veľmi praktické, aby sme tento úkon robili zakaždým po spustení kontajnera. Preto môžeme vytvoriť vlastný obraz pomocou Dockerfile
súboru a zabezpečiť, aby sa toto kopírovanie robilo pri jeho spustení automaticky pomocou direktívy COPY:
FROM php:apache
COPY html/index.html /var/www/html/
CMD ["apache2-foreground"]
Nový obraz vytvoríme nasledovne:
$ docker build -t webserver-lab .
Sending build context to Docker daemon 3.584 kB
Step 1 : FROM php:apache
---> b177bfebca36
Step 2 : COPY html/* /var/www/html/
---> a13d9e9db4b2
Removing intermediate container 91412be07df9
Step 3 : CMD apache2-foreground
---> Running in a3c1f82e0538
---> 5f7e9adfe971
Removing intermediate container a3c1f82e0538
Priamo po spustení obrazu bude stránka samozrejme dostupná:
$ docker run --rm --name webserver webserver-lab
Stiahnutie a nakopírovanie WordPress-u
- Stiahnuť z webu
- Rozbaliť do priečinku
- Upraviť Dockerfile
- Spustiť
Mapping Volumes
Toto však tiež nemusí byť vždy praktické. Ak totiž budeme webové stránky vyvíjať a budeme ich chcieť meniť za behu, budeme musieť permanentne mazať a vytvárať obraz znova a znova, nakoľko ku prekopírovaniu súborov dôjde vždy len pri vytváraní kontajnera. Riešením môže byť mapovanie priečinkov do kontajnera.
Running DB Server
Použijeme obraz s názvom mariadb
a pokúsime sa ho rovno spustiť
$ docker run --rm mariadb
error: database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
Jedno z odporúčaní pri práci s kontajnermi je ich konfigurácia pomocou premenných prostredia, ako je to v tomto prípade. Aby sme mohli začať používať databázu, musíme nastaviť príslušné premenné pomocou prepínača -e
príkazu docker run
O potrebných prepínačoch sa je možné dočítať priamo zo stránok tohto obrazu https://hub.docker.com/_/mariadb/
$ docker run --rm --name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mariadb
Linking Web Server with DB Server
najprv spustíme databázový kontajner
$ docker run --rm --name db -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mariadb
a hneď na to spustíme vytvorený kontajner s webovou appkou
$ docker run ---rm --link db adminer