Statický web přes Docker a nginx

Nedávno jsem si pořídil VPS, abych si vyzkoušel práci s Dockerem na „zelené louce“. Cílem bylo, abych měl kde hostovat weby, případně prostě mít stále běžící server připojený k internetu, který bych mohl využívat pro zkoušení nových věcí. Vzhledem k tomu, že různé projekty potřebují různé závislosti, se mi na Dockeru líbí, že krásně vše izoluje v containeru a nemusím si tak zaneřádit hlavní server, na kterém mi vlastně teď běží pouze Docker a nginx jako reverzní proxy. Abych měl případně do budoucna instalaci co nejjednodušší a nemusel stále hledat „ten návod, podle kteréh mi to šlo posledně„, udělal jsem si na Githubu repozitář install-scripts, který si stačí pouze stáhnout a spustit script podle potřeby.

Prvním problémem, který jsem chtěl vyřešit, bylo hostování statického obsahu na zadané doméně. Zároveň se to zdálo jako jednoduchý úkol na vytvoření Docker image, ve kterém je potřeba jen běžící nginx, který data servíruje na zadaných portech ven. Prostě, žádná raketová věda:

První věcí je, že vycházím z již hotového image pro nginx, který řeší většinu věcí s ním spojených. V podstatě jediný zásah je nahrazení defaultní konfigurace, který vypne daemon pro nginx a sendfile, takže poté nenastávají problémy s aktualizací souborů. Nakonec se port 80 otevře ven a při spuštění se spustí nginx jako takový (ne však jako daemon, takže container běží stále). Již hotový image je možné stáhnout z Docker Hubu jako pavelsterba/static-site a pro jeho používání stačí pouze mountnout root se statickými soubory do běžícího containeru (viz návod v popisku image).

Tím byl vyřešený problém do čeho „zavřít“ nginx, ale byl jsem v situaci, kdy mi na jednom serveru mohl běžet pouze jeden container, který si zabral port 80. Chtělo to ještě něco, co si „stoupne“ mezi příchozí request, zjistí, na jakou doménu je vedený a podle toho ho nasměruje do příslušného containeru. Prostě úkol pro reverzní proxy, kdy jsem se opět spolehnul na nginx. Nejjednodušší zápis, který bude (za předpokladu, že máte DNS záznamy domény nasměrovány na váš server) schopen přesměrovat doménu do určitého containeru vypadá následově:

V podstatě jediné, co je potřeba udělat, je směrovat port 80 z Dockeru na localhost a port (v tomto případě) 1234. To se dá lehce zařídit přepínačem -p při spouštění containeru:

Důležité je skutečně uvedení i 127.0.0.1, jinak by byl container dostupný na zadaném portu i se znalostí IP serveru, což nemusí být žádoucí.

Pokud tedy máte nastaveny DNS záznamy, spuštěný container a takto nakonfigurovaný nginx jako reverzní proxy (RP), po zadání vaší domény si request převezme RP na portu 80, předá na localhost, port 1234, kde poslouchá Docker, který si request převezme a předá nginxu, který běží uvnitř. Ten už se postará o naservírování statických dat.

Mohlo by se vám líbit...

komentáře 3

  1. 20.10.2016

    […] jsem však, že nastal čas, abych si své služby a weby spravoval sám a jak sem již nastínil v minulém článku, začínám si vše postupně přesouvat do svojí správy. Ještě než jsem měl pořízenou VPS […]

  2. 15.1.2017

    […] osobní hygiena a v neposlední řadě také migrace WordPress blogu do Dockeru. Jak jsem psal již dříve, přesouvám si veškeré své weby a projekty na svůj server a blog byla jedna z věcí, kterou […]

  3. 3.2.2017

    […] jsem tu psal o tom, že jsem si udělal image na statické weby a spouštění Python robotů. Oba dva image fungují bez problému, tak nebyl důvod do nich […]

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *