Jak začít správně používat Docker
3. prosince 2019Docker 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á tyto funkce linuxového jádra: 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 dockerAby 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 dockerZdroj - 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 psZá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-php72Můž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 webNa 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 -Tmysql -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 }}' containeridSmazání image:
docker rmi hello-worldVšech docker image smažete následujícím příkazem:
docker rmi $(docker images -a -q) -fTento 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 soubordocker-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:443V 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.
Můj Video kurz Docker.
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ávod Docker Desktop pro Windows .
- Docker pro Windows 10 (Docker Desktop requires Windows 10 Pro or Enterprise version 15063), který využívá Windows Subsystem for Linux (WSL) .
- Docker pro Windows 8.
Návody Docker
- Docker a PHP mail
- Docker a Cron
- Jak řešit špatný výkon sdílených souborů u Dockeru na Windous nebo MacOS
Odkazy a zdroje
dockerdocker 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 nettenette je php 7.3 - Listopad 2019 sám již Nette provozuji na PHP 7.4
Články na podobné téma
VMware vs Proxmox: porovnání výkonu
GitLab CI/CD: automatizace testů a nasazení aplikace
Migrace VPS z VMware na Proxmox
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.
+