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:

 

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:

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í:

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ě.

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

5 komentářů u „Vyzkoušejte si naše Docker image pro PHP 5.4.4, Python 2.7.8 a Python 3.4.1

  1. PHPMyAdmin dokáže běžet v kontejneru s PHP 5.4.4 z tohoto článku, ale MariaDB ani MySQL nemáme v plánu zatím dělat. Důvodem je, že databáze chceme držet na oddělených virtuálních strojích. Jejich provoz v kontejneru pro každého uživatele by službu prodražilo.

    • tak som to skusil a nefunguje :/

      Could not find platform dependent libraries
      Consider setting $PYTHONHOME to [:]
      Traceback (most recent call last):
      File „/srv/venv/bin/gunicorn“, line 7, in
      from gunicorn.app.wsgiapp import run
      File „/srv/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py“, line 10, in
      from gunicorn.app.base import Application
      File „/srv/venv/lib/python2.7/site-packages/gunicorn/app/base.py“, line 8, in
      import traceback
      ImportError: No module named traceback

      • „Pokud neexistuje žádná aplikace v /srv/app, nahraje výchozí.“ problem je, ze sa mi tam ziadna vychodzia app nenahrala

        • Omlouvám se za delší odmlku, měli jsme během víkendu hackathon a soustředili se na vývoj. Image pro Python 2.7.8 jsem opravil a otestoval. S prázdným adresářem najede bez problémů a s nějakou aplikací samozřejmě také. Právě je pushován do Docker registry, takže během několika minut ho budete moct vyzkoušet. Image pro Python 3.4.1 nemá kompatibilní výchozí app.py s py3, což opravíme někdy během následujících dnů. S py3 kompatibilní aplikací ale pojede bez problémů. Používáme ho v produkci.

          Děkujeme za zpětnou vazbu a doufáme, že vám bude image dobře sloužit.