Prejsť na obsah
Aktuálny kupón:zľava 10 %Uplatniť v objednávke

Docker a Docker Compose na VPS: inštalácia a prvá aplikácia

Nainštalujete Docker z oficiálneho repozitára, spustíte WordPress s MariaDB cez Docker Compose a naučíte sa kontajnery spravovať, aktualizovať, zálohovať a chrániť firewallom.

  • pokročilý
  • ~25 min
  • Aktualizované 9. 10. 2026

Docker spúšťa aplikácie v izolovaných kontajneroch, ktoré si so sebou nesú všetko potrebné. Nainštalujeme ho z oficiálneho repozitára, cez Docker Compose spustíme WordPress s databázou a prejdeme správu, aktualizácie, firewall a zálohy.

Čo budete potrebovať

  • VPS u StormHostu s Ubuntu 24.04 alebo Debianom 13
  • Pripojenie cez SSH ako root (návod)
  • Pre WordPress s HTTPS doménu nasmerovanú na VPS
  • Približne 25 minút

Ako to funguje#

PojemČo to je
Obraz (image)Pripravená šablóna aplikácie: systémové knižnice, program a jeho nastavenie. Sťahuje sa z registra, najčastejšie z Docker Hubu (napríklad wordpress, mariadb).
Kontajner (container)Bežiaca inštancia obrazu. Má vlastný súborový systém a sieť, ale zdieľa jadro systému s VPS. Kontajner sa dá kedykoľvek zmazať a vytvoriť znova z rovnakého obrazu.
VolumeTrvalé úložisko dát mimo kontajnera. Dáta vo volume prežijú zmazanie aj aktualizáciu kontajnera. Všetko, čo sa má zachovať, musí byť vo volume.
PortKontajner má vlastnú sieť. Aby bol dostupný zvonku, jeho port sa „publikuje“ na port VPS.
Docker ComposeNástroj, ktorý podľa jedného súboru compose.yaml spustí celú aplikáciu zloženú z viacerých kontajnerov (napríklad web a databázu).

Inštalácia#

Docker inštalujte z oficiálneho repozitára Dockeru. Balík docker.io z repozitára distribúcie býva starší a koliduje s oficiálnymi balíkmi.

Najprv odstráňte prípadné kolidujúce balíky. Na čistom VPS príkaz nič nenájde, to je v poriadku.

Ubuntu 24.04

bash
apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)

Debian 13

bash
apt remove $(dpkg --get-selections docker.io docker-compose docker-doc docker-buildx podman-docker containerd runc | cut -f1)
  • dpkg --get-selections … – vypíše z uvedených balíkov tie, ktoré sú nainštalované.
  • | cut -f1 – nechá z výpisu iba názvy balíkov.
  • apt remove $(…) – odinštaluje ich. Dáta v /var/lib/docker zostanú.

Potom pridajte repozitár Dockeru a nainštalujte ho:

Ubuntu 24.04

bash
apt update
apt -y install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt update
apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Debian 13

bash
apt update
apt -y install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt update
apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Čo jednotlivé riadky robia:

PríkazČo robí
apt -y install ca-certificates curlCertifikáty pre HTTPS a sťahovací program.
install -m 0755 -d /etc/apt/keyringsVytvorí priečinok pre podpisové kľúče repozitárov s právami 0755.
curl -fsSL …/gpg -o /etc/apt/keyrings/docker.ascStiahne podpisový kľúč Dockeru. -f = pri chybe HTTP skončiť chybou, -s = ticho, -S = ukázať chyby, -L = nasledovať presmerovania.
chmod a+r …/docker.ascKľúč smú čítať všetci (apt ho číta pod iným používateľom).
tee /etc/apt/sources.list.d/docker.sources <<EOF … EOFZapíše opis repozitára do súboru.
Types: debRepozitár s binárnymi balíkmi.
URIs:Adresa repozitára pre váš systém.
Suites: $(…)Kódové meno systému (noble pre Ubuntu 24.04, trixie pre Debian 13), doplní sa samo.
Components: stableIba stabilné vydania.
Architectures: $(dpkg --print-architecture)Architektúra procesora (amd64).
Signed-By:Balíky musia byť podpísané týmto kľúčom, inak ich apt odmietne.
apt -y install docker-ce …Nainštaluje Docker Engine (docker-ce), príkazový riadok (docker-ce-cli), behové prostredie kontajnerov (containerd.io), zostavovanie obrazov (docker-buildx-plugin) a Compose (docker-compose-plugin).

