Znáte to. Aplikace vám na notebooku běží bez problémů. Na stagingu to najednou hlásí, že chybí systémové závislosti. A na produkčním VPS se to chová úplně jinak, protože tam běží starší verze PHP. „U mě to funguje“ je věta, která zabila víc pátečních večerů, než si kdo přizná.
Přesně tyhle problémy řeší Docker. Zabalí aplikaci se vším, co potřebuje k životu, do jedné krabičky – a ta krabička se pak chová (se správnou konfigurací) všude stejně. Na notebooku, na stagingu, na vašem VPS. Pro každého, kdo si spravuje vlastní server, je to jeden z nejužitečnějších nástrojů, co existují.
Co se v článku dozvíte:
- Co je Docker a proč ho používat.
- Jak se Docker instaluje na VPS (pro Debian).
- Jak spustit první kontejner a základní příkazy.
- Co je Docker Compose.
- Jak na bezpečnost a správu kontejnerů.
Tenhle článek je o Dockeru z příkazové řádky. Pokud chcete jen dostat svou aplikaci na server a nezajímá vás, co se děje pod kapotou, přeskočte rovnou na nasazení přes VPS Centrum.
Co je Docker lidskou řečí
Docker je nástroj pro vývoj, předávání a spouštění aplikací, který je umí oddělit od konkrétního stroje. Aplikaci zabalí do balíčku, který si s sebou nese úplně všechno: aplikaci samotnou, běhové prostředí i konfiguraci. Takový balíček pak spustí v izolovaném prostředí – kontejneru.
Od virtuálního stroje (VM) se kontejner liší tím, že nepotřebuje simulovat vlastní hardware ani nést kompletní operační systém. Jádro operačního systému si totiž vypůjčuje od hostitele. Proto je o dost lehčí a nastartuje se za pár sekund.
Představte si to jako stěhování. S virtuálním strojem se stěhujete i s celým domem – základy, rozvody, všechno. Kontejner je stěhování do bytu, který už stojí a má zavedenou vodu i elektřinu. Berete si jen svoje věci, zbytek (jádro operačního systému) tam na vás čeká.

