Docker 101

alebo nie príliš stručný úvod do technológie Docker

Videá pre cvičenie

Motivácia

IoT riešenia sú nasadzované do distribuovaného prostredia, v ktorom sa aplikácie najčastejšie spúšťajú vo forme kontajnerov. Na tomto cvičení si predstavíme základy používania nástroja Docker.

Ciele

  • zoznámiť sa so základmi používania nástroja docker
  • porozumieť rozdielu medzi obrazom a kontajnerom

Postup

Overte svoju inštaláciu!

Ešte predtým, ako sa pustíme do práce, overíme úspešnosť inštalácie. Zobrazíme si verziu nástroja docker a spustíme prvý kontajner.

Task

Overte verziu vašej Docker inštalácie.

Zistiť verziu nainštalovaného nástroja docker máme niekoľko spôsobov:

  • Môžeme spustiť príkaz docker s prepínačom --version, ktorý zobrazí verziu klienta a skončí:

    $ docker --version
    Docker version 20.10.12, build e91ed57
  • Môžeme spustiť príkaz docker s príkazom version, ktorý zobrazí verziu ako klienta, tak aj servera, s ktorým klient komunikuje:

    $ docker version
    Client: Docker Engine - Community
      Version:           20.10.12
      API version:       1.41
      Go version:        go1.16.12
      Git commit:        e91ed57
      Built:             Mon Dec 13 11:46:03 2021
      OS/Arch:           linux/amd64
      Context:           default
      Experimental:      true
    
    Server: Docker Engine - Community
      Engine:
      Version:          20.10.12
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.16.12
      Git commit:       459d0df
      Built:            Mon Dec 13 11:43:48 2021
      OS/Arch:          linux/amd64
      Experimental:     false
      containerd:
      Version:          1.4.12
      GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
      runc:
      Version:          1.0.2
      GitCommit:        v1.0.2-0-g52b36a2
      docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
  • Môžeme spustiť príkaz docker s príkazom info, ktorý zobrazí informácie aj o celom systéme:

    $ docker info
    # výpis príkazu je dlhší...

Task

Spustite kontajner z obrazu bletvaska/hello-world.

Kontajner z obrazu spustíme príkazom container run:

