Instalace a používání Dockeru na Windows

Víme, že vývoj aplikace je náročný proces, který má spoustu různých kroků a důležitých složek. Proto chceme soutěžícím nabídnout možnost se připravit na své budování webové aplikace s námi.

Co je to Docker

Znáte ten pocit, když doděláte program, odešlete ho, ale váš spolupracovník vám řekne, že mu nefunguje? Když řeknete ,,Na mém počítači to funguje" vám se smíchem odpoví, že lidem přece nebudete posílat váš počítač. Přesně tento problém řeší Docker.

Docker umožňuje vytvořit tzv. kontejner, což je, jednoduše řečeno, virtuální počítač, na kterém běží daný software. Kontejner se definuje v tzv. Dockerfile. Ten si koncový uživatel spustí a má stejné prostředí, jako vy. Usnadňuje to instalování závislostí, nastavování databází a pomáhá vyhýbat se problémům s nekompatibilními verzemi softwaru.

Pro účely odevzdávání do Tour de App si musíte vytvořit vlastní Dockerfile nebo použít předlohy, které najdete na našem profilu. Pomocí GitHub akce se vaše aplikace sestaví a odešle na náš odevzdávací server.

Pokud jste použili předlohu, můžete přeskočit na část OdevzdáváníDoporučuji ale i tak si Docker nainstalovat pro případné debugování problému při odevzdávání přes GitHub akci.

Instalace

WSL

Jelikož Docker je stavěný primárně pro Linux, je nutné aktivovat si WSL (Windows Subsystem for Linux) verze 2. Pomocí této funkce může Docker používat funkce z Linuxu bez nutnosti používání Linuxového systému. Minimální požadavky pro instalaci jsou Windows 10 verze minimálne 2004 nebo Windows 11.

Instalace lze provést jednoduše zadáním příkazu wsl --install do administrátorského příkazového řádku a následovat instrukce.

Docker

Docker instalátor lze stáhnout ze stránek Dockeru. Po otevření stačí normálně nainstalovat, důležité je nechat zaškrtnutou možnost Use WSL 2 instead of Hyper-V.

Nyní jste připravení používat Docker.

Screenshot Docker Desktopu

Vytvoření Docker kontejneru

Jak již bylo zmíněno, pokud chcete vytvořit Docker kontejner, musíš ho definovat skrz soubor Dockerfile.Zde se budu zabývat jen tím, co by mohlo být potřeba pro úspěšné "zkontejnerizování" a odevzdání aplikace, celou referenci souboru Dockerfile hledej v dokumentaci.

Já si zde zkusím zabalit svoji opravdu jednoduchou NodeJS webovou aplikaci do Docker kontejneru.

Snímek obrazovky ukazující kořenový adresář mého "projektu"

Zde, v kořenovém adresáři mého projektu, si vytvořím soubor s názvem Dockerfile (!žádná přípona .txt, pouze Dockerfile!). Ve výchozím stavu Windows skrývá přípony souborů, takže pokud soubor vytváříte skrz průzkumník souborů, buďto zvolte jiný program, nebo si v průzkumníku souborů v horním panelu v sekci Zobrazení povolte Přípony názvů souborů a příponu poté odstraňte.

Snímek obrazovky ukazující, kde najít možnost Přípony názvů souborů

Uvnitř Dockerfilu teď je třeba definovat

  1. Obraz, ze kterého bude aplikace běžet - buďto čistý operační systém nebo s předinstalovanými nástroji; ve výchozím se stahuje z repozitáře Docker Hub
  2. Argumenty - pokud potřebujete předat aplikaci nějaké tajné klíče, můžete tak učinit skrz argumenty
  3. Instalační příkazy - příkazy, které by se měly spustit pro úspěšné spuštění (např. instalace závislostí, sestavení atp.)
  4. Spuštění a zviditelnění portů - Docker pracuje na uzavřené síti, pokud chceme, aby šla aplikace vidět, vybereme port, na kterém běží, a zviditelníme ho

Definování se provede pomocí jednoduchých klíčových slov psané velkými písmeny. Na konci je ještě uvidíte v tabulce i se stručným popisem.

💡 TIP

