MENU

Jak začít používat Docker

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

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 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
Smazání všech docker imagů:
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.
V dockerfile to pak je zalzáno 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

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

Další linuxové články:

Jak používat s Dockerem
ISP Config: web a mail hosting
Instalace Linuxu na dedikovaný server HPE ProLiant DL320e
Ebook: Poznámky správce linuxových serverů
Souborový systém Btrfs
Operační systém GNU/Linux
Jednodeskový ARM počítač Raspberry PI
TouchBooku v praxi
Boot a instalace bez DVD mechaniky
4TB disk GPT a UEFI boot
Action camera Eken H9R
Proč používat filesystém JFS

Kontakt

Pozdrav, dotaz nebo žádost o konzultaci pošlete na můj email:mail@josefjebavy.cz




Flattr this



Ověřit CSS!