Docker - nový stupeň virtualizácie

Jun 12, 2019

Tradičný spôsob lokálneho vývoja webových aplikácii (MAMP, WAMP) nie je veľmi flexibilný a pri viacerých projektoch môžu nastať problémy pri potrebe rôznych verzií PHP. Ako riešenie na tento problém je vytvorená technológia, ktorá je revolúciou v oblasti lokálneho vývoja.V tomto príspevku sa pokúsim vysvetliť aká technológia stojí za slovíčkom Docker a v čom je prelomová oproti ostatným formám virtualizácie.

Čo to Docker je?

Je to ešte stále pomerne nová technológia, ktorá umožňuje vývojárom, aby aplikácia mohla bežať na rôznych platformách v rovnakom vývojovom prostredí. Výsledkom je zjednodušenie spravovania rôznych projektov a bezpečnejší vývoj.

Na rozdiel od ostatných virtualizačných technológii je Docker postavený na kontajneroch, v ktorých beží iba samostatný proces a nie celý operačný systém ako napr. pri virtuálnych počítačoch (nap. virtualbox).

Dockrovský kontajner

Je základná jednotka, ktorá obsahuje všetky potrebné súčasti a závislosti na beh konkrétnej aplikácie (napr. databáza, webový server). Kontajner sa spustí na všetkých operačných systémoch v rovnakom stave a s rovnakou konfiguráciou, zároveň je úplne nezávislý.

Proces v kontajneri je úplne izolovaný od zvyšku systému a má prístup iba k tým zdrojom, ktoré mu boli konkrétne pridelené (napr. súbory, porty). To znamená že na počítači môžu naraz bežať rôzne webové aplikácie v rôznych kontajneroch s rôznymi požiadavkami (rôzne verzie PHP).

Kontajnery medzi sebou potom komunikujú podľa definovaných pravidiel a vymieňajú si informácie a dáta len tak ako to je nastavené.

Docker vs. Virtual machine

Container vs. Image

Docker umožňuje vytvoriť vlastný kontajner, ktorý bude obsahovať zložky potrebné pre konkrétny projekt. Mnohokrát je ale jednoduchšie nájsť si konkrétny kontajner, ktorý spĺňa požiadavky (mysql, nginx, php). Tu ale je rozdiel v tom, čo je container a čo je image.

Image - je súbor v, ktorom je definované ako má container vyzerať. Čo má obsahovať a pod.

Container - je už konkrétna inštancia, ktorá beží na hosťovskom pc.

Ukážkový docker image

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

Trošku z histórie tejto technológie

Docker bol publikovaný v roku 2013 ako open-source projekt a aktuálne je to najrozšírenejšia platforma svojho druhu. Pôvodne Docker fungoval na Linuxe, ale neskôr si aj Microsoft uvedomil výhody tohto operačného systému a v roku 2016 bola vydaná verzia, ktorá podporovala Win server.

Dodnes je ale podpora na Windowse obmedzená iba na Windows 10 v Pro, Enterprise alebo Education verzii kvôli požadovaniu Hyper-V. Tieto špecifické požiadavky pre Windows sú z dôvodu rozdielnosti operačného systému oproti Linuxu.

Inštalácia softvéru na pc

Všetky informácie o inštalácii Dockeru nájdete v prehľadne spracovanej dokumentácii

https://docs.docker.com/install/

Správa kontajnerov

Docker spravuje kontajnery priamo z príkazového riadku pomocou Docker CLI. Základný cheat sheet:

## List Docker CLI commands
docker
docker container --help

## Display Docker version and info
docker --version
docker version
docker info

## Execute Docker image
docker run hello-world

## List Docker images
docker image ls

## List Docker containers (running, all, all in quiet mode)
docker container ls
docker container ls --all
docker container ls -aq

Avšak pri väčších projektoch je komplikované každú službu spúšťať osobitne a preto sa dajú spravovať kontajnery hromadne pomocou Docker Compose súboru. Ten umožňuje definovať rôzne verzie docker images, ktoré budú vzájomne komunikovať a taktiež spúšťať celé prostredie jedným príkazom. Ukážkový docker-compose súbor, v ktorom je definovaný kontajner na databázu a php kontajner spolu so základnými nastaveniami.

version: "3.5"
  services:
    db:
    image: wodby/mariadb:${MARIADB_TAG:-10.1-3.1.2}
      container_name: "name_db"
      stop_grace_period: 30s
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD-password}
    volumes:
      - ./config/db-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here.
      - database_volume:/var/lib/mysql

    php:
      image: wodby/php:${PHP_TAG:-7.1-dev-4.4.1}
      container_name: "name_php"
      environment:
        PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog.docker:1025
        PHP_UPLOAD_MAX_FILESIZE: 100M
        PHP_MEMORY_LIMIT: 100M
        DB_HOST: db
        DB_NAME: ${DB_NAME:-name}
        DB_USER: ${DB_USER:-user}
        DB_PASSWORD: ${DB_PASSWORD:-pass}
      volumes:
        - ./:/var/www/html

Zhrnutie

Docker je ešte stále mladá technológia, ktorá sa začína až teraz masívne šíriť medzi vývojármi. Aj napriek tomu, že počiatočná migrácia projektov nemusí byť jednoduchá, neskoršie urýchlenie vývoja a zmenšenie rizík a chýb, kvôli rozdielnosti medzi lokálnym a produkčným prostredím sú určite výhody, ktoré stoja za to pozrieť sa na túto technológiu.

Titulný obrázok: unsplash