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. |
| Volume | Trvalé ú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. |
| Port | Kontajner má vlastnú sieť. Aby bol dostupný zvonku, jeho port sa „publikuje“ na port VPS. |
| Docker Compose | Ná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
apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)Debian 13
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/dockerzostanú.
Potom pridajte repozitár Dockeru a nainštalujte ho:
Ubuntu 24.04
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-pluginDebian 13
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 curl | Certifikáty pre HTTPS a sťahovací program. |
install -m 0755 -d /etc/apt/keyrings | Vytvorí priečinok pre podpisové kľúče repozitárov s právami 0755. |
curl -fsSL …/gpg -o /etc/ | Stiahne podpisový kľúč Dockeru. -f = pri chybe HTTP skončiť chybou, -s = ticho, -S = ukázať chyby, -L = nasledovať presmerovania. |
chmod a+r …/docker.asc | Kľúč smú čítať všetci (apt ho číta pod iným používateľom). |
tee /etc/ | Zapíše opis repozitára do súboru. |
Types: deb | Repozitá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: stable | Iba 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:
docker run --rm hello-world
docker compose versiondocker run --rm hello-world– stiahne testovací obraz a spustí ho;--rmkontajner po skončení zmaže. UvidíteHello from Docker!.docker compose version– vypíše verziu Compose, napríkladDocker 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á#
Vytvorte priečinok projektu a prejdite doň:
bash mkdir -p /opt/wordpress cd /opt/wordpressNázov priečinka (
wordpress) sa stane názvom projektu Compose a predponou názvov kontajnerov a volumes.Vytvorte súbor s heslami
nano .env. Heslá vygenerujte v generátore hesiel (iba písmená a číslice):/opt/ wordpress/ ini.env 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).
Obmedzte čítanie súboru iba na roota:
bash chmod 600 .env
Súbor compose.yaml#
Vytvorte nano compose.yaml s obsahom:
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:lts | Oficiálny obraz MariaDB, značka lts = posledná verzia s dlhodobou podporou. |
restart: unless-stopped | Kontajner sa po páde aj po reštarte VPS spustí znova, ak ste ho sami nezastavili. |
MARIADB_DATABASE, MARIADB_USER, MARIADB_PASSWORD | Pri prvom štarte vytvorí databázu a používateľa s heslom. |
MARIADB_ROOT_PASSWORD | Heslo 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/mysql | Dá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_healthy | WordPress sa spustí až vo chvíli, keď je databáza pripravená. |
image: wordpress:latest | Oficiá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: db | Adresa databázy: meno služby db v sieti projektu. |
WORDPRESS_DB_USER, …_PASSWORD, …_NAME | Prihlásenie k databáze; musí zodpovedať hodnotám pri službe db. |
volumes: - wp_data:/var/www/html | Súbory WordPressu (pluginy, šablóny, nahrané obrázky) sú vo volume wp_data. |
volumes: na konci | Deklarácia pomenovaných volumes, ktoré projekt používa. |
Spustenie#
docker compose up -d
docker compose psdocker 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. Pridbuvidítehealthy, priwordpressUp.
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 ps | Stav kontajnerov projektu. |
docker compose logs -f | Vý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 restart | Reštartuje kontajnery. |
docker compose stop / start | Zastaví / spustí kontajnery, nič nemaže. |
docker compose up -d | Po zmene compose.yaml vytvorí znova iba zmenené kontajnery. |
docker compose down | Zastaví a zmaže kontajnery a sieť. Volumes s dátami zostanú. |
docker compose exec db mariadb -uroot -p | Spustí príkaz vnútri bežiaceho kontajnera (tu konzolu MariaDB). |
docker compose config | Skontroluje compose.yaml a vypíše ho s doplnenými hodnotami z .env (pozor, ukáže aj heslá). |
Aktualizácia na nové verzie obrazov:
docker compose pull
docker compose up -d
docker image prune -fdocker 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;-fbez 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::
| Hodnota | Kedy sa kontajner spustí znova |
|---|---|
no | Nikdy (predvolené). |
always | Vždy, aj keď ste ho ručne zastavili (po reštarte Dockeru alebo VPS). |
on-failure | Iba keď skončí chybou. |
unless-stopped | Vž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.
docker system df
docker system prunedocker 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--volumesnemaž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):
{
"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.
Vytvorte priečinok pre zálohy:
mkdir -p /root/zalohy.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).sqldocker compose exec -T db– spustí príkaz v kontajneridb;-Tvypne terminál, aby sa výstup dal presmerovať do súboru.sh -c '…'– príkaz prebehne v shelli kontajnera, kde je premenná$MARIADB_ROOT_PASSWORDnastavená.mariadb-dump --single-transaction --all-databases– export všetkých databáz bez zamykania.> /root/zalohy/…– výstup sa uloží na VPS mimo kontajnera.
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_– pripojí volumewp_ data:/ data: ro wp_dataprojektuwordpressiba 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 psukazuje oba kontajnery ako bežiace, databázu akohealthy.https://blog.example.czzobrazí 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://nepripojíte (port je iba na<IP_ ADRESA_ VPS>: 8080 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 upracte 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íkdocker.io. - Dáta patria do volumes; kontajnery sa dajú kedykoľvek zmazať a vytvoriť znova.
- Weby publikujte na
127.0.0.1a sprístupnite cez Nginx s HTTPS; Docker inak obchádza UFW. - Aktualizácia:
docker compose pulladocker compose up -d. docker compose down -vaprune --volumesmažú dáta, zálohujte volumes pravidelne.
Ďalšie zdroje#
- Docker: Install Docker Engine on Ubuntu (otvorí sa v novom okne)
- Docker: Install Docker Engine on Debian (otvorí sa v novom okne)
- Docker: Packet filtering and firewalls (otvorí sa v novom okne)
- Docker: Port publishing (otvorí sa v novom okne)
- Docker: Compose file reference (otvorí sa v novom okne)
- Docker Hub: wordpress (otvorí sa v novom okne)
- Docker Hub: mariadb (otvorí sa v novom okne)