Docker – návod pro začátečníky

Poslední aktualizace 22. 4. 2024


Úvod

Návod vysvětluje první kroky při práci s Dockerem jako např. spouštění images nebo základní operace s kontejnery.

Instalace Dockeru

Instalace Dockeru není složitá. Z oficiálních stránek Dockeru si nainstalujte verzi vhodnou pro váš operační systém a postupujte dle instrukcí.

Po instalaci otevřete okno a napište: docker info

Pokud se proces instalace zdařil, uvidíte výpis informací o vaší instalaci Dockeru podobný jako v následujícím příkladu:

docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.12.0-ce
Storage Driver: overlay2
...

Otestujte Docker instalaci

Otestujete, jak instalace funguje spuštěním jednoduchého Docker image hello-world.

Docker nejprve hledá image v lokálním systému, když ho nenajde, stáhne ho z Docker Hub.

Hello-world zobrazí zprávu, že vše funguje:

docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7
Status: Downloaded newer image for hello-world:latest

Následně spusťte příkaz docker ps –a a uvidíte všechny kontejnery spuštěné v systému.

Vyhledání image v Docker Hub

Docker jsme úspěšně spustili a můžeme stáhnout některý z již existujících image z Docker Hub. Je nutné se přihlásit k účtu a ve vyhledávacím poli zadat jméno aplikace, pro kterou si přejete najít image. Jako příklad zkusíme spustit Nginx web server.

Screen Docker

Když rozkliknete oficiální Nginx image, zobrazí se detaily o image jako přehled verzí image a linky na korespondující Dockerfiles. Dockerfile je textový dokument s příkazy, které můžete využít k manuálnímu postavení Docker image. Docker může images stavět automaticky přečtením instrukcí v Dockerfile.

nginx screen

Spuštění image v kontejneru

Pokud máte vybraný image, můžete s ním pracovat dvěma způsoby:

  • Stáhnout image příkazem docker pull. Image se stáhne do lokálního úložiště a uvidíme ho na svém image listu.
  • Spustit image příkazem docker run. Pokud není image přístupné lokálně, dojde k jeho stažení a následnému spuštění.

Docker run je pro nás v tuto chvíli rychlejší možností, ale v jiných případech může být výhodnější image nejprve stáhnout.

Vybraný Nginx image spustíme následujícím příkazem:

$ docker run -it -p 80:80 nginx

Software nejprve ověří, zda už není image dostupný v počítači, pokud v něm není, stahuje z Docker Hub. Stahování z Docker Hub tak vlastně probíhá automaticky a není nutné nic dalšího provádět.

  • docker run:  umožňuje jakýkoli image spustit v kontejneru
  • -it: kontejner je v interaktivním módu, neběží v pozadí
  • -p 80:80: Bez tohoto parametru není možné komunikovat s Nginx serverem. Parametr mapuje port konetejneru 80 s portem hostujícího počítače 80. Images totiž mají předdefinované porty pro externí svět – náš Nginx kontejner má porty 80 a 443 pro http a https požadavky. Aby byla daná aplikace přístupná z vašeho přístroje, musíme port aplikace propojit s portem počítače. Toho dosáhneme parametrem –p host-port:container-port, v našem případě –p 80:8. Následně budeme schopní zaslat HTTP požadavek serveru z našeho lokálního přístroje otevřením URL http://localhost:80.

Otevřete internetový prohlížeč a na adrese http://localhost:80 by na vás mělo čekat následující sdělení, které ukazuje, že se spuštění kontejneru zdařilo.

Welcome to nginx

Pokud chcete jen stáhnout image bez toho, aby došlo k jeho spuštění v kontejneru, použijte příkaz:

docker pull nginx

Následné vytváření kontejnerů z již stažených images je rychlejší.

Práce s kontejnery

S vytvořeným kontejnerem můžete dále pracovat různými způsoby – můžete ho spustit, zastavit nebo restartovat. Nemůžete však měnit kontejner samotný, např. mapování portu. Jakmile je kontejner vytvořený, nelze jeho konfiguraci měnit. Jedinou možností je zastavení kontejneru a vytvoření nového ze stejného image s jinými parametry.

Následujícími příkazy můžete provádět operace s kontejnery a images:

  • docker ps – dává přehled o všech běžících kontejnerech
  • docker ps –a – informuje o všech kontejnerech, i těch zastavených.
  • docker stop [container name] – zastavuje kontejner
  • docker start [container name] – spouští kontejner
  • docker rm [container name] – maže kontejner. (Je možné mazat jen zastavené kontejnery. Smazáním kontejneru se nevymaže jeho image.)
  • docker inspect [container name] – ukáže detaily o kontejneru
  • docker logs [container name] – zobrazuje logy kontejneru
  • docker images – ověřuje dostupnost image
  • docker images rm [IMAGE_ID] – maže image

Vytvoření vlastního Docker image

Zatím jsme používali již vytvořený image, Docker ale umožňuje jednoduše vytvářet vlastní images nebo upravovat existující. Pro vytvoření vlastního image musíme přidat soubor Dockerfile do projektu. Jedná se o prostý textový soubor, proto použijeme textový editor k přidání vlastních stavebních kroků do image.

