Většina návodů pro dockerizaci aplikací, které naleznete na internetu, je určena pro specifický jazyk a prostředí. My se ale budeme věnovat obecným postupům určeným pro jakýkoliv typ aplikace a ukážeme vám, jak je možné dosáhnout jejich provozu v Docker kontejneru.
Výběr base image
Pro bezproblémový provoz a následné jednoduché úpravy a upgrady je vhodné vybrat co nejideálnější (a autorem dobře podporovaný) base image. Vzhledem k tomu, že na Docker Hub může nahrávat image naprosto kdokoliv, je dobré vybraný image důkladně prozkoumat a ověřit si, zda neobsahuje nějaký škodlivý software, nebo například staré verze knihoven s bezpečnostními problémy.
Dále můžeme také doporučit sbírku od firmy Bitnami, která obsahuje spoustu předpřipravených image aplikací a vývojových prostředí.
Doinstalování dalšího software
Podle toho, jaký image jsme si pro svůj projekt vybrali, můžeme provést instalaci dalšího software, tak, abychom splnili všechny předpoklady pro bezproblémový provoz aplikace.
Nejlepším řešením je použít balíčkovací systém distribuce, na které je image založen (obvykle Ubuntu/Debian, Alpine Linux nebo CentOS). Je také velmi důležité udržovat seznam nainstalovaného softwaru co nejužší, například neinstalovat do kontejneru textové editory, kompilátory a jiné nástroje pro vývoj.
Vlastní soubory v Docker image
Do výsledného image budeme také chtít přidat vlastní soubory. Ať už konfigurace, přímo zdrojové kódy nebo binární soubory z aplikace. V Dockerfile se k tomu používají příkazy ADD nebo COPY, který je transparentnější, ale neumožňuje některé pokročilejší funkce, jako je například rozbalení archivu do image.
Definice oprávnění
Ačkoliv je to ta nejjednodušší cesta, vyhněte se spouštění aplikace v kontejneru za uživatele root, přináší to mnohá bezpečnostní rizika a zesiluje možnost úniku z kontejneru v případě kompromitace aplikace nebo po využití nějaké bezpečnostní chyby v softwaru třetích stran, které využíváte.
Definice portů služby
Pokud vaše aplikace nepoužívá uživatele root, případně nemá zvýšené capabilities (CAP_NET_ADMIN), není možné používat tzv. privileged ports. (1-1024). To však v Dockeru není nutné. Použijte jakýkoliv vyšší port (např. 8080 a 8443 místo 80/443 u webserveru) a proveďte mapování portu prostřednictvím parametrů Dockeru.
Spuštění aplikace v kontejneru
Jakkoliv je jednoduché spouštět přímo binární soubor vaší aplikace (nebo web serveru, Node.js, apod.), mnohem sofistikovanější cestou je vytvořit si vlastní tzv. entrypoint - tedy skript, který provede úvodní konfiguraci aplikace, může reagovat na proměnné prostředí apod. Dobrý příklad tohoto řešení můžeme najít například v oficiálním image PostgreSQL.
Metody konfigurace
Velká většina aplikaci vyžaduje pro správné spuštění správnou konfiguraci. Je samozřejmě možné použít přímo konfigurační soubor (například v mountovaném adresáři zvenku kontejneru), ale ve spoustě případů je lepší použít předem připravený entrypoint skript, který nám vhodnou konfiguraci při spuštění připraví pomocí template a proměnných prostředí kontejneru.
Aplikační data
Vyhněte se ukládání dat na filesystém kontejneru, ve standardní konfiguraci dojde po restartu kontejneru k jejich smazání. Využijte bind mounts (adresář vně kontejneru), nebo mounted volume.
Stejně tak je nutné vyřešit ukládání/odesílání logů. Nejvhodnější je samozřejmě použití centralizovaného logování pro všechny vaše aplikace (ELK stack), dobrou službu však odvede i obyčejný remote syslog.
Co dál?
Vždy je co zlepšovat. Nad rámec tohoto článku je možné se zamyslet nad různými možnosti configuration managementu, ELK stacku pro logování, sbírání aplikačních a systémových metrik přes Prometheus a možnosti dosažení load balancingu a high-availability pro naši aplikaci s použitím Kubernetes - které vám ve vshosting~ rádi postavíme přímo na míru vašemu projektu :)