!Štítky: {program}{kontejnery}{virtualizace} !OblíbenáZaklínadla: !ÚzkýRežim: zap
Docker je nástroj pro odlehčenou virtualizaci formou takzvaných kontejnerů. Kontejner obsahuje vlastní podstrom procesů, který je izolovaný od zbytku systému (má vlastní souborový systém, konfiguraci, knihovny, démony, síťové rozhraní a IP adresu), ale sdílí s ním jádro a výpočetní prostředky. To umožňuje bezpečný a snadno přenositelný běh programů určených pro jiné distribuce (můžete např. na nejnovější Fedoře spouštět program ze staré verze Debianu apod.). Nevýhodou Dockeru je, že jeho používání vyžaduje oprávnění superuživatele a nepodporuje přímo spouštění grafických aplikací nebo přímý přístup k hardwaru (i barvy v terminálu je tam podtřeba zprovoznit). Nejčastěji se používá na provozování databází.
Použití Dockeru obecně probíhá tak, že napíšete vlastní Dockerfile, z něj sestavíte obraz a z tohoto obrazu pak vytváříte kontejnery, které spouštíte. Kontejner může běžet buď na popředí (v příkazové řádce), nebo na pozadí.
Tato verze kapitoly pokrývá pouze základy Dockeru; nezmiňuje se o nástoji „docker-compose“ a pokrývá jen malou část dostupných „docker“-příkazů. Neuvádí specializované repozitáře jako např. „mysql“.
- Kontejner je dočasné (ale perzistentní) částečně izolované prostředí pro spouštění programů.
- Obraz je neměnný, opakovaně použitelný výchozí stav kontejneru.
- Repozitář je soubor obrazů se společným označením (např. „ubuntu“ či „mysql“). Jednotlivé obrazy se pak identifikují pomocí tagu uvedeného za název repozitáře a dvojtečku (např. „ubuntu:18.04“). Není-li tag uveden, Docker automaticky doplní „latest“.
- Dockerfile je textový soubor s názvem „Dockerfile“, obsahující instrukce k vytvoření obrazu.
!ÚzkýRežim: vyp
# vytvořit obraz z Dockerfilu
// Pozor na tečku na konci příkazu, je povinná a bez ní příkaz skončí vypsáním nápovědy!
sudo docker build [-t {repozitář}[:{tag-pro-obraz}]] [--no-cache] .
# vypsat lokálně dostupné obrazy
sudo docker images
# smazat obraz (lokálně)
sudo docker rmi {obraz}...
# vyhledat vzdáleně dostupné repozitáře
// Uvedený příkaz má přednastavený limit 25 položek; parametrem lze počet zvýšit maximálně na 100.
sudo docker search [--limit=100] {text-k-vyhledání}
# vypsat všechny vzdáleně dostupné repozitáře
?
# vypsat vzdáleně dostupné obrazy z určitého repozitáře
?
*# přejmenovat obraz *
// Původní označení zůstane zachováno.
sudo docker tag {starý-repozitář}[:{starý-tag}] {nový-repozitář}[:{nový-označení-tag}]
sudo docker rmi {starý-repozitář}[:{starý-tag}]
# uložit obraz do souboru/načíst ze souboru
// Uložený obraz doporučuji komprimovat (je ve formátu tar); obsahuje všechny vrstvy potřebné pro rekonstrukci obrazu, takže ho lze načíst i na počítači bez připojení k internetu. Rovněž je to vhodný způsob, jak si obraz zálohovat.
sudo docker save -o {soubor} {obraz}
sudo docker load -i {soubor}
# uložit obraz na standardní výstup/načíst ze standardního vstupu
sudo docker save {obraz}
sudo docker load
# stáhnout vzdálený obraz k použití lokálně
// Tento příkaz obvykle není třeba používat, protože Docker chybějící obrazy stahuje automaticky, jakmile jsou potřeba.
sudo docker pull {obraz}
# vytvořit a spustit kontejer
sudo docker run [{parametry}] {obraz} [{náhradní příkaz a jeho parametry}]
# vypsat seznam kontejnerů (jen běžících/všech na daném počítači)
sudo docker ps
sudo docker ps -a
# zastavit kontejner (normálně/násilně)
sudo docker stop {kontejner}
sudo docker kill {kontejner}
# znovu spustit zastavený kontejner
sudo docker start {kontejner}
# smazat kontejner (jen zastavený/i běžící)
sudo docker rm {kontejner}
sudo docker rm -f {kontejner}
# přejmenovat kontejner
sudo docker rename {kontejner} {nové-jméno}
# spustit nový interpret příkazové řádky v již běžícím kontejneru (obecně/konkrétně)
sudo exec -it {kontejner} {interpret}
sudo exec -it ef95f2 bash
# kopírování souborů z kontejneru/do kontejneru
sudo docker cp {kontejner}:{/cesta/v/kontejneru} {cíl/mimo}
sudo docker cp {zdroj/mimo/kontejner} {kontejner}:{/cíl/v/kontejneru}
# vytvořit kontejner bez spuštění
sudo docker create [{parametry}] {obraz}
# pročistit systém (po čase bývá nezbytné)
sudo docker system prune
# přečtení souboru, který nemáte právo číst
sudo docker --rm -it -v "$(pwd):/root" ubuntu cat "/root/{název souboru}"
# přepsání souboru, do kterého nemáte právo zapisovat
sudo docker --rm -it -v "$(pwd):/root" ubuntu bash -c "cat > '/root/{název souboru}'"
# přivlastnění si cizího souboru
sudo docker --rm -it -v "$(pwd):/root" ubuntu chown $UID "/root/{název souboru}"
# komentář
# {komentář do konce řádku}
# načíst existující obraz a použít ji jako základ pro nový
FROM {obraz}
# spustit příkaz
// Pozor, každý příkaz se spouští v nové instanci příkazovém intepretu „/bin/sh“!
RUN {příkaz}
# zkopírovat soubory a adresáře z kontextu sestavení do kontejneru
// Kontext sestavení (build context) je zvláštní oblast, kam se při spuštění příkazu „docker build“ rekurzivně zkopíruje veškerý obsah aktuálního adresáře.
COPY {zdroj} [{další-zdroj}]... {cíl}
# vytvořit zadaný adresář a nastavit ho jako aktuální
// Cesta může být i relativní.
WORKDIR {cesta}
# nastavit výchozí proces kontejneru (obecně/konkrétně)
ENTRYPOINT ["{příkaz}"[, "{parametr}"]...]
ENTRYPOINT ["/bin/bash", "-e"]
# nastavit proměnné prostředí
ENV {proměnná}="{hodnota}" [{další_proměnná}="{její hodnota}"]...
*# *
sudo docker run [{parametry}] {obraz} [{náhradní příkaz a jeho parametry}]
- --rm :: Po ukončení hlavního procesu automaticky smaže kontejner.
- -it :: Spustí pro kontejner interaktivní terminál. (Opakem je -d, které spustí kontejner na pozadí.)
- -v {/adresář/venku}:{/adresář/v/kontejneru} :: Připojí adresář vnějšího počítače do kontejneru.
- -p {port-venku}:{port-v-kontejneru} :: Připojí síťový port vnějšího počítače do kontejneru.
- --name {jméno} :: Přidělí kontejneru jméno.
- --security-opt seccomp:unconfined :: Nevím přesně, co to dělá, ale může pomoci při problémech se zabezpečeným spojením z kontejneru.
- -w {/adresář/v/kontejneru} :: Nastaví aktuální adresář v kontejneru.
- --network none :: Spuštěný kontejner nebude mít přístup k síti.
*# *
sudo apt-get install docker.io
# Dockerfile
FROM ubuntu:18.04
RUN apt-get update && apt-get upgrade -y && apt-get install -y mc vim
WORKDIR /root
ENTRYPOINT ["/usr/bin/mc"]
# sestavení a spuštění obrazu
sudo docker build -t midnight-commander .
sudo docker run --rm -it midnight-commander
!ÚzkýRežim: zap
- Přidání uživatele do skupiny „docker“, které některé stránky doporučují, mu umožňuje spouštět Docker bez sudo. Z bezpečnostního hlediska to ale není dobrý nápad, protože jak ukazuje podsekce zaklínadel „Eskalace práv“, spouštění Dockeru je prakticky ekvivalentem přidělení práv superuživatele. Proto raději příkaz „docker“ spouštím z bashe spuštěného pomocí „sudo bash“.
- Řádek v Dockerfilu lze rozdělit na víc řádků; v takovém případě se na konec každého kromě posledního přidá zpětné lomítko.
- Programy spouštěné při sestavování obrazu nesmí vyžadovat žádnou uživatelskou interakci. Pokud k tomu dojde, sestavení obrazu selže. (Proto je třeba u příkazu „apt-get install“ používat parametr „-y“.)
- V kontejnerech je možno zakládat nové uživatele a používat jejich účty, ale není to příliš běžné. Obvykle se všechny programy v kontejnerech spouští pod účtem uživatele root.
- Při sestavování obrazu příkazem „docker build“ se celý obsah lokálního adresáře včetně všech podadresářů nejprve zkopíruje do zvláštní oblasti zvané „build context“; příkaz Dockerfilu „COPY“ pak může čerpat pouze z této oblasti. Proto doporučuji mít aktuální adresář při sestavování obrazu co nejmenší a nikdy nespouštět „docker build“ např. z kořenového adresáře. (Ani domovský adresář uživatele není moc dobrý nápad.)
- Hash kontejneru se v kontejneru používá jako název počítače, takže se zobrazuje ve výzvě příkazového interpretu a lze ji snadno zjistit příkazem „hostname“.
- Ačkoliv by spuštění grafických aplikací v Dockeru mělo být také možné, vyžaduje specializovaný postup a nikdy jsem se o ně nepokoušel/a.
Pro sestavení Dockerfilu je asi nejlepším informačním zdrojem online „Referenční příručka pro Dockerfile“. Pro spouštění je pak vhodná „Oficiální referenční příručka“. Oba zdroje jsou bohužel v angličtině.
Pro základní přehled lze použít i příkazy:
*# *
docker --help
docker {příkaz} --help
- Praktický úvod do Docker a kontejnerů
- Video: Jakub Kratina – Docker 101
- Článek: Proč používat Docker
- [Stránka na Wikipedii](https://cs.wikipedia.org/wiki/Docker\_(software\))
- Video: Docker pro neznalé (Václav Pavlín)
- Video: Daniel Plakinger – Docker #2 (slovensky)
- Referenční příručka pro Dockerfile (anglicky)
- TL;DR stránka „docker“ (anglicky)
- Oficiální referenční příručka (anglicky)
- TL;DR stránka „docker images“ (anglicky)
- TL;DR stránka „docker container“ (anglicky)
- TL;DR stránka „docker-compose“ (anglicky)
- Oficiální stránka programu (anglicky)
- Balíček Bionic „docker.io“ (anglicky)
V této verzi kapitoly chybí:
!KompaktníSeznam:
- nic
Tato kapitola záměrně nepokrývá:
!KompaktníSeznam:
- nic
!ÚzkýRežim: vyp