Docker sa po inštalácii sám spustí a zapne po štarte VPS. Overte inštaláciu:

bash
docker run --rm hello-world
docker compose version
  • docker run --rm hello-world – stiahne testovací obraz a spustí ho; --rm kontajner po skončení zmaže. Uvidíte Hello from Docker!.
  • docker compose version – vypíše verziu Compose, napríklad Docker Compose version v5.…. Po verzii 2 prešiel Compose rovno na číslo 5, staršie inštalácie preto ukazujú v2.…. Príkazy v návode fungujú v oboch.

Skupina docker = práva roota

Kto je v skupine docker, môže spúšťať kontajnery s prístupom k celému disku VPS, teda má fakticky práva roota. Do skupiny pridávajte iba ľudí, ktorým by ste dali aj root. Ak pracujete ako root, skupinu nepotrebujete.

Prvá aplikácia: WordPress s MariaDB#

Projekt a heslá#

  1. Vytvorte priečinok projektu a prejdite doň:

    bash
    mkdir -p /opt/wordpress
    cd /opt/wordpress

    Názov priečinka (wordpress) sa stane názvom projektu Compose a predponou názvov kontajnerov a volumes.

  2. Vytvorte súbor s heslami nano .env. Heslá vygenerujte v generátore hesiel (iba písmená a číslice):

    /opt/wordpress/.envini
    DB_PASSWORD=<HESLO_DATABAZE>
    DB_ROOT_PASSWORD=<HESLO_ROOT_DATABAZE>
    • DB_PASSWORD – heslo databázového používateľa WordPressu.
    • DB_ROOT_PASSWORD – heslo používateľa root vnútri databázového kontajnera (na zálohy a správu).
  3. Obmedzte čítanie súboru iba na roota:

    bash
    chmod 600 .env

Súbor compose.yaml#

Vytvorte nano compose.yaml s obsahom:

/opt/wordpress/compose.yamlYAML
services:
  db:
    image: mariadb:lts
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wordpress
      MARIADB_PASSWORD: ${DB_PASSWORD}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      start_period: 10s
      interval: 10s
      timeout: 5s
      retries: 3

  wordpress:
    image: wordpress:latest
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "127.0.0.1:8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:

Riadok po riadku:

RiadokČo robí
services:Zoznam kontajnerov aplikácie. Názov služby (db, wordpress) slúži aj ako meno v sieti projektu.
image: mariadb:ltsOficiálny obraz MariaDB, značka lts = posledná verzia s dlhodobou podporou.
restart: unless-stoppedKontajner sa po páde aj po reštarte VPS spustí znova, ak ste ho sami nezastavili.
MARIADB_DATABASE, MARIADB_USER, MARIADB_PASSWORDPri prvom štarte vytvorí databázu a používateľa s heslom.
MARIADB_ROOT_PASSWORDHeslo roota databázy, nastaví sa pri prvom štarte.
${DB_PASSWORD}Hodnota sa doplní zo súboru .env v rovnakom priečinku. Heslá tak nie sú priamo v compose.yaml.
volumes: - db_data:/var/lib/mysqlDáta databázy sa ukladajú do volume db_data, takže prežijú aktualizáciu kontajnera.
healthcheck:Docker každých 10 s skontroluje skriptom healthcheck.sh z obrazu MariaDB, že databáza prijíma spojenia a je inicializovaná.
depends_on: db: condition: service_healthyWordPress sa spustí až vo chvíli, keď je databáza pripravená.
image: wordpress:latestOficiálny obraz WordPressu (Apache + PHP).
ports: - "127.0.0.1:8080:80"Port 80 kontajnera bude dostupný na porte 8080 VPS, ale iba z VPS samotného (127.0.0.1). Zvonku sa k nemu dostane iba cez Nginx.
WORDPRESS_DB_HOST: dbAdresa databázy: meno služby db v sieti projektu.
WORDPRESS_DB_USER, …_PASSWORD, …_NAMEPrihlásenie k databáze; musí zodpovedať hodnotám pri službe db.
volumes: - wp_data:/var/www/htmlSúbory WordPressu (pluginy, šablóny, nahrané obrázky) sú vo volume wp_data.
volumes: na konciDeklarácia pomenovaných volumes, ktoré projekt používa.