$ docker container run bletvaska/hello-world
Hello from Docker Container!
============================

                       ##         .
                 ## ## ##        ==
              ## ## ## ## ##    ===
          /"""""""""""""""""\___/ ===
     ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
          \______ o           __/
            \    \         __/
             \____\_______/


Hostname: d4e455680508
      IP: 172.17.0.3
    Time: 18:37:48

Tentokrát sa kontajner rovno spustil, nakoľko obraz bol už stiahnutý (pri spustení po inštalácii).

Spúšťanie a zastavovanie kontajnerov

V tomto kroku si ukážeme základy práce s kontajnermi. Ukážeme si, ako sa kontajner spúšťa, zastavuje, ako je možné spustiť kontajner na pozadí, a ako ho nakoniec odstrániť. Popri tom sa bližšie pozrieme aj na architektúru Docker-a.

Pre naše experimenty budeme používať Object Storage MinIO, ktorý je kompatibilný so službou Amazon S3. Obecne slúži na uchovávanie neštruktúrovaných dát, akými sú napr. obrázky, fotky alebo videá, resp. obecne súbory. Jeho krátke predstavenie si môžete pozrieť v nasledujúcom videu.

Task

Spustite object storage MinIO z obrazu bitnami/minio.

Na základe informácií získaných na stránke obrazu spustím príkaz:

$ docker container run --name minio bitnami/minio:latest

Tým dôjde k stiahnutiu obrazu na lokálny systém (resp. do priestoru Docker Engine-u) a po jeho stiahnutí sa kontajner spustí.

Docker Architecture

Pozrime sa však na to, čo všetko sa udeje na pozadí:

  1. Docker Client vytvoril požiadavku na spustenie kontajneru z obrazu bitnami/minio a túto požiadavku poslal Docker Engine-u

  2. Docker Engine sa najprv pozrie, či nemá obraz s názvom bitnami/minio dostupný lokálne. A keďže ho nemá, tak najskôr stiahne (pull) najnovšiu verziu tohto obrazu z registra.

  3. Po stiahnutí obrazu (spolu so všetkými závislosťami, resp. vrstvami) z neho Docker Engine vytvorí (resp. spustí) nový kontajner.

  4. Tým sa na pozadí spustí príslušný proces, ktorým sa spustí aplikácia MinIO.

Task

Otestujte funkčnosť spusteného kontajnera vypísaním aktuálne spustených kontajnerov.

Zoznam spustených kontajnerov zobrazíte príkazom container ls:

$ docker container ls
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS           NAMES
13e126e6f965   bitnami/minio:latest   "/opt/bitnami/script…"   23 minutes ago   Up 23 minutes   9000-9001/tcp   minio

Task

Zastavte spustený kontajner s aplikáciou MinIO.

Zastaviť spustený kontajner môžeme dvoma spôsobmi:

  1. Tým, že je kontajner spustený na popredí, stačí stlačiť klávesovú skratku CTRL+C, čím bežiacemu procesu pošleme signál INTERRUPT (signál číslo 2). A pokiaľ vie naň aplikácia zareagovať, tak sa príslušný proces ukončí.

  2. Spustený kontajner je možné zastaviť príkazom container stop s uvedením jeho identifikátora (stĺpec CONTAINER ID) alebo názvu (stĺpec NAMES):

    $ docker container stop minio

Úspešné zastavenie si vieme overiť príkazom container ls, ktorý vypíše zoznam spustených kontajnerov. Kontajner s názvom minio v ňom už nebude.

$ docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Task

Opätovne spustite zastavený kontajner.

Aj keď kontajner nevidíme v zozname spustených kontajnerov, uvidíme ho pri použití prepínača -a. Pomocou tohto prepínača zobrazíme všetky kontajnery, nie len tie spustené. Výstup príkazu bude vyzerať takto:

$ docker container ls -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                      PORTS     NAMES
13e126e6f965   bitnami/minio:latest   "/opt/bitnami/script…"   30 minutes ago   Exited (0) 40 seconds ago             minio

Kontajner je v stave Exited. To znamená, že jeho aktuálny stav nie je stratený, pretože zastavený kontajner sa dá znovu spustiť. To je možné dosiahnuť príkazom container start.

$ docker container start minio
minio

Ak si teraz zobrazíme zoznam spustených kontajnerov, uvidíme v ňom aj kontajner s názvom minio, ktorého stav bude Running, resp. Up vzhľadom na výpis príkazu.

$ docker container ls
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS              PORTS          NAMES
13e126e6f965   bitnami/minio:latest   "/opt/bitnami/script…"   32 minutes ago   Up About a minute   9000-9001/tcp  minio

Task

Zastavte a odstráňte spustený kontajner minio.

Kontajner sa po použití príkazu start spustil na pozadí, takže tentokrát sa už nebude dať zastaviť stlačením klávesovej skratky CTRL+C, ale len príkazom stop.

$ docker container stop minio

Ak však kontajner chceme úplne odstrániť, použijeme príkaz container rm:

$ docker container rm minio
minio

Task

Overte, že bol kontajner naozaj úspešne odstránený.

To, že bol kontajner naozaj odstránený, môžeme príkazom container ls -a:

$ docker container ls -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Prístup k webovému rozhraniu MinIO

Úložisko objektov MinIO poskytuje svojim používateľom aj webové používateľské rozhranie. Dostaneme sa k nemu jednoducho - stačí, ak spustíme MinIO v kontajneri a otvoríme prehliadač na adrese http://localhost:9000.

V tomto kroku zabezpečíme, aby sme sa vedeli dostať pomocou prehliadača k webovému používateľskému rozhraniu aplikácie MinIO.

Task

Zverejnite porty 9000 a 9001 kontajnera minio pre poskytnutie používateľského rozhrania.

Ak chcem, aby som mal prístup k portom, cez ktoré je možné s aplikáciou v kontajneri komunikovať, musím to explicitne zadať pri jeho spúšťaní pomocou voľby --publish. Aplikácia MinIO komunikuje na dvoch portoch:

  • na porte 9000, a
  • na porte 9001

Pri spúšťaní kontajnera teda potrebujem zverejniť oba tieto porty:

$ docker container run --rm \
  --name minio \
  --publish 9000:9000 \
  --publish 9001:9001 \
  bitnami/minio

Task

Overte výsledok svojej práce.

Ak ste postupovali správne, otvorte prehliadač na adrese http://localhost:9000.

MinIO UI

Prihlasovacie údaje do UI

Používateľské rozhranie máme k dispozícii, ale na to, aby sme ho vedeli používať, potrebujeme poznať ako prihlasovacie meno, tak aj heslo. Aké sú teda predvolené hodnoty pre meno a heslo? A ako ich je možné zmeniť bez toho, aby sme museli používať samotné používateľské rozhranie?

Task

Prihláste sa do používateľského rozhrania pomocou predvoleného prihlasovacieho mena a hesla.

Predvolené prihlasovacie meno a heslo sa zvyknú nachádzať uvedené na domovskej stránke príslušného obrazu. V tomto prípade ich tam však nenájdete a budete musieť hľadať v skriptoch, ktoré sa používajú na zostavenie obrazu. Ak budete úspešní, nájdete v nich prihlasovacie meno minio a k nemu zodpovedajúce heslo miniosecret.

MinIO Console

Task

Pomocou premenných prostredia MINIO_ROOT_USER a MINIO_ROOT_PASSWORD nastavte prihlasovacie meno a heslo do aplikácie MinIO.

Vlastné premenné prostredia vieme kontajneru nastaviť pomocou voľby --env. Ak napríklad chceme nastaviť premennú MESSAGE a priradiť jej hodnotu "hello world", tak to (spolu s overením) zapíšeme takto:

$ docker container run --rm \
  --env MESSAGE="hello world" \
  bitnami/minio env

MESSAGE=hello world
HOSTNAME=841f88c10914
PWD=/opt/bitnami/minio-client
OS_FLAVOUR=debian-10
HOME=/
BITNAMI_IMAGE_VERSION=2022.2.16-debian-10-r0
SHLVL=0
BITNAMI_APP_NAME=minio
OS_NAME=linux
PATH=/opt/bitnami/common/bin:/opt/bitnami/minio-client/bin:/opt/bitnami/minio/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
OS_ARCH=amd64

Príkaz, pomocou ktorého spustíme aplikáciu MinIO a nastavíme v nej premenné prostredia pre nastavenie používateľského mena a hesla, bude vyzerať nasledovne:

$ docker container run --rm \
  --name minio \
  --publish 9000:9000 \
  --publish 9001:9001 \
  --env MINIO_ROOT_USER=jano \
  --env MINIO_ROOT_PASSWORD=jahodka123 \
  bitnami/minio

Task

Overte správnosť vašich nastavení.

Pre overenie výsledku otvorte prehliadač na adrese http://localhost:9000 a zadajte svoje prihlasovacie údaje. Ak ste postupovali správne, po potvrdení prihlasovacích údajov sa vám zobrazí webové rozhranie aplikácie MinIO.

Zabezpečenie perzistencie

Ako sme hovorili na začiatku, aplikácia MinIO slúži ako úložisko objektov, resp. obecne súborov. Aby táto funkcionalita bola dosiahnutá, potrebujete si vytvoriť tzv. bucket, do ktorého následne budete môcť súbory nahrávať. Problém však nastane, keď kontajner reštartujete - vo vnútri sa už nebude nachádzať ani vami vytvorený bucket ani žiadne súbory, ktoré ste do neho nahrali. Ako zabezpečiť, aby tieto údaje prežili reštart kontajnera?

Task

Vo webovom prostredí vytvorte bucket s názvom files a nahrajte do neho niekoľko ľubovoľných súborov.

V kontexte služby MinIO a obecne Amazon S3 predstavuje termín Bucket priečinok, do ktorého bude možné ukladať objekty (súbory).

Task

Reštartujte kontajner a overte, či sa dostanete ako k bucket-u, tak aj k nahratým súborom.

Ak ste postupovali správne, neuvidíte ani vytvorený bucket a ani súbory v ňom.

Task

Znova spustite službu MinIO a okrem doterajších nastavení zabezpečte, aby sa tiež automaticky vytvorili bucket-y images, documents, movies a files, a rovnako zabezpečte trvácnosť (perzistenciu) uložených objektov v nich.

Trvácnosť zabezpečíme pripojením tzv. pomenovaného zväzku (z angl. named volume) ku priečinku v kontajneri, v ktorom sa budú súbory ukladať. To, ktorý priečinok je potrebné takto pripojiť, sa dozviete v dokumentácii príslušného obrazu. V prípade obrazu bitnami/minio služby MinIO sa jedná o priečinok /bitnami/minio/data.

Trvácnosť dát zabezpečíme nasledovným príkazom:

$ docker container run --rm \
  --name minio \
  --publish 9000:9000 \
  --publish 9001:9001 \
  --env MINIO_ROOT_USER=jano \
  --env MINIO_ROOT_PASSWORD=jahodka123 \
  --env MINIO_DEFAULT_BUCKETS='images,documents,movies,files' \
  --volume minio_data:/bitnami/minio/data \
  bitnami/minio

Task

Reštartujte kontajner a overte, či sa dostanete ako k bucket-u, tak aj k nahratým súborom.

Ak ste postupovali správne, objekty (súbory) uložené do bucket-ov budú tentokrát zachované.

Ďalšie odkazy