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.
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.
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.
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 kontejnerechdocker ps –a
– informuje o všech kontejnerech, i těch zastavených.docker stop [container name]
– zastavuje kontejnerdocker start [container name]
– spouští kontejnerdocker 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 kontejnerudocker logs [container name]
– zobrazuje logy kontejnerudocker images
– ověřuje dostupnost imagedocker 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: {}.
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.
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
docker compose
, tzn. spojovník „-“ nahrazuje mezerou. Více k tomuto tématu viz docker-compose vs docker compose.