Skip to content

Latest commit

 

History

History
240 lines (173 loc) · 12.3 KB

docker.md

File metadata and controls

240 lines (173 loc) · 12.3 KB

Docker

!Štítky: {program}{kontejnery}{virtualizace} !OblíbenáZaklínadla: !ÚzkýRežim: zap

Úvod

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

Definice

  • 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

Zaklínadla: Docker

Práce s obrazy

# 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}

Práce s kontejnery

# 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čištění systému

# pročistit systém (po čase bývá nezbytné)
sudo docker system prune

Eskalace práv

# 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}"

Zaklínadla: Dockerfile

# 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}"]...

Parametry příkazů

docker run

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

Instalace na Ubuntu

*# *
sudo apt-get install docker.io

Ukázka

# 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

Tipy a zkušenosti

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

Další zdroje informací

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

Zákulisí kapitoly

V této verzi kapitoly chybí:

!KompaktníSeznam:

  • nic

Tato kapitola záměrně nepokrývá:

!KompaktníSeznam:

  • nic

!ÚzkýRežim: vyp