Spustenie#

bash
docker compose up -d
docker compose ps
  • docker compose up -d – stiahne obrazy, vytvorí sieť, volumes a kontajnery a spustí ich na pozadí (-d, detached).
  • docker compose ps – vypíše kontajnery projektu a ich stav. Pri db uvidíte healthy, pri wordpress Up.

Kontrola z VPS: curl -I http://127.0.0.1:8080 vráti hlavičky odpovede WordPressu (presmerovanie na inštaláciu).

Premenné MARIADB_* platia iba pri prvom štarte

Databáza sa vytvorí pri prvom spustení s prázdnym volume. Neskoršia zmena hesla v .env heslo v databáze nezmení. Heslo zmeňte v databáze príkazom ALTER USER (pozri MariaDB na VPS) a až potom v .env.

Sprístupnenie cez Nginx a HTTPS#

WordPress teraz počúva iba na 127.0.0.1:8080. Sprístupníte ho cez Nginx ako reverse proxy podľa návodu Nginx a HTTPS: v konfigurácii použite proxy_pass http://127.0.0.1:8080; a doménu, napríklad blog.example.cz, a potom získajte certifikát cez certbot --nginx -d blog.example.cz.

Obraz WordPressu sám rozpozná HTTPS z hlavičky X-Forwarded-Proto, ktorú Nginx podľa návodu posiela. Nakoniec otvorte https://blog.example.cz a dokončite inštaláciu WordPressu v prehliadači.

Správa kontajnerov#

Príkazy docker compose spúšťajte v priečinku projektu (cd /opt/wordpress).

PríkazČo robí
docker compose psStav kontajnerov projektu.
docker compose logs -fVýpis logov všetkých služieb; -f = sledovať priebežne (ukončíte Ctrl+C). Iba jedna služba: docker compose logs -f wordpress.
docker compose restartReštartuje kontajnery.
docker compose stop / startZastaví / spustí kontajnery, nič nemaže.
docker compose up -dPo zmene compose.yaml vytvorí znova iba zmenené kontajnery.
docker compose downZastaví a zmaže kontajnery a sieť. Volumes s dátami zostanú.
docker compose exec db mariadb -uroot -pSpustí príkaz vnútri bežiaceho kontajnera (tu konzolu MariaDB).
docker compose configSkontroluje compose.yaml a vypíše ho s doplnenými hodnotami z .env (pozor, ukáže aj heslá).

Aktualizácia na nové verzie obrazov:

bash
docker compose pull
docker compose up -d
docker image prune -f
  • docker compose pull – stiahne nové verzie obrazov.
  • docker compose up -d – vytvorí znova kontajnery, ktoré majú novší obraz. Dáta vo volumes zostanú.
  • docker image prune -f – zmaže staré, už nepoužívané obrazy; -f bez potvrdenia.

docker compose down -v zmaže dáta