Je důležité si uvědomit, že každý stavební krok v Dockerfile vytvoří novou vrstvu v image. Pokud dojde ke změně v jedné vrstvě, image provede změny ve všech vrstvách následujících, vrstvy pod změněnou vrstvou zůstanou nezměněné. Tomu se říká layer caching.

Budeme vycházet z předchozího příkladu a postavíme nový image na základě oficiálního Nginx image.

Otevřete Dockerfile v textovém editoru. Musíte začít specifikováním image, ze kterého budete vytvářet váš vlastní image – k tomu použijte příkaz FROM.

FROM nginx
COPY html /usr/share/nginx/html

Použitím příkazu FROM požadujeme, aby byl nový image vytvořený  na základě nginx image.

Příkaz COPY zkopíruje obsah z html adresáře hostujícího systému do adresáře /usr/share/nginx/html kontejneru, který bude vytvořen.

Dále vytvoříme image příkazem:

$ docker build -t mynginx .

Tento příkaz vytváří nový image se jménem mynginx. Použili jsme dva argumenty:

  • -t mynginx – dává Dockeru označení image
  • tečka („.“) říká Dockeru, aby hledal Dockerfile v současném pracovním adresáři

Image máme vytvořený a můžeme vytvořit nový kontejner příkazem docker run.

$ docker run --name mynginx -p 80:80 -d mynginx

Docker Compose

Správu většího počtu kontejnerů usnadňuje Docker Compose. Nástroj je výchozí součástí Docker Desktop. Pracuje na základě jednoho konfiguračního souboru YAML, který obsahuje specifikaci pro jednotlivé služby, sítě a objekty úložiště aplikace. Konfiguraci definovanou v tomto souboru lze následně spravovat jako jednotnou aplikaci.

Pro vytvoření Docker Compose konfigurace založíme soubor docker-compose.yml ve stejném adresáři, kde máme stávající projekt. V následujícím příkladu yaml souboru opět využijeme Nginx, tentokrát v kombinaci s PostgreSQL.

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  database:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_DB: mydatabase
volumes:
  data:
    driver: local
networks:
  backend:
    driver: bridge

V modelovém příkladu verze určuje verzi syntaxe Docker Compose, kterou daný soubor používá. Řádek services uvádí služby, které mají být součástí definované aplikace, tedy web a database. Image u obou služeb specifikuje, jaký Docker image služby chceme použít. V tomto případě označení „latest“ odkazuje na nejnovější verzi images obou služeb dostupných v Docker Hub. Čísla portů jsou stejná jako v předchozích případech – první číslo označuje port hostitelského serveru, druhé pak port kontejneru. Část environment poskytuje prostor pro definici proměnných prostředí – heslo pro přístup do databáze a název databáze.

Součástí souboru mohou být i volumes a networks. Volumes označuje objekty úložiště, fyzické části diskového prostoru, které hostitelský server sdílí s kontejnery. Networks definují pravidla pro síťovou komunikaci mezi hostitelským serverem a kontejnerem. Na tomto místě lze nastavit segmenty sítě. Společné segmenty my-shared-network: {} zajistí vzájemnou zjistitelnost jednotlivých kontejnerů. Pro testovací části aplikace je možné nastavit i soukromý segment my-private-network: {}.

Poznámka: Při použití konkrétních verzí images nebo konkrétní konfigurace je potřeba pravidelně aktualizovat soubory docker-compose.yml a images tak, aby reflektovaly aktuální potřeby a bezpečnostní aktualizace.

Pro větší stabilitu doporučujeme definovat konkrétní verzi image (např. nginx:latest). Pokud se rozhodnete v YAML souboru neuvádět verzi image, zadejte před další prací se souborem ještě příkaz docker-compose pull. Použitím tohoto příkazu se stáhnou aktuální verze images.

Tip: Pro automatický dohled a případně i updatování images kontejnerizovaných aplikací můžete využít Watchtower (k dispozici na github).

Před spuštěním aplikací definovaných v docker-compose.yml doporučujeme konfiguraci nejprve otestovat:

docker-compose config

Pokud je vše v pořádku, je soubor připraven k použití. Následujícím příkazem se na pozadí spustí služby definované v konfiguraci:

docker-compose up -d

Základní práce s Docker Compose

  • Zastavení aplikace: docker-compose down
  • Zobrazení stavu kontejnerů: docker-compose ps
  • Sledování logů aplikace: docker-compose logs
  • Zobrazení procesů běžících v kontejnerech: docker-compose top
  • Restartování služeb nebo vybrané služby: docker-compose restart
  • Vytvoření nebo obnova imagů definovaných v souboru: docker-compose build
  • Pozastavení a opětovné spuštění služeb: docker-compose pause, docker-compose unpause
  • Spuštění příkazu uvnitř běžícího kontejneru (např. služba web Nginx): docker-compose exec web bash
Poznámka: Docker Compose V2 je na rozdíl o Compose V1 integrován do Docker CLI a využívá syntax docker compose, tzn. spojovník „-“ nahrazuje mezerou. Více k tomuto tématu viz docker-compose vs docker compose.

Máte nejasnosti nebo nápad na zlepšení článku?

Napište nám