Docker 101 part 2
pokračovanie nie príliš stručného úvodu do technológie Docker
Goals
- naučiť sa pracovať s prostredím kontajnera
- zoznámiť sa s Docker sieťami (
networks
) - zoznámiť sa s perzistentnými Docker úložiskami
(
volumes
) - zostaviť prvú Docker kompozíciu
Content
Run multiple containers
V prvom kroku spustíme viacero kontajnerov, ktoré budú navzájom komunikovať - Wordpress a databázu. Ukážeme si, ako nastaviť premenné prostredia pre kontajnery a ako spúšťať príkazy vo vnútri kontajnera. Nakoniec sa pozrieme na to, ako ich navzájom prepojiť pomocou spoločnej siete.
Task
Spustite kontajner z obrazu wordpress
na pozadí s
presmerovaným portom 80
na 8080
a názvom
iot-wordpress
.
Tento kontajner nám bude bežať na pozadí a aby sa s ním jednoduchšie
pracovalo, zašpecifikujeme mu názov. Takisto prepojíme port lokálny port
8080
s portom kontajnera 80
, aby sme k
webovému serveru mohli pristupovať cez localhost
.
$ docker container run --name iot-wordpress --publish 8080:80 --detach wordpress
Spustený kontajner môžeme skontrolovať pomocou príkazu
container ls
:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0edd901c2f74 wordpress "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp iot-wordpress
Na spustený kontajner pristúpime cez adresu localhost:8080. Spustí sa nám prvotná inštalácia Wordpress-u. V prvom kroku si zvolíme jazyk, v ktorom chceme Wordpress mať.
Task
Spustite databázový kontajner z obrazu mysql:5.7
na
pozadí s názvom iot-db
a pomocou premenných prostredia
nastavíme ROOT heslo MYSQL_ROOT_PASSWORD
a názov databázy
MYSQL_DATABASE
.
V druhom kroku nastavovania Wordpress-u budeme potrebovať zadať údaje pre pripojenie k databáze. Databáza nám však ešte nebeží, preto si ju potrebujeme najprv spustiť.
Budeme spúšťať databázu MySQL z obrazu s označením
(tag) 5.7
. Podľa referenčnej stránky obrazu mysql potrebujeme pri spúšťaní
obrazu uviesť MYSQL_ROOT_PASSWORD
premennú prostredia,
ktorá slúži ako prístupové heslo pre účet superuser-a. Takisto
chceme, aby sa automaticky vytvorila databáza s názvom
wordpressdb
, čo nastavíme v premennej prostredia
MYSQL_DATABASE
. Premenné prostredia môžeme kontajneru
nastaviť prepínačmi --env
:
$ docker container run --name iot-db --env MYSQL_ROOT_PASSWORD=iot-secret --env MYSQL_DATABASE=wordpressdb --detach mysql:5.7
Task
Vytvorte Docker sieť s názvom iot-network
, do
ktorej pripojte kontajnery Wordpress-u a MySQL.
Následne sa pripojte v inštalácii Wordpress-u k MySQL
databáze s názvom wordpressdb
.
Konečne sa môžeme pokúsiť pripojiť k našej databáze z našej inštanie Wordpress-u. V prehliadači vidíme nasledujúci formulár, v ktorom môžeme vyplniť meno databázy, používateľské meno a heslo. Čo je však hostiteľ databázy?
Kontajnery nie sú navzájom nijak prepojené, takže sa navzájom
nepoznajú. Jediným spôsobom by bolo zadať IP adresu databázového
kontajnera, ktorú by sme museli zistiť pomocou príkazu
docker inspect
, avšak to nie je spoľahlivý spôsob, pretože
táto adresa sa pre kontajner môže meniť. Preto kontajnery prepojíme
pomocou spoločnej siete network
.
Poznámka
Aj keby sme previazali port kontajnera (3306
) s nejakým
lokálnym portom, nemohli by sme použiť ako hostiteľa databázy
localhost
, pretože localhost
kontajnera nie je
ten istý, ako localhost
nášho systému.
Najprv vytvoríme novú sieť príkazom
docker network create
:
$ docker network create iot-network
Docker vytvorí novú vnútornú sieť, do ktorej môžeme pripojiť
existujúce kontajnery príkazom docker network connect
,
každý zvlášť:
$ docker network connect iot-network <názov-kontajnera>
Ak sme postupovali správne, môžeme v inštalácii Wordpress-u
zadať ako hostiteľa databázy názov nášho databázového kontajnera
iot-db
. Po potvrdení nás Wordpress v ďalšom kroku
pochváli, že sa nám podarilo nastaviť pripojenie k databáze.
Poznámka
Nabudúce môžeme zadefinovať sieť už pri spúšťaní kontajnerov, napríklad:
$ docker container run --name iot-db --network iot-network --env MYSQL_ROOT_PASSWORD=iot-secret --env MYSQL_DATABASE=wordpressdb --detach mysql:5.7
Don’t lose the data!
V tomto momente môžeme v našom Wordpress-e pridávať a upravovať články a rôzne s ním pracovať. Problém však je, že tieto dáta nie sú perzistentné - teda zmiznú, keď odstránime náš kontajner. V tomto kroku si ukážeme, ako kopírovať súbory medzi kontajnerom a lokálnym systémom a ako vytvoriť Docker úložisko, do ktorého sa budú ukladať dáta z našich kontajnerov.
Task
Uložte si export wordpressdb
databázy do lokálneho
systému a súbor nazvite dump.sql
.
Naše články sú uložené v databáze MySQL nášho databázového
kontajnera, no pri vytvorení nového sa tieto údaje automaticky
neprenesú. Môžeme si z nášho existujúceho kontajnera exportovať
SQL súbor, ktorý v prípade novej databázy môžeme importovať. Na
prácu s MySQL serverom potrebujeme spúšťať príkazy z
CLI rozhrania MySQL vo vnútri kontajnera. Aby sme to
dokázali, musíme náš príkazový riadok prepojiť s príkazovým riadkom
kontajnera pomocou prepínačov --tty
a
--interactive
. Navyše, keďže nám už kontajner beží na
pozadí, nemôžeme použiť príkaz docker container run
, ktorý
by vytvoril nový kontajner z obrazu, ale použijeme príkaz
docker container exec
spolu s príkazom, ktorý chceme v
kontajneri vykonať - v našom prípade príkaz bash
, ktorý nám
spustí novú reláciu príkazového riadku.
$ docker container exec -ti iot-db bash
root@d903d461ca49:/#
Poznámka
Argument iot-db
je názov kontajnera, do ktorého sa
chceme pripojiť a bash
je náš príkaz na vytvorenie novej
relácie príkazového riadku vo vnútri kontajnera.
Teraz sa nachádzame vo vnútri databázového kontajnera, odkiaľ môžeme spustiť CLI rozhranie databázového servera príkazom:
root@d903d461ca49:/# mysql --password=<nase-root-heslo>
Poznámka
Krok s púšťaním relácie príkazového riadku bash
môžeme
preskočiť priamo zadaním príkazu pre otvorenie CLI rozhrania
servera:
$ docker container exec -ti iot-db mysql --password=<nase-root-heslo>
Ak sme sa úspešne pripojili k databázovému serveru, môžeme si napríklad zobraziť existujúce databázy:
mysql> SHOW DATABASES;
Na vytvorenie exportu databázy použijeme nástroj
mysqldump
namiesto štandardného CLI rozhrania
mysql
. Tento príkaz musíme spúšťať vo vnútri databázového
kontajnera:
root@d903d461ca49:/# mysqldump --databases wordpressdb --password=iot-secret > dump.sql
Či bol súbor úspešne vytvorený môžeme preveriť príkazom:
root@d903d461ca49:/# ls *.sql
dump.sql
Tento súbor sa však stále nachádza vo vnútri kontajnera, takže stále
sa nám môže stratiť, keď kontajner odstránime. Do lokálneho systému si
ho nakopírujeme príkazom docker container cp
. Zdrojový
súbor, ktorý chceme kopírovať, zadávame vo formáte
<názov_kontajnera>:<cesta_k_súboru>
:
$ docker container cp iot-db:dump.sql .
Súbor dump.sql
by sa mal teraz nachádzať v lokálnom
systéme v priečinku, v ktorom sa práve nachádzame. Rovnakým spôsbom je
možné kopírovať súbory z lokálneho systému do kontajnera, pričom ako
cieľový súbor zadáme
<kontajner>:<umiestnenie>
.
Poznámka
Na vytvorenie exportu databázy nie je nutné pripájať sa do kontajnera
a dodatočne súbor z kontajnera kopírovať. Namiesto toho môžeme vykonať
export priamo z lokálneho systému pomocou
docker container exec
príkazu takto:
$ docker container exec iot-db mysqldump --password=<nase-root-heslo> --databases wordpressdb > dump.sql
Ak by sme o databázový kontajner teraz prišli, môžeme vytvoriť nový
kontajner a importovať náš súbor dump.sql
.
Task
Zdieľajte SQL súbor s novým databázovým kontajnerom pri jeho
vytvorení zdieľaním úložiska prepínačom --volume
tak, aby
sa automaticky inicializovala databáza.
Obraz mysql
pri prvotnom spúšťaní automaticky spúšťa
všetky skripty s príponami .sh
, .sql
a
.sql.gz
, ktoré sa nachádzajú v priečinku
/docker-entrypoint-initdb.d
kontajnera. Obsah tohto
priečinka môžeme zdieľať s lokálnym systémom pomocou prepínača
--volume
.
Predtým však odstránime náš starý databázový kontajner príkazom:
$ docker container rm --force iot-db
Teraz spustíme nový databázový kontajner, avšak tentokrát mu budeme
zdieľať náš dump.sql
súbor, aby vykonal automatický import
databázy.
Súbor dump.sql
budeme zdieľať prepínačom
--volume
, ktorého argumentom je
<absolutna_cesta_lokálneho_súboru>:<cesta_súboru_kontajnera>
.
Treba si však uvedomiť, že takéto zdieľanie nahradí súbory v kontajneri
s rovnakou cestou bez varovania.
$ docker container run --name iot-db -e MYSQL_ROOT_PASSWORD=iot-secret -e MYSQL_DATABASE=wordpressdb --network iot-network --volume ~/dump.sql:/docker-entrypoint-initdb.d/dump.sql --detach mysql:5.7
Po chvíli sa náš databázový kontajner spustí a na našej Wordpress stránke uvidíme všetky články, ktoré sme mali predtým vytvorené.
Task
Zabezpečte perzistenciu obsahu Wordpress-ového pracovného
priečinka pomocou pomenovaného Docker úložiska
wordpress-volume
.
Ak nechceme v lokálnom systéme ukladať súbory, ale napriek tomu
chceme, aby súbory kontajnerov boli perzistentné (a nestratili sa, keď
kontajner odstránime), môžeme vytvoriť pomenované Docker
úložisko (volume). Toto úložisko spravuje
Docker a môžeme ho použiť aj na zdieľanie súborov medzi
kontajnermi. V našej situácii nám však stačí, ak sa nám uložia dáta z
pracovného priečinka Wordpress-u (/var/www/html
),
aby sme pri vytváraní nového kontajnera mali všetko nastavené.
Nové úložisko vytvoríme príkazom docker volume create
podobne ako v prípade siete:
$ docker volume create wordpress-volume
wordpress-volume
Kontajner Wordpress-u môžeme odstrániť a spustiť nový
kontajner z obrazu, tentokrát s pridaním prepínača
--volume
:
docker container run --name iot-wordpress --publish 8080:80 --network iot-network --volume wordpress-volume:/var/www/html -d wordpress
Znovu otvoríme stránku localhost:8080 a nastavíme databázu pre
náš Wordpress. Tentokrát sa však všetko nastavenie uloží v
našom Docker úložisku, takže najbližšie, keď odstránime tento
kontajner a vytvoríme nový s použítím rovnakého úložiska
(wordpress-volume
), tak jazyk ani pripojenie k databáze už
nebude potrebné nastavovať.
Introduction to Docker Compose
V poslednom kroku si ukážeme, ako obidva kontajnery spustiť jediným
príkazom a použitím jediného súboru docker-compose.yml
.
Task
Vytvorte Docker Compose súbor s názvom
docker-compose.yml
, zadefinujte v ňom služby, s ktorými sme
na tomto cvičení pracovali a kompozíciu spustťe príkazom
docker-compose up
.
Docker Compose je technológia rozširujúca Docker,
ktorá zjednodušuje spúšťanie skupiny kontajnerov. Vyžaduje jeden súbor s
názvom docker-compose.yml
, v ktorom sú zadefinované
nastavenia pre všetky potrebné kontajnery (služby). Docker
Compose automaticky vytvorí sieťové prepojenie medzi týmito
kontajnermi. Ukážku takej Docker Compose konfigurácie môžeme
vidieť na refernenčnej stránke Wordpress obrazu.
V našom prípade môže súbor docker-compose.yml
vyzerať
takto:
version: '3.1'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: iot-secret
WORDPRESS_DB_NAME: wordpressdb
volumes:
- wordpress-volume:/var/www/html
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: wordpressdb
MYSQL_ROOT_PASSWORD: iot-secret
volumes:
- ~/dump.sql:/docker-entrypoint-initdb.d/dump.sql
volumes:
wordpress-volume:
V priečinku, v ktorom sa nachádza tento súbor môžeme celú kompozíciu spustiť jediným príkazom:
$ docker-compose up