Prepínač -v pri docker compose down zmaže aj volumes projektu, teda databázu a súbory WordPressu. Nedá sa to vrátiť. Používajte ho iba vtedy, keď chcete aplikáciu odstrániť úplne a máte zálohu.

Možnosti nastavenia restart::

HodnotaKedy sa kontajner spustí znova
noNikdy (predvolené).
alwaysVždy, aj keď ste ho ručne zastavili (po reštarte Dockeru alebo VPS).
on-failureIba keď skončí chybou.
unless-stoppedVždy, okrem prípadu, keď ste ho zastavili sami. Odporúčané pre služby.

Porty a firewall#

Docker publikuje porty kontajnerov vlastnými pravidlami firewallu, ktoré obchádzajú UFW. Port publikovaný ako 8080:80 je dostupný z internetu, aj keď ho v UFW nepovolíte. Podrobne to vysvetľuje návod Firewall UFW.

Zápis v ports:Kto sa na port dostane
"8080:80"Ktokoľvek z internetu, bez ohľadu na UFW.
"127.0.0.1:8080:80"Iba procesy na VPS (napríklad Nginx). Odporúčané pre weby za Nginxom.
bez ports:Iba ostatné kontajnery v rovnakej sieti projektu (typicky databáza).

Databázu a ďalšie interné služby nepublikujte vôbec. Porty, ktoré majú byť verejné (napríklad herný server v kontajneri), obmedzujte firewallom v zákazníckom účte (návod). Ten stojí pred VPS a Docker ho obísť nemôže.

Upratovanie miesta na disku#

Obrazy, zastavené kontajnery a logy časom zaberú veľa miesta.

bash
docker system df
docker system prune
  • docker system df – koľko miesta zaberajú obrazy, kontajnery, volumes a cache.
  • docker system prune – po potvrdení zmaže zastavené kontajnery, nepoužívané siete, obrazy bez názvu a cache zostavovania. Volumes s dátami bez prepínača --volumes nemaže.

Opatrne s mazaním volumes a s -a

docker system prune --volumes zmaže aj nepoužívané anonymné volumes (bez mena, vznikajú napríklad pri docker run bez -v). Ak v nich boli dáta kontajnera, ktorý je práve zmazaný alebo zastavený, sú preč. docker volume prune -a zmaže aj pomenované volumes ako wordpress_db_data, keď ich nepoužíva žiadny kontajner, napríklad po docker compose down. docker system prune -a zmaže všetky obrazy, ktoré nepoužíva žiadny kontajner. Pred potvrdením si prečítajte, čo príkaz vypíše, že zmaže.

Logy kontajnerov sa v predvolenom nastavení neotáčajú a môžu zaplniť disk. Nastavte ovládač local, ktorý staré logy maže sám (v predvolenom stave drží najviac 5 súborov po 20 MB na kontajner). Vytvorte súbor nano /etc/docker/daemon.json s obsahom nižšie. Ak súbor už existuje, neprepisujte ho, iba doň doplňte riadok "log-driver" (položky oddelené čiarkou):

/etc/docker/daemon.jsonJSON
{
  "log-driver": "local"
}

Potom reštartujte Docker (systemctl restart docker) a kontajnery vytvorte znova (docker compose up -d --force-recreate). Nastavenie platí iba pre novo vytvorené kontajnery.

Zálohy#

