Jak začít správně používat Docker

3. prosince 2019

Lang: cs en de es

Docker se hojně rozšířil. Je dobré se sním naučit (pro Linuxáka to bude hračka). Je ovšem také potřeba mu rozumět a správně ho používat. Bude dobré také znát některé pokročilé funkce, pokud sestavuje vlastní Docker kontejnery nebo řešíte výkon Dockeru na Macku nebo Windows.

Docker se hojně rozšířil. Je dobré se sním naučit (pro Linuxáka to bude hračka). Je ovšem také potřeba mu rozumět a správně ho používat. Bude dobré také znát některé pokročilé funkce, pokud sestavuje vlastní Docker kontejnery nebo řešíte výkon Dockeru na Macku nebo Windows.

Tento článek je návod nebo tutoriál jak začít používat Docker. Popisuje fungovaní Dockeru a způsoby použití. Tutoriály na konkretní způsoby použití budou následovat později.
Kdo potřebuje aplikaci v Dockeru zprovoznit ne má zájem o školení může si domluvit individuální spolupráci.

Docker je jedna z vizualizačních technologií, konkrétně se jedná o kontejnerovou virtualizaci. Je to virtualizace, která využívá možností linuxového jádra, pravě proto je Docker primárně určen pro Linux. Ale různými způsoby se dá zprovoznit i na Windows a Mac OS X a tak se i často děje.

Aplikace v Dockeru běží jako systémový proces, který sdílí paměť a kernel systému. Protože je kernel sdílený, tak aplikace musí používat pouze ty funkce, který daný kernel má. Ale většina běžných aplikaci, žádné speciální a nové funkce nepotřebuje.

Konkrétně docker používá virtualizaci. cgroups a namespaces.

K čemu se Docker hodí?

Provozovat i vyvíjet aplikace se dá bez Dockeru. Docker tedy není nutný, je však několik typických použití, pro které se nasazení Dockeru hodí.

  • Testování
  • Command-line aplikace - výsledkem pak je kompletní funkční aplikace. Může to být i aplikace, která běží za použití wine.
  • Bezstavové aplikace.
  • Stavové aplikace - je potřeba ukládat data zvlášť pomocí volumes.
  • Vývoj - používá se proto i Vagrant, ale nejvíc se prosadil Docker. (Vagrant je jednoduchý wrapper kolem CLI rozhraní Virtualboxu)
  • Ostrý provoz - prostředí tak jak potřebujete.
  • HA, škálování - řešení s orchestračním nástrojem např Kubernetes.
  • Testování, rychlý přechod na nové verze SW. Například upgrade PHP.
  • Izolování aplikace.
  • Migrace.
  • Rychlé startování.

Jak píši hodně se prosadil Docker hlavně u webových aplikací. Ale na některé použití se lépe hodí například Virtualbox. Také pro použití na Mac OS X a Windows by bylo lepší použít VirtualBox, protože nenativní použití Dockeru má výkonnostní problémy.
Pro zkušeného Linux admina nebude problém připravit reprodukovatelné prostředí ve Virtualboxu například pomocí Ansible

Prostředí v Dockeru běží izolovaně, takže aplikace, která v něm běží, nemůže zasahovat do běhu ostatních aplikací. Také je možno každé aplikaci vytvořit unikátní prostředí. Je možno prostředí rychle měnit například přecházet na nové verze nebo testovat aplikaci na různých verzích knihoven.

Virtualizace

Jaké jsou typy virtualizací a konkretní technologie, které virtualizaci implementují se dozvíte v tomto videu:

Instalace Dockeru

Nejprve je potřeba Docker nainstalovat pokud máte linuxovou distribuci Mageia verze 6 nebo 7, je docker v jejích repositářích. A tak stáčí následujícím příkazem Docker nainstalovat:

urpmi docker
Aby jste mohli docker spravovat jako běžný uživatel je potřeb se přidat do skupiny docker.

Docker na debianu

