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?

Wordpress nastavenie 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.

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.

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:/#

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>

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

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