Docker 101
alebo nie príliš stručný úvod do technológie Docker
About
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.
Goals
- zoznámiť sa so základmi používania nástroja
docker
- porozumieť rozdielu medzi obrazom a kontajnerom
Content
Check your installation!
Ešte predtým, ako sa pustíme do práce, overíme úspešnosť inštalácie.
Zoznámime sa teda minimálne s príkazmi info
a
version
.
Task
Overte verziu vašej Docker-ovskej inštalácie.
Na zistenie verzie Docker-a 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.3, build 48d30b5
Môžeme spustiť príkaz
docker
s príkazomversion
, ktorý zobrazí verziu ako klienta, tak aj servera:$ docker version Client: Docker Engine - Community Version: 20.10.3 API version: 1.41 Go version: go1.13.15 Git commit: 48d30b5 Built: Fri Jan 29 14:33:58 2021 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.3 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 46229ca Built: Fri Jan 29 14:31:38 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.3 GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b runc: Version: 1.0.0-rc92 GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff docker-init: Version: 0.19.0 GitCommit: de40ad0
Môžeme spustiť príkaz
docker
s príkazominfo
, ktorý zobrazí informácie 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.
Starting and Stopping Containers
V tomto kroku sa pozrieme na to, ako v kontajneri spustiť (nie len) webový server Nginx. Okrem toho sa pozrieme aj bližšie na to, čo sa deje na pozadí, s čím nám pomôže pohľad na architektúru Docker-a.
Task
Spustite webový server Nginx z obrazu nginx
a
presmerujte jeho port 80
na port 8080
.
Webový server spustíme príkazom:
$ docker container run --publish 8080:80 nginx
Pozrime sa však na to, čo sa deje na pozadí:
- Docker Client vytvoril požiadavku na spustenie
kontajneru z obrazu
nginx
- Docker Engine sa najprv pozerie, či nemá obraz s
názvom
nginx
dostupný lokálne Keďže ho nemá, tak stiahne (pull
) najnovšínginx
obraz z Registry. - Po stiahnutí obrazu (spolu so všetkými závislosťami, resp. vrstvami)
spustí Docker Engine nový kontajner z obrazu
nginx
. - Tým sa na pozadí spustí príslušný proces, ktorým sa spustí webový
server/proxy
nginx
.
Poznámka
Voľba --publish
zabezpečí, že požiadavky smerujúce na
lokálny port 8080
budú presmerované na port 80
spusteného kontajnera.
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
Otestujte funkčnosť spusteného webového servera v kontajneri.
Ak ste postupovali správne, otvorte prehliadač na adrese http://localhost:8080.
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
Task
Vypíšte si zoznam 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
6c864671b00e nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp laughing_kare
Príkaz ls
zobrazí len práve spustené kontajnery. Ak ho
však spustíme s prepínačom -a
, uvidíme všetky kontajnery
(aj tie, ktoré sa už skončili):
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c864671b00e nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp laughing_kare
d4e455680508 bletvaska/hello-world "/entrypoint.sh /bin…" 2 hours ago Exited (0) 2 hours ago eloquent_allen
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 nginx
mirek 322628 0.0 0.7 1135704 56148 pts/1 Sl+ 21:06 0:00 docker container run --publish 8080:80 nginx
root 322785 0.0 0.0 10640 4924 ? Ss 21:07 0:00 nginx: master process nginx -g daemon off;
101 322848 0.0 0.0 11036 2344 ? S 21:07 0:00 nginx: worker process
Task
Zastavte spustený kontajner s webovým serverom Nginx.
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 6c864671b00e
Poznámka
Názov kontajneru sa nachádza v stĺpci NAMES
. Ak
kontajner nepomenujeme pri spúšťaní, je pomenovaný automaticky zložením
prídavného mena s menom nejakej IT osobnosti. Uviesť názov spúšťaného
kontajnera je možné pomocou voľby
--name YOUR_NAME_FOR_CONTAINER
, napr:
$ docker container run --publish 8080:80 --detach --name webserver nginx
Task
Odstráňte zastavený kontajner webového servera.
Kontajner sme zastavili, čím sme zmenili jeho stav z
Running
na Exited
. Ukončený kontajner však
vieme opäť spustiť príkazom start
:
$ docker container stop 6c864671b00e
Ak však chceme ukončený kontajner naozaj odstrániť, použijeme príkaz
rm
:
$ docker container rm 6c864671b00e
Ak je kontajner stále spustený, odstránite ho príkazom
rm
s prepínačom -f
.
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.