V linuxové distribuci Debian není Docker součástí. Proto je potřeba přidat oficiální repozitář Dockeru a pak můžeme Docker nainstalovat.

Nejprve přidáme certifikáty daného repozitáře:

curl -fsSL https://download.docker.com/linux/debian/gpg |  apt-key add -
 

Vytvoříme soubor s konfigurací repozitáře:
echo "deb  https://download.docker.com/linux/debian $(lsb_release -cs) stable">> /etc/apt/sources.list.d/docker.list

Nainstalujte Docker:
apt-get  update && apt-get install docker-ce

Tímto příkazem zjistíte jestli Docker běží:
systemctl status docker

Zdroj - návodu v angličtině: how to install and use docker on debian 9 . Já jsem to dělal již na Debianu 10.s

Pojmy

Aby se člověk zorientoval v nové technologii je potřeba si vysvětli základní pojmy.

Image

Image je to co přestavuje připravené prostředí bez lokálních úprav. Z pohledu programátora by se to dalo nazvalo třídou.

Kontejner

Kontejner se dá přirovnat k instanci Objektu. Je to bežící prostředí vytvořené z image a již obsahuje data nebo lokální změny, které vytvořila.

Ve virtualizaci je vztah mezi image a virtuálním strojem typicky 1:1. V Dockeru, ale můžete spustit z jedné image kontejnerů kolik chcete.

Docker compose

Docer-compose je nástroj pro definování jak spouštěn více Docker kontejnerů, jak mají být nastaveny a jak mají být propojeny. Konfigurace docker-compose je zapsáná v souboru, který je ve formátu YAML. Obsahuje informace jaké kontejnery se mají z jakých imagů spouštět, jaké volume mají být připojeny a jak mají být propojeny virtuální sítí.

Kubernetes

Kubernetes je orchestrační nástroj pro docker a další popodobné technologie. Tento nástroj řídí a spravuje kontejnery, tak aby běželi jak je požadováno. Automaticky je zapíná a vypíná atd..

Docker swarm

Docker swarm je orchestrační nástroj od Dockeru, aktuálně se více používá Kubernetes.

Docker použití příkazy

Tento příkaz Vám stáhne data a sestaví ukázkový docker image, který pak můžete vyzkoušet.

docker run hello-world

Výpis běžících kontejnerů:

docker ps
Zároveň vidíte další informace o kontejnerech například které porty jsou mapované z lokalního stroje na které v kontejneru.

Výpis existujících obrazů:

docker images

V souboru Dockerfile mužete nadefinovat Váši vlastní konfiguraci pro vytvoření image.
Například

FROM php:7.2.18-cli-alpine3.9
RUN php -v
CMD php -v

Sestaveni image dle Vašeho souboru Dockerfile apojmenujem ho alpine-php72:
docker build -t  alpine-php72 .alpine-php72

Tímto příkazem image spustíme.
 docker run alpine-php72
Můžete si všimnout, že při sestavování image se vypíše verze PHP a pak při puštění image.

Hledat předpřipravené kontejnery můžete pomocí web rozhraní https://hub.docker.com/ nebo i z konzole příkazem:

docker search NAZEV

Takto spustíte konzoli, tedy bash interpretru v kontejneru s ID e286a85fdcac:

docker exec -it e286a85fdcac /bin/bash

Takto spustíte kontejneru z image web a namapujete lokální portu 8080 na port 80 kontejneru:

docker run -ditp 8080:80  web
Na adrese localhost:8080 je tedy dostupné to co běží v kontejneru na portu 80.

Spouštění kontejneru z image dockette-web-alpine, který navíc pojmenujeme www a pokud již kontejner s takovým názvem existuje, tak je smazán a vytvořen opět čistý.

docker run  -it  --rm   --name www  -p 80:80  -p 9001:9001  dockette-web-alpine

Význam přepínačů