Visual Studio Code nabízí rozšíření pro Docker, které vám pomůže Dockerfile vytvořit (podporuje C#, Node.js, Python, Ruby, Go, a Javu) a kontejnery spravovat.

Krok za krokem

Začneme tedy prvním krokem. Jelikož používám NodeJS, na Docker Hubu si najdu obraz s předinstalovaným NodeJS. Na Docker Hub je oficiální obraz node.

Jelikož každý programovací jazyk je nějak verzován, i zde najdete verze ve formě značek (tagů). Větsina obrazů na Docker Hubu má v popisku seznam podporovaných tagů. Mezi nimi často najdete i různé varianty, např. podle distribuce Linuxu. Já si zvolím lts-alpine, tedy LTS verzi NodeJS na distribuci Alpine Linux.

Pro zapsání slouží klíčové slovo FROM následované obrazem, případně verzí, kterou oddělíme dvojtečkou. Můj zápis tedy bude FROM node:lts-alpine.

Dále nastavíme klíčovým slovem WORKDIR kam v kontejneru se má aplikace instalovat. Zde vložte cestu, pokud potřebujete instalovat na specifické místo. Já si přidám WORKDIR /app.

Pokud potřebujete definovat argumenty, které specifikujete při sestavení, použijte klíčové slovo ARG následované názvem argumentu. Takový argument budete vkládat při sestavení pomocí přepínače --build-arg nazevargumentu=hodnota. Já si třeba vytvořím argument s názvem VERZE, do kterého budu ukládat aktuální verzi. Je třeba myslet na to, že takový argument se používá pouze při sestavování, vaše aplikace ho tedy neuvidí.

Pokud chceme takový argument předat aplikaci, je lepší používat proměnné prostředí. Pokud chceme přidat proměnnou do proměnného prostředí, použijeme klíčové slovo ENV. Proměnná může nést stejné jméno jako argument. Vytvořím si tedy proměnnou s názvem VERZE, která bude mít hodnout argumentu VERZE. Toho dosáhnu použitím znaku dolaru ($): ENV VERZE=$VERZE. Definice argumentu samozřejmě musí být před použitím ENV.

Teď by se hodilo celou aplikaci vložit do kontejneru. K tomu použijeme klíčové slovo COPY.

Chci-li zkopírovat vše, co se nachází ve složce s Dockerfilem do aktuální složky v kontejneru (zde je to app, jelikož jsme si ji zvolili pomocí WORKDIR), přidám do Dockerfilu COPY . .. Pokud jsou nějaké soubory, které v kontejneru mít nechci, je třeba je uvést ve speciálním souboru, který ponese název .dockerignore (dokumentace). V něm zapište jednotlivé soubory nebo složky, každý záznam na nový řádek.

Aplikace často závisí na různých knihovnách, které spravují balíkové systémy. Pro jejich instalaci se používá nějaký příkaz, zde např. npm install. Aby Docker při sestavení použil nějaký příkaz, použijeme klíčové slovo RUN. Nepoužívejte ho pro spouštění samotné aplikace, tím se budeme zabývat níže.

Pokud tedy chci spustit příkaz npm install, napíšu jednoduše RUN npm install.

Pro samotné spuštění aplikace definujeme tzv. vstupní bod. Doslova se totiž toto klíčové slovo nazývá ENTRYPOINT. Do něj vložíme příkaz, kterým se naše aplikace spustí: ENTRYPOINT npm start.

Poslední nám zbývá říct Dockeru, aby port, na kterém aplikace běží, zpřístupnil mimo síť kontejneru. Na to použijeme klíčové slovo EXPOSE následované číslem portu. Vaše odevzdávaná aplikace musí běžet na portu 80, zadáme tedy EXPOSE 80

Tabulka klíčových slov

Klíčové slovo Popis Příklad použití Popis použití
FROM Importuje a použije jiný Docker obraz (ve výchozím stavu z Docker Hubu) FROM node:lts-alpine Použije obraz node označený lts-alpine
WORKDIR Změní aktuální pracovní složku WORKDIR /app Nastaví aktuální pracovní složku na /app. V případě, že neexistuje, bude automaticky vytvořena
ARG Umožňuje vkládat argumenty, které se použijí výhradně při sestavování, pomocí přepínače --build-arg ARG MUJARGUMENT Vytvoří argument MUJARGUMENT, na který se při sestavování můžu odkázat přepínačem --build-arg MUJARGUMENT=hodnota
ENV Nastaví hodnotu v proměnném prostředí kontejneru ENV APIKLIC=$MUJARGUMENT Nastaví hodnotu proměnné s názvem APIKLIC na hodnotu mého argumentu MUJARGUMENT
COPY Slouží pro kopírování souborů ze zdroje do kontejneru COPY . /app/ Zkopíruje všechno ve složce, ve které je Dockerfile, do složky /app (vyjma souborů uvedených v .dockerignore)
RUN Spustí zadaný příkaz RUN echo "ahoj světe" Spustí uvedený příkaz
ENTRYPOINT Uvádí tzv. vstupní bod aplikace, tedy jakým příkazem se má spustit ENTRYPOINT npm start Při použití docker run ... se aplikace spustí příkazem npm start
EXPOSE Odhalí port kontejneru, aby byl přístupný mimo interní Docker síť EXPOSE 80 Odhalí port 80

Výsledný Dockerfile

FROM node:lts-alpine
WORKDIR /app
ARG VERZE
ENV VERZE=$VERZE
COPY . .
RUN npm install --production
ENTRYPOINT npm start
EXPOSE 80

Teď se dáme do sestavování.

Sestavení Docker obrazu

Sestavování nám ulehčí GitHub akce. Je důležité ale otestovat, že se nám obraz skutečně sestaví. K tomu stačí použít příkaz docker build . -t tda ve složce s Dockerfilem. Nezapomeňte Docker nejdřív spustit. Pokud jste v aplikaci používali argumenty (ARG), nezapomeňte je specifikovat přidáním vlajky --build-arg JMENO_ARGUMENTU=HODNOTA!

Tento příkaz nám vytvoří nový obraz označený jako tda.

Docker build log

Jakmile máme sestaveno, můžete zkusit vytvořit kontejner příkazem docker run -p 8080:80 tda:latest. To vytvoří kontejner z nejnovějšího sestavení obrazu se značkou tda. Přepínač p propaguje port do vašeho počítače, abyste na aplikaci mohli přistoupit i skrz váš prohlížeč. Zde se port 8080 na vašem počítači přesměruje na port 80 v kontejneru (ten, který jsme uvedli v EXPOSE).

Screenshot z webu, aplikace funguje

Jak můžete vidět, aplikace běží a dokonce tam je i argument VERZE, který jsem si definoval přes ARG a ENV.

Odevzdání

💡 TIP

Odevzdávat můžete klidně skrz jiné CI řešení nebo manuálně z vašeho PC.
Stačí, když porozumíte YAMLu akce, která je v boilerplate předloze a upravíte ji pro své potřeby.

Nejjednodušší způsob odevzdání je skrz GitHub akci. Pokud jste použili předlohu, už máte akci nastavenou v repozitáři a stačí vám pouze nastavit si klíče. O tom si však povíme vše potřebné v následujícím webináři Odevzdej a otestuj - Git/GitHub a testovací platforma.