Zálohujte volumes, nie kontajnery. Kontajner vytvoríte znova z obrazu, dáta nie.

  1. Vytvorte priečinok pre zálohy: mkdir -p /root/zalohy.

  2. Databázu zálohujte exportom (konzistentnejšie než kópia súborov):

    bash
    cd /opt/wordpress
    docker compose exec -T db sh -c 'exec mariadb-dump --single-transaction --all-databases -uroot -p"$MARIADB_ROOT_PASSWORD"' > /root/zalohy/wp-db-$(date +%F).sql
    • docker compose exec -T db – spustí príkaz v kontajneri db; -T vypne terminál, aby sa výstup dal presmerovať do súboru.
    • sh -c '…' – príkaz prebehne v shelli kontajnera, kde je premenná $MARIADB_ROOT_PASSWORD nastavená.
    • mariadb-dump --single-transaction --all-databases – export všetkých databáz bez zamykania.
    • > /root/zalohy/… – výstup sa uloží na VPS mimo kontajnera.
  3. Súbory WordPressu zálohujte zabalením volume:

    bash
    docker run --rm -v wordpress_wp_data:/data:ro -v /root/zalohy:/backup alpine tar czf /backup/wp-files-$(date +%F).tar.gz -C /data .
    • docker run --rm – spustí jednorazový kontajner, ktorý sa po skončení zmaže.
    • -v wordpress_wp_data:/data:ro – pripojí volume wp_data projektu wordpress iba na čítanie (ro).
    • -v /root/zalohy:/backup – pripojí priečinok záloh z VPS.
    • alpine tar czf … -C /data . – v malom obraze Alpine zabalí obsah volume do archívu.

    Presné názvy volumes vypíše docker volume ls.

Automatické spúšťanie záloh cronom a ich prenos mimo VPS opisuje návod Zálohy na VPS.

Overenie#

  • docker compose ps ukazuje oba kontajnery ako bežiace, databázu ako healthy.
  • https://blog.example.cz zobrazí WordPress so zámkom v adresnom riadku.
  • Po reštarte VPS (reboot) sa kontajnery spustia samy.
  • Z iného počítača sa na http://<IP_ADRESA_VPS>:8080 nepripojíte (port je iba na 127.0.0.1).

Keď niečo nefunguje#

permission denied while trying to connect to the Docker daemon socket#

Nie ste root a váš používateľ nie je v skupine docker. Spustite príkaz cez sudo, alebo sa prihláste ako root.

Bind for 127.0.0.1:8080 failed: port is already allocated alebo address already in use#

Port 8080 už používa iný kontajner (prvé hlásenie) alebo iný program na VPS (druhé hlásenie). Zistite ktorý (ss -tlnp | grep 8080, docker ps) a v compose.yaml zvoľte iný port, napríklad 127.0.0.1:8081:80. Potom upravte aj proxy_pass v Nginxe.

WordPress hlási „Error establishing a database connection“#

Databáza ešte nie je pripravená alebo nesedia prihlasovacie údaje. Pozrite sa do logu databázy (docker compose logs db). Ak ste menili heslo v .env až po prvom štarte, databáza má stále staré heslo (pozri upozornenie v kapitole Spustenie).

Kontajner je stále v stave Restarting#

Aplikácia v kontajneri hneď po štarte padá. Príčinu nájdete v logu: docker compose logs --tail 50 <NAZEV_SLUZBY>.

toomanyrequests: You have reached your unauthenticated pull rate limit#

Docker Hub obmedzuje sťahovanie obrazov bez prihlásenia na 100 za 6 hodín z jednej IP adresy. Počkajte, alebo sa prihláste svojím účtom Docker Hubu: docker login.

no space left on device#

Došlo miesto na disku. Zistite, čo ho zaberá (docker system df, df -h), a uprac­te podľa kapitoly Upratovanie miesta na disku. Ak miesto naozaj chýba, navýšte RAM v záložke Zmena balíka, disk rastie s pamäťou.

Zhrnutie

  • Docker inštalujte z oficiálneho repozitára download.docker.com, nie balík docker.io.
  • Dáta patria do volumes; kontajnery sa dajú kedykoľvek zmazať a vytvoriť znova.
  • Weby publikujte na 127.0.0.1 a sprístupnite cez Nginx s HTTPS; Docker inak obchádza UFW.
  • Aktualizácia: docker compose pull a docker compose up -d.
  • docker compose down -v a prune --volumes mažú dáta, zálohujte volumes pravidelne.

Hľadanie v návodoch