-t Allocate a pseudo-tty
-i Keep STDIN open even if not attached
-d will detach our terminal
-P will publish all exposed ports to random ports and finally --name corresponds to a name we want to give. Now we can see the ports by running the docker port [CONTAINER] command

Copy, Add

Když uvedete v Dockerfile příkaz COPY, tak nakopíruje lokální soubor do image. Je to dobré pro nahraní konfigurace nebo dalších souborů, které jsou potřeba v kontejneru.

Nakopírování konfigurace virtualhostu pro web server apache:

COPY site.conf /etc/apache2/sites-available/000-default.conf

Téměř stejně funguje i příkaz ADD.

Volumes

Volumes je způsob, jak dostat lokální data do kontejneru a a tak na nich můžete zároveň pracovat. Tedy ideální způsob pro vývoj, kdy soubory upravujete lokálně a kontejner k nim má přístup a tak je můžete rovnou spouštět.

Příklad kdy si můžete vyzkoušet použití volumes a v kontejneru ověřit, že to co vytvoříte bude vidět na obou místech:

docker run -v /root/kontainer_dir:/root/host -i -t debian /bin/bash

Ruční vytvoření volume. Umístění je na disku je dle konfigurace dockeru.

docker volume create my-vol

Výpis dostupných volumes: docker volume ls

Zobrazení podrobností dané volume: docker volume inspect my-vol

Spuštění docker kontejneru s distribucí Mageia 7 a připojeni vytvořené volume do /srv a spuštění shellu v kontejneru: docker run --mount source=my-vol,destination=/srv -it mageia7 /bin/bash

Pokud řešíte výkonnostní problém volumes na Macku nebo Windows je možnost mít většinu věcí rovnou v dockeru. Nebo všechno mít v dockeru a zpřístupnit jeho data. V případě většího výkonnostního problému je možnost zvolit jiný typ virtualizace například Virtualbox.
Ale věcí okolo vývoje a devops jsou už na osobní konzultaci

Více o docker volumes.

Rady

Do jednoho kontejneru patří jen jedna věc.

Video Docker první použití

V tomto videu jsou vysvětleny základní pojmy a příkazy a uvidíte první použití dockeru.

Pokročilé používaní Dockeru

Můžete definovat proměnné prostředí

 ENV PHP_CLI_DIR=/etc/php/7.3/cli

Nakopírování souboru do běžícího kontejneru:

docker cp foo.txt mycontainer:/foo.txt

Propojení kontejnerů. Spustíme kontejner s databází a pak kontejner s projektem, který se bude k dané databázi připojovat. docker run --name somemysql -e MYSQL_ROOT_PASSWORD=pass1234 -d mysql docker run --name someproject --link somemysql:mysql -d project - MYSQL_DATABASE=dbname

Pokud potřebujete nahrát jednorázově do DB nějaká data můžete použít jeden z těchto příkazů:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"
cat dump.sql | docker-compose exec -T  mysql -u  -p 

Pokud jde o inicializaci databáze, tak běžný kontejner s MariaDB očekává inicializační SQL soubor v /docker-entrypoint-initdb.d/dump.sql Takže například parametrem v (pro volume) můžete po-řešit připojení inicializačního SQL souboru do docker kontejneru.

-v./dump.sql:/docker-entrypoint-initdb.d/dump.sql

Logy jednotlivých kontejnerů jsou zde: /var/lib/docker/containers/

Pokud Docker kontejner běží na pozadí (typické u serveru) takto se připojíte na STDOU:

 
 docker logs -f f6010bf5a375

Videa docker

Vývoj webové aplikace PHP/Nette3 v Dockeru

Zde je video-live streamy, kde je vidět použití dockeru při vývoji webové aplikace:

Docker compose

V mojí linuxové distribuci (Mageia 6) mě kvůli nějaké kolizi nešel nainstalovat docker-compose (hádám díky překotnému vývoji Dockeru), proto jsem docker-compose stáhl ručně a začlenil do systému.
Příkaz na stažení, uložení a nastavení práv: curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" \ -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Více oinstalaci docker-compose.

