Vyzkoušejte si naše Docker image pro PHP 5.4.4, Python 2.7.8 a Python 3.4.1

Jak bude vypadat další administrace zhruba víme, ale pořád zbývá vyřešit spoustu detailů. Například jsme se rozhodli, že všechny aplikace na Roští pojedou v kontejnerech spravovaných přes Docker, takže stojíme přes vývojem těch nejdůležitějších kontejnerů. To znamená rozhodnout o adresářové struktuře dat, které se budou mountovat do kontejneru a také o způsobu, jakým se kontejnery budou spravovat.

Docker testujeme pořád, některé naše věci na něm běží, například RoundCube a měníme různé aspekty obrazů, kterými budou vybaveny. Původní myšlenka byla taková, že kontejner bude obsahovat všechno, co je potřeba jak pro běh aplikace, tak pro její správu. Postupně, jak jsme Dockeru rozuměli čím dál tím více a to hlavně jeho myšlence, jsme původní kontejner dost okleštili. Původní seznam vlastností vypadat takto:

  • Python/PHP/Node.js
  • SSH
  • Butterfly (přístup k shellu přes web)
  • Cron

Zatímco SSH a Butterfly vyletěly hned v prvních buildech, s cronem jsme tak trochu na vážkách. V současné době ho obrazy nemají a je třeba to řešit jinak. Uvažujeme nad stejným obrazem ale spuštěným s jiným parametrem při volání docker run.

Aktuálně se kloníme k názoru, že by měl existovat kontejner s aplikací a pak pomocný kontejner s cronem a záchranný kontejner s SSHčkem. Ani cron ani SSH zatím nemáme, ale to hlavní, kontejnery pro běh aplikací v Pythonu a PHP už si můžete vyzkoušet.

Naše kontejnery budou mít specifické chování. Zaprvé musí držet následující strukturu:

  • /srv – adresář se všemi uživatelskými daty
  • /srv/app – adresář s vaší aplikací, podobně jako je tomu teď
  • /srv/venv – virtualenv u Pythoních imagů
  • /srv/logs – adresář s logy
  • /srv/conf – adresář s konfigurací, například php.ini

Zadruhé mají všechna data práva 1000:1000, uvnitř kontejneru se to bude jevit jako app:app. Docker se postará o dostatečné oddělení uživatelských dat a nám to umožní synchronizovat data přes několik serverů například přes BitTorrent Sync. Mělo by potom být jednoduché nastavit u aplikace, na kolika fyzických serverech chcete, aby aplikace jela a tím navýšíte výkon i spolehlivost. Samozřejmě to bude mít svá omezení, ale o tom jindy.

Zatřetí je tu start.sh skript, který se spouští při startu kontejneru a stará se o následující:

  • Dotvoří adresářovou strukturu v /srv.
  • Pokud neexistuje žádná aplikace v /srv/app, nahraje výchozí.
  • Pokud neexistuje virtualenv v /srv/venv, vytvoří ho. (Pythoní image)
  • Doinstaluje veškeré závislosti ze souboru /srv/app/requirements.txt. (Pythoní image)
  • Nastaví správně práva na adresář /srv.
  • Spustí skript /srv/app/init.sh. (zatím jen Pythoní image, ale budou to mít i ostatní)
  • Nastaví workdir na /srv/app.
  • Spustí Apache/Gunicorn/jiný webserver.

Z výčtu výše bych chtěl zdůraznit hlavně fakt, že úplně končíme s uWSGI. Stal se z něj ohromný moloch a Gunicorn ho více než dobře nahradí. Možná uWSGI zvážíme někdy příště, ale určitě ne u Pythonu. Druhou věc, kterou bych rád zmínil, je existence /srv/app/init.sh skriptu. V něm si totiž budete moct napsat cokoli, co se má stát před startem vaší aplikace. Tady je malý příklad z existujícího projektu:

 

#!/bin/bash

source ~/venv/bin/activate
cd /srv/app
python manage.py migrate
python manage.py collectstatic --noinput

V tomto příkladu se aktivuje virtualenv, zavolají se migrace a sesbírají statická data. Ještě lépe bude skript fungovat, když do něj přidáme něco takového:

#!/bin/bash

source ~/venv/bin/activate
cd /srv/app
git pull origin master
python manage.py migrate
python manage.py collectstatic --noinput

V tomhle případě se rovnou stáhne i nová verze aplikace z GIT repositáře. Novou verzi tedy nasadíte prostým restartem aplikace z administrace.

Obrazy o kterých je řeč jsou dneska už k dispozici. Mrkněte sem. Pokud máte server s Dockerem, zkuste následující:

mkdir -p /srv/myapp/
docker run -d --name=myapp -p 10000:80 -v /srv/myapp:/srv rosti/python:3.4.1

A to je všechno, po odentrování se stáhne obraz rosti/python:3.4.1, spustí se jako kontejner a namountuje se do něj /srv/myapp. Na http://localhost:10000/ teď najdete ukázkovou aplikaci. Když do /srv/myapp/app nahrajete vlastní kód a zavoláte docker restart myapp, budete mít na stejné adrese svou aplikaci. K dispozici je aktuálně Python 3.4.1 a 2.7.8.

PHP obraz funguje podobně.

mkdir -p /srv/myapp/app
echo "<? phpinfo() ?>" > /srv/myapp/app/index.php
docker run -d -p 10000:80  -v /srv/myapp/:/srv/ --name=myapp rosti/php:5.4.4

A to je všechno, teď máte na stejné adrese phpinfo. Tak zase někdy příště 🙂