Docker & Docker-compose

Paravirtualizace pomocí Docker přináší mnoho výhod. Je to způsob, jak zajistit stejné vývojové prostředí pro všechny vývojáře napříč různými OS. Díky Dockeru se také snáze mění verze použitého softwaru a jde tak testovat aplikaci i s jinou konfigurací softwarových balíčků. V neposlední řadě Docker umožňuje snadný deployment do cloudových služeb typu AWS.

Já používám open source verzi Docker CE (community edition), existuje i placená verze s desktopový rozhraním, ale community edition zcela postačuje. Pravděpodobně je CE i výkonnější než placená verze.Vše o instalaci se dočtete na webu Dockeru.

Docker image

Docker image je obraz systému, který chceme spustit uvnitř docker kontejneru. Základem je nějaký operační systém (Linux, Windows) a nezbytné programy. Výchozí OS je vždy v nejzákladnější verzi bez zbytečností, aby image zabíralo co nejméně místa. Alpine je linux vytvořený přímo pro docker, proto jeho image zabírá minimum místa. To se nám bude hodit v pozdější době, když máte na disku desítky různých image. Tento obraz si můžeme vytvořit pomocí docker build, nebo stáhnou z repozitáře (DockerHub). Seznam používaných docker image jde vypsat pomocí docker image ls.

blog@ludekkvapil-cz:~/sites/cl2$ docker image ls
 REPOSITORY                    TAG         IMAGE ID       CREATED         SIZE
 eth_php                       latest      f9fc7ff796da   6 weeks ago     698MB
 drupal_php                    latest      f9fc7ff796da   6 weeks ago     698MB
 <none>                        <none>      145b516ba66f   6 weeks ago     695MB
 drupal_nginx                  latest      92be177df896   6 weeks ago     134MB
 eth_nginx                     latest      92be177df896   6 weeks ago     134MB
 <none>                        <none>      7599b920e793   6 weeks ago     695MB
 php                           7.3-fpm     d88b8de5bae6   7 weeks ago     453MB

Ve výpisu vidíme základní informace. Repozitář a tag jsou image, které jsem si zbuildil, ale nepojmenoval. Latest tag je přidávaný automaticky ke každému definovanému repozitáři. Jedná se o poslední revizi image. Pro tvorbu vlastních Dockerfile je vždy lepší používat jiný tag, než latest, protože build by mohl pokaždé pracovat s jinou verzí a tím pádem by se prostředí chovalo nestabilně.

Ve výpisu vidíme i <none> repozitáře a tagy. Po běžném docker build . tak bude označené vaše zbuilděné image. Snadno ho poznáte podle času vytvoření. Ke každému image si můžeme tag a repozitář dopsat pomocí docker tag:

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

V praxi to je např docker tag 145b5 dao:1.0(dao repozitář s tagen 1.0). 145b5 je prvních pět znaků ze sloupce Image ID, ale k identifikaci postačí i jen první čtyři znaky.

Docker Hub

Na webu Docker Hub najdete mnoho předpřipravených image, včetně oficiálních vydáních na různých OS a v různých kombinacích. Vhodné image si vybere každý a pokud mu něco chybí, jde snadno importovat oficiální image ve vlastním Dockerfile a doplnit chybějící konfiguraci. Image postavená na Alpine linuxu jsou typická malou velikostí. Image postavená na Ubuntu mi zase přijdou uživatelsky přívětivější. Výběr vlastního image je tedy otázka osobních preferencí. V sestavě pro Drupal uvedené níže používám PHP, MySQL a nginx.

Dockerfile

Dockerfile je soubor, kde je definovaný zdrojové image a další nastavení pro vlastní image. Po Dockerfile se bude tázat docker build ., nebo je zbuilděno při použití docker-compose build, případně docker-compose up -d --build.  Vlastní úpravy image PHP:7.3-fpm může vypadat např. takto:

 FROM php:7.3-fpm

 WORKDIR /

 COPY ./php/php.ini  /usr/local/etc/php/php.ini
 COPY ./php/www.conf /usr/local/etc/php-fpm.d/www.conf
 
 WORKDIR /var/www/html/web

Práce s konzolí zcela vystačí, ale pro začátek se někdy hodí mít grafické rozhraní, které usnadní správu Dockeru. Portainer tuto službu nabízí jako webovou aplikaci. Pokud s Dockerem začínáte, tak vám tento nástroj může pomoci získat lepší představu o tom, jak to celé funguje. Až to pochopíte, tak už Portainer potřebovat nebudete.

Docker compose je nástroj pro správu více kontejnerů. Umožní sestavit kontejnery a image pro konkrétní projekt. Všechny kontejnery můžete snadno ovládat pomocí několika příkazů z adresáře, který obsahuje soubor docker-compose.yml.

docker-compose.yml

version: '3'
services:
  drupal:
    image: drupal_php
    env_file:
      - .env
    volumes: [ "${PROJECT_DIR}:/var/www/html:delegated" ]
    build:
      context: .
      dockerfile: Dockerfile.php
    depends_on:
      - mysql

  nginx:
    image: drupal_nginx
    ports: [ "${PORT_NGINX}:8080" ]
    volumes: [ "${PROJECT_DIR}:/var/www/html:delegated" ]
    build:
      context: .
      dockerfile: Dockerfile.nginx

  mysql:
    image: mysql:5.7.31
    ports: [ "${PORT_MYSQL}:3306" ]
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
    volumes: [ "/var/lib/mysql" ]

V této sestavě používám tři kontejnery: drupal, nginx a mysql.  U mysql používám image mysql:5.7.31, které se stahuje přímo z DockerHub. Pro kontejnery drupal a nginx mám vlastní image, které se zbuildí na základě Dockerfile uvedeného v sekci build.  $[ENV] proměnné lze definovat přes environment, jako je uvedeno u mysql, nebo v env_file, jako je uvedeno u kontejneru drupal. Volumes slouží k namapování adresářů docker kontejneru s adresářem rodičovského operačního systému. V ports jsou namapované porty kontejneru k portům rodičovského systém. Např. zápis ports: ["2555:8080"] znamená, že port 8080 v kontejneru chci namapovat na localhost:2555.

 Užitečné příkazy

docker-compose up -d

Spustí všechny kontejnery v "deteached mode", který umožní dál používat záložku konzole. Seznam všech běžících kontejnerů v adresáři vypíše docker-compose ps.

docker-compose exec NAZEVKONTEJERU bash

docker-compose logs NAZEVKONTEJERU