Konfigurace docker compose

Do souboru docker-compose.yml se zapisuje konfigurace pro docker-compose. Tam můžete určit z jakých imagů se mají startovat jaké kontejnery. Jak mají být mapovány volumes, porty a jaké další konfigurační hodnoty se jim mají předávat.

Tato konfigurace udává, že Dockerfile je ve stejném adresáři. Je uveden název zdrojového kontejneru a jak se bude image jmenovat. Je uvedeno mapovaní portů. Proměnná NETTE_DEBUG=1 je proměnná prostředí, podle které v PHP můžeme načítat jinou konfiguraci projektu.

version: '3.6'
  
services:

  web:
    build: ./
    image: linuxserveradmin
    container_name: linuxserveradmin
    environment:
     - NETTE_DEBUG=1
    volumes:
      - .:/srv

    ports:
      - 8081:80

To co jste si nakonfigurovali v souboru docker-compose spustíte naráz příkazem:

docker-compose up

Mazání

Výpis všech docker kontejnerů:

docker inspect -f '{{ .Mounts }}' containerid
Smazání image:
docker rmi hello-world
Všech docker image smažete následujícím příkazem:
docker rmi $(docker images -a -q) -f
Tento příkaz smaže všechny kontejnery, sítě, image, a zbuildované cache: docker system prune -a

Cache

Docker cachuje data a tyto cachovaná data pak používá. Image tak má například nacachované informace o balíčkách v repozitáři. Ale když přijde aktualizace, tak staré balíčky zmizí a když vaše vrstva staví na těchto nacachovaných datech, tak se snaží stahovat co už neexistuje. Pro to je dobré před každým příkazem apt-get install mít příkaz apt-get update, který aktualizuje informace o repozitářích.
Do Dockerfile to pak zapíšete následovně:

RUN  apt-get -qq update && apt-get install -y ........
Uvedené přepínače říkají, že se nemá používat interaktivní režim, protože docker to spouští sám automatizovaně.

Rebuild image bez použití cache:

docker-compose  build  --no-cache

Automatické spouštění kontejneru

Vypnutí automatického spuštění kontejneru po restartu počítače:

docker update --restart=no 491dfa4b274a

Nastavení automatického startu kontejneru po startu počítače:
docker update --restart=yes 491dfa4b274a

Nebo je potřeba spouštět kontejner s parametrem
 --restart always

Pro stejnou funkčnost v docker-compose YAML souboru uveďte:
    restart:
      always

Docker a BTRFS

Já používám filesystém BTRFS, čehož Docker využívá. Opět je to ukázka toho proč používat Linux a proč používat filesystém BTRFS a další kvalitní moderní technologie, které zefektivňují práci.
Výpis vrstev, které jsou v BTRFS tedy subvolume, zobrazí příkaz:

 btrfs subvolume list /
A ejhle uvidíte spousta subvolume, které vytvořil Docker.

GUI aplikace v Dockeru

V Dockeru můžete provozovat i GUI aplikace. Zde Vám ukáži základní způsob jak zprovoznit grafickou aplikaci eyes.

Vytvořte následující Dockerfile:

FROM centos
RUN yum install -y xeyes
CMD ["/usr/bin/xeyes"]

Zbuilděte image:
docker build -t gui-app .
Spušťe z image kontejner a programu v něm:
docker run --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" gui-app

Spuštění Adobe Acrobad Readeru v linuxu bez instalace - tedy za použití dockeru:

docker run --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" -v $HOME:/srv mgor/acroread

Docker - vývoj webových aplikací

Pokud vyvíjíte webové aplikace, je dobré mít nějaký výchozí docker image. Takový image jsem připravil za vás. Pro PHP8 jsem připravil docker image s PHP8. K dispozici tam jsou i další mnou připravené image, se staršími verzemi PHP např verze 5.6, 7.4 atd.

