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.
Poznámka
Pred príchodom na cvičenie si nezabudnite nainštalovať Docker pre svoj operačný systém. Využite na to tento návod. Kvôli kvalite pripojenia v učebniach odporúčame ešte doma stiahnuť aj obrazy používané na cvičení. Konkrétne:
$ docker image pull bletvaska/hello-world
$ docker image pull bitnami/minio
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íkazomversion
, 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íkazominfo
, 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).
Poznámka
Hlavne v starších zdrojoch sa môžete stretnúť s tým, že kontajner sa
spúšťa len pomocou príkazu run
takto:
$ docker run bletvaska/hello-world
Ako do Docker-u pribúdali nové vlastnosti a možnosti, začalo
sa stávať, že rovnaké príkazy by sa dali použiť na viacerých miestach.
Príkladom je príkaz inspect
, ktorý dokáže zobraziť príkazy
o jednotlivých Docker objektoch. Aby sa jednoducho odlíšilo, či
chce používateľ zobraziť napr. informácie o kontajneri alebo o obraze,
pred samotným príkazom sa uvedie typ Docker objektu. Preto aj
my budeme používať kvôli čitateľnosti dlhší spôsob zápisu.
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í.
Pozrime sa však na to, čo všetko sa udeje na pozadí:
Docker Client vytvoril požiadavku na spustenie kontajneru z obrazu
bitnami/minio
a túto požiadavku poslal Docker Engine-uDocker 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.Po stiahnutí obrazu (spolu so všetkými závislosťami, resp. vrstvami) z neho Docker Engine vytvorí (resp. spustí) nový kontajner.
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
Poznámka
V stĺpci NAMES
sa nachádza názov kontajnera. Ak
kontajner nepomenujeme pri spúšťaní, je pomenovaný automaticky zložením
prídavného mena s menom nejakej IT osobnosti. V našom prípade sme ho
spustili s menom minio
, ktoré sme zadali pri spúšťaní
pomocou voľby --name NAME
.
Poznámka
Obecne je kontajner len spusteným procesom v systéme s vlastnosťami
navyše. O tom sa môžete presvedčiť napríklad príkazom
ps
:
$ ps aux|grep minio
mirek 411718 0.0 0.2 1646576 46964 pts/5 Sl+ 18:48 0:00 docker run --name minio bitnami/minio:latest
1001 412060 0.1 0.6 883568 107552 ? Ssl 18:49 0:02 /opt/bitnami/minio/bin/minio server --certs-dir /certs --console-address :9001 --address :9000 /data
Task
Zastavte spustený kontajner s aplikáciou MinIO.
Zastaviť spustený kontajner môžeme dvoma spôsobmi:
Tým, že je kontajner spustený na popredí, stačí stlačiť klávesovú skratku
CTRL+C
, čím bežiacemu procesu pošleme signálINTERRUPT
(signál číslo2
). A pokiaľ vie naň aplikácia zareagovať, tak sa príslušný proces ukončí.Spustený kontajner je možné zastaviť príkazom
container stop
s uvedením jeho identifikátora (stĺpecCONTAINER ID
) alebo názvu (stĺpecNAMES
):$ 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
Poznámka
Je výhodné spúšťať kontajner rovno s prepínačom --rm
,
ktorý zabezpečí, že sa tento po skončení automaticky odstráni.
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
Poznámka
Ak by ste chceli vedieť, na ktorom porte aplikácia komunikuje, je
potrebné sa pozrieť do jej Dockerfile
súboru, z ktorého je
obraz zostavený a hľadať voľbu EXPOSE
. Viac o tom budeme
hovoriť neskôr, keď budeme vytvárať vlastné obrazy.
Task
Overte výsledok svojej práce.
Ak ste postupovali správne, otvorte prehliadač na adrese http://localhost:9000.
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
.
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
Poznámka
Ak pridáte ľubovoľný reťazec za názov kontajneru, bude tento
považovaný za príkaz a bude spustený. Keďže sme ako príkaz použili
env
, po spustení kontajnera sa vypíše zoznam premenných
prostredia a kontajner sa vypne.
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
Upozornenie
Heslo musí obsahovať min. 8 znakov! Ak bude heslo pozostávať z menšieho počtu znakov, MinIO sa nespustí.
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
- Home: Docker - domovská stránka nástroja Docker
- MinIO - domovská stránka MinIO
- Docker CLI Cheatsheet - jeden z mnohých ťahákov pre Docker CLI
Poznámka
Webový server nebol spustený na pozadí, takže zostal spustený v termináli. Môžete v ňom vidieť jednotlivé logy webového servera.
Ak by ste chceli kontajner spustiť na pozadí, tak s voľbou
--detach
:
$ docker container run --publish 8080:80 --detach nginx