Na obrázku vidíte, jak se virtuální stroje liší od kontejnerů. App jsou vaše aplikace, Bins/Libs programy a knihovny, které k běhu potřebují. Guest OS je celý virtualizovaný operační systém uvnitř virtuálního stroje. O ten se stará hypervisor – simuluje a spravuje virtualizovaný počítač, na kterém Guest OS „běží“. Host OS je operační systém fyzického serveru.
U Dockeru podobnou roli plní Docker Engine – software na hostitelském systému, který řídí celý život kontejnerů: spouštění, izolaci, síťování, práci s obrazy aplikací i s daty. Celý operační systém se ale nevirtualizuje, kontejnery sdílí jádro hostitele (Host Linux).
Co vám to reálně přinese:
- Reprodukovatelnost: Kontejner spuštěný lokálně by se měl chovat stejně i na VPS. V praxi je to spíš ideál – drobné rozdíly (třeba v architektuře CPU nebo síťovém nastavení) se občas najdou.
- Izolace: Aplikace si navzájem nelezou do zelí. A vyřeší to i situace, které bez Dockeru na jednom serveru prakticky řešit nejdou. Jedna aplikace potřebuje MySQL 5.7, druhá MySQL 8. S Dockerem běží každá databáze ve vlastním kontejneru a aplikace si jen vyberou tu svou.
- Snadné nasazení: Jeden příkaz a aplikace běží. Bez ruční instalace závislostí.
- Aktualizace a rollback bez stresu: Stáhnete nový image, zastavíte starý kontejner, spustíte nový. Když se něco pokazí, vrátíte se o krok zpátky stejně rychle.
Docker na VPS u Váš Hosting
Dobrá zpráva: u Váš Hosting nemusíte nic speciálního řešit. Na VPS máte root přístup přes SSH, takže si Docker nainstalujete a spravujete stejně jako na jakémkoliv jiném linuxovém serveru. A pokud se vám do příkazové řádky nechce, samotný Docker nainstalujete i na pár kliků přímo z VPS Centra.
A od verze 3.3 zvládne i vaši vlastní aplikaci. Nahrajete ZIP nebo dáte URL veřejného GitHub repozitáře, VPS Centrum rozpozná Node.js nebo Python, postaví image a spustí kontejner na vaší doméně s HTTPS. Logy, statistiky i limit paměti pak máte přímo v administraci, bez SSH. Celý postup rozebíráme v článku Jak nasadit vlastní aplikaci bez ruční konfigurace.
Docker Compose zatím ve VPS Centru nenajdete. Stack z několika propojených služeb si postavíte přes SSH – a přesně o tom je zbytek tohohle článku.
Instalace Dockeru na Debian
Jedna rada, kterou budete číst všude, a je pravdivá: instalujte vždy z oficiálního repozitáře Dockeru, ne z výchozích repozitářů distribuce. Ty totiž typicky obsahují starší verze – nainstalovali byste si zastaralý Docker hned od začátku.
Následující příkazy počítají s tím, že je spouštíte pod běžným uživatelem. Pokud jste na VPS přihlášeni jako root (což bývá výchozí stav), sudo z příkazů jednoduše vynechte – pozor, někde není jen na začátku řádku, ale i uprostřed.
# Přidej GPG klíč a repozitář
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
# Nainstaluj Docker
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Ověř, že daemon socket opravdu běží a Docker funguje
sudo systemctl status docker
sudo docker run hello-world
docker compose version
Příkaz docker run hello-world je malá zkouška na závěr – pokud se vypíše přátelská hláška od Dockeru, máte vyhráno.
Poslední krok se týká jen situace, kdy na VPS nepracujete pod uživatelem root (ten má oprávnění ke všemu, takže tenhle krok přeskočte). Přidejte uživatele do skupiny docker, ať nemusíte pořád psát sudo:
sudo usermod -aG docker $USER
První kontejner: základní příkazy
# Spusť kontejner (stáhne image, pokud ho nemáte)
docker run nginx
# Spusť kontejner na pozadí a namapuj port (port 80 z kontejneru na port 8080 hostitele)
docker run -d -p 8080:80 nginx
# Vypiš běžící kontejnery
docker ps
# Zastav kontejner
docker stop <id>
# Zobraz logy
docker logs <id>
Jedna věc, na kterou se často zapomíná: data uložená přímo uvnitř kontejneru zmizí, jakmile ho vypnete. Pro databáze, nahrané soubory nebo cokoliv, co chcete mít i zítra, potřebujete persistentní úložiště – buď volume, nebo bind mount.
Volume spravuje Docker za vás a je to bezpečná výchozí volba pro data aplikace. Bind mount naproti tomu mapuje konkrétní adresář z hostitelského serveru přímo do kontejneru – stejně jako se výše mapovaly porty, jen místo portu jde o složku. Hodí se, když k datům chcete mít přímý přístup na serveru, typicky u konfiguračních souborů. Které z toho zvolit, závisí na tom, jestli chcete data držet „schovaná“ pod Dockerem, nebo je mít po ruce ve svém adresáři.
V praxi vypadá rozdíl takhle:
# Volume – Docker si data spravuje sám (kde přesně leží, řešit nemusíte)
docker run -d -v mysql-data:/var/lib/mysql mysql:8
# Bind mount – mapujete konkrétní složku ze serveru
docker run -d -v /home/uzivatel/nginx-conf:/etc/nginx/conf.d nginx
V prvním případě vytvoří Docker volume s názvem mysql-data a databáze do něj ukládá data – přežijí i smazání kontejneru. Ve druhém případě kontejner čte konfiguraci Nginx přímo z vaší složky na serveru: upravíte soubor, restartujete kontejner a změna platí.
Docker Compose: multi-service aplikace
Jakmile máte víc než jeden kontejner, ruční docker run přestává být zábava. Docker Compose vám dovolí popsat celou aplikaci – web server, databázi, cache – v jednom souboru docker-compose.yml a vše ovládat najednou. Doporučujeme ho použít i pro jedinou službu: konfigurace se ovládá pohodlněji a hlavně je verzovatelná, takže víte, co jste změnili a jak konfigurace vypadala v minulosti.
Příklad: Immich + AI rozšíření Immich + PostgreSQL (databáze) + Redis (cache)
#
# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
#
# Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
# extends:
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
volumes:
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
ports:
- '2283:2283'
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- model-cache:/cache
env_file:
- .env
restart: always
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:4963247afc4cd33c7d3b2d2816b9f7f8eeebab148d29056c2ca4d7cbc966f2d9
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
# Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
# DB_STORAGE_TYPE: 'HDD'
volumes:
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
shm_size: 128mb
restart: always
healthcheck:
disable: false
volumes:
model-cache:
VPS Centrum
Vyzkoušejte zdarma naši aplikaci pro správu serveru a domén. Budete si připadat jako zkušený administrátor.
Bezpečnost: co nezapomenout
Tady se hodí nalít si čistého vína – Docker vám sám o sobě bezpečnost nezajistí, jen vám dá nástroje a pak už je to na vás.
Tři věci, na které se opravdu vyplatí dát pozor:
- Nevystavujte porty do světa zbytečně: -p 0.0.0.0:3306:3306 zpřístupní databázi klidně celému internetu. Pokud ji potřebuje jen jiný kontejner, nechte port neexponovaný a komunikujte přes interní Docker síť.
- Nenechte aplikaci v kontejneru běžet jako root, kde to není nutné: V Dockerfile na to stačí instrukce USER, kde uvedete neprivilegovaného uživatele – jeden řádek navíc, který Vám ušetří nervy při případném úniku.
- Docker umí nechtěně obejít firewall serveru: Když publikujete port přes -p, zapíše si Docker vlastní pravidla přímo do iptables – a ta se vyhodnotí dřív než pravidla, která spravuje třeba UFW. Výsledek: port kontejneru může být dostupný z internetu, i když ho máte ve firewallu zakázaný. Řešení: porty, které nemají jít ven, vůbec nepublikujte, nebo je navažte jen na localhost (-p 127.0.0.1:3306:3306), případně nastavte firewall tak, aby s chováním Dockeru explicitně počítal.
docker pull vas-image && docker compose up -d
Jeden příkaz, novější a bezpečnější verze.
Jak spravovat a udržovat Docker
Nepoužívané kontejnery a images se na disku hromadí potichu, ale jistě:
# Smaž zastavené kontejnery, nevyužité images a sítě, build cache
docker system prune -a
A aby vám kontejner naskočil sám i po restartu serveru, nastavte restart policy:
docker run --restart unless-stopped ...
Nebo v docker-compose.yml:
restart: unless-stopped
Kolik RAM Docker vlastně potřebuje
Samotný Docker engine si bere minimum. Každý kontejner ale alokuje paměť pro svou aplikaci a její běhové prostředí – jednoduchý Nginx web si vystačí s desítkami MB, databázový kontejner může chtít klidně jednotky GB.
Tak co, rozjedete první kontejner?
Docker není magie, jen šikovně zabalená krabička, která vám ušetří spoustu času. Instalace zabere pár minut, první kontejner ještě míň. A jakmile jednou zkusíte Docker Compose, pro běžný provoz se vám k ručnímu docker run už nebude chtít vracet – i když pro rychlý experiment nebo ladění má občas smysl sáhnout právě po něm.
Časté otázky
Mohu Docker spravovat přes VPS Centrum?
Částečně ano. Docker nainstalujete na klik a od verze 3.3 zvládnete přes VPS Centrum i nasadit vlastní aplikaci v Node.js nebo Pythonu – včetně domény, HTTPS, logů, statistik a limitu paměti.
Docker Compose zatím nepodporujeme, takže vícesložkové stacky si postavíte přes SSH. Na ty VPS Centrum nesahá, spravuje si jen své vlastní kontejnery.
Pro první kroky doporučujeme sáhnout po nativní serverové databázi, kterou už na VPS máte i se zálohami, a Docker si nechat jen na aplikační logiku. Ušetříte si starost o zálohování databázového kontejneru.
Freelo - Nástroj na řízení úkolů a projektů
Přidej se, pozvi svůj tým a klienty, rozděl práci a sleduj, jak se úkoly dají do pohybu.
Co jsou Docker volumes a proč je potřebuji?
Volume je úložiště, které spravuje Docker mimo kontejner a namapuje ho dovnitř. Data uvnitř kontejneru bez volume zaniknou, jakmile ho smažete. Databáze a nahrané soubory proto do volume patří vždycky. U konfiguračních souborů je obvykle praktičtější bind mount, protože k nim máte přímý přístup ve svém adresáři na serveru.
Může Docker obejít firewall na mém serveru?
U publikovaných portů (-p) ano – Docker si píše vlastní pravidla do iptables, která můžou obejít standardní firewall. Řešení je nepublikovat porty, které nemají jít ven, a komunikaci řešit přes interní Docker síť.
Mohu na jednom VPS provozovat víc aplikací v Dockeru?
Ano. Každá aplikace běží v izolovaném kontejneru, případně ve svém Docker Compose stacku s vlastními podpůrnými službami (databází, cache apod.). Reverzní proxy (např. Nginx) pak požadavky nasměruje na správný kontejner podle domény.