Pokud programujete webové aplikace v PHP frameworku Nette nebo Symfony, připravil jsem docker image s konfigurací pro tyto frameworky. Stačí tak docker kontejner jenom spustit a připojit zdrojové kódy aplikace. Zde je docker image pro Nette a zde je docker image pro Symfony.

Pro spuštění vývojového prostředí stačí pak pouze vytvořit soubor docker-compose.yml s následujícím obsahem/konfigurací:
version: '3.6'

services:

  web:
    image: debian-apache-php8.0-nette
    container_name: linuxserveradmin_web
    environment:
     - NETTE_DEBUG=1
    working_dir: /var/www/html

    volumes:
      - .:/var/www/html
      - ./docker/development/web/msmtprc:/etc/msmtprc
    ports:
      - 8081:80
      - 8082:443
V souboru msmtprc je konfigurace pro odesílaní pošty skrze externí SMTP server. A docker image je nakonfigurován tak, že funkce mail() v PHP odesílá maily automaticky přest nastavený externí mail server. Podrobnosti viz článek jak nakonfigurovat odesílaní mailů v PHP v dockeru.

Školení

Firmy, které chtějí zefektivnit svůj provoz, těm mohu Docker doporučit. A formou Docker školení a následné spolupráce společně Docker zavedeme do firmy.

Docker Hub

Video jak vytvořit docker image a nahrát ho do Docker Hubu:

Pro vývoj projektů v PHP ve framewotku Nette nebo Symfony můžete použít mnou vytvořené docker image, které obsahují vše potřebné: apache, composer, PHP s moduly. Zde je docker image pro Symfony s PHP7.4 a docker image pro Nette s PHP7.4. Tyto docker image používám i na mých školeních vývoje vebových aplikací.

Windows a Docker

I na Windows jde provozovat Docker, instalace je však komplikovanější a výkon slabší. Je více možností jak Docker na Windows zprovoznit:

Návody Docker

Odkazy a zdroje

docker
docker hub
docs docker

Další zdroje

https://dckr.cz/
docker-800-dni-pote/
vojta.kalcik.cz navody:docker
docker mariadb
start-containers-automatically/
proc-pouzivat-docker/

Nette v dockeru

docker nette
nette je php 7.3 - Listopad 2019 sám již Nette provozuji na PHP 7.4

Články na podobné téma

Změna licencování VMware
Provoz Microsoft SQL serveru na Linuxu
Zálohování: Proxmox backup server
Linux jako router a firewall
Jak náhrát docker image do Docker Registry
Linux: Logical Volume Management
Linuxový softwarový RAID
Provoz webové aplikace za proxy
Migrace mail schránek
Docker multistage build
Zálohování dat zapnutím počítače
Podman
Import Windows do virtualizace Proxmox
Docker a PHP mail
Virtualizace Proxmox
Docker a Cron
Lenovo ThinkPad X1 Carbon: zprovoznění LTE modemu EM7544
Yocto Project: Build vlastního operačního sytému pro embedded zařízení
Příprava linuxového serveru pro běh webové aplikace v jazyce Python
Jak řešit špatný výkon sdílených souborů u Dockeru
Instalace Linuxu na dedikovaný server HPE ProLiant DL320e
Jak provést zátěžový test webové aplikace
Proč používat filesystém JFS
Jak bootovat z 4TB disku s GTP pomocí UEFI
Jak nainstalovat operační systém Mageia Linux bez DVD mechaniky
Souborový systém Btrfs
Raspberry PI
Jak zprovoznit vzdálené přehrávání přes síť na televizi s DLNA
Upgrade Mandriva Linuxu za běhu
Poznámky ke GNU/Linux
WINE - spouštíme programy pro Windous pod Linuxem
Operační systém GNU/Linux

Odběr novinek

Pokud máte zájem dostávat příležitostně na email novinky.
Můžete se vyplněním emailu registrovat k odběru novinek.


+