Kompletní průvodce nasazením aplikací pomocí Docker Compose

Poslední aktualizace: 13/01/2026
Autor: Isaac
  • Docker Compose umožňuje definovat a orchestrovat aplikace s více kontejnery pomocí souboru YAML, což zjednodušuje složité nasazení.
  • Služby, sítě a svazky jsou popsány deklarativně, což usnadňuje uchování dat a bezpečnou interní komunikaci.
  • Příkazy jako nahoru, dolů, protokoly, exec a build pokrývají kompletní životní cyklus projektů spravovaných pomocí Compose.
  • Jediný soubor docker-compose.yml umožňuje reprodukovatelné nasazení jak lokálně, tak na cloudových serverech nebo VPS spravovaných přes konzoli nebo Portainer.

Nasazení aplikací pomocí Docker Compose

Práce s kontejnery se stala každodenní záležitostí. Pro téměř každý vývojový tým, a když se aplikace posune od jednoduché služby a začne zahrnovat databázi, mezipaměť, frontend a další mikroslužby, se ruční správa toho všeho stává skutečnou komplikací. A právě zde přichází na řadu Docker Compose, nástroj navržený přesně tak, abyste nemuseli spouštět kontejner po kontejneru, ručně konfigurovat sítě nebo si pamatovat každý jednotlivý zdlouhavý příkaz.

Cílem tohoto článku je naučit se, jak nasazovat kompletní aplikace pomocí Docker Compose.Tento kurz se bude zabývat lokálními i serverovými aplikacemi a zajistí, že plně pochopíte funkci každé části souboru docker-compose.yml, jak fungují služby, svazky a sítě, jaké příkazy denně potřebujete a jak to vše zapadá do reálného kontextu s aplikací a databází Node.js. Pokud pocházíte z čistě vývojářského prostředí (frontend, mobilní aplikace, backend) a koncepty jako orchestrace a operace vám zní jako nesmysl, nebojte se: půjdeme krok za krokem, ale bez šetření detailů.

Základní požadavky na prostředí

Než začneme s nasazením čehokoli, potřebujete minimálně připravený základní systém.Typické a běžně používané prostředí pro nácvik a malé produkční projekty by mohlo vypadat nějak takto:

  • ubuntu 20.04 jako operační systém serveru nebo lokální počítač.
  • Docker 20.10.x nainstalovaný a funkční (démon aktivní).
  • Docker Compose 1.29.x nebo vyšší pro správu projektů s více kontejnery.
  • Node.js 18.x y NPM 8.x pokud budete vytvářet obrazy z aplikace Node.

Není povinné používat právě tyto verze.ale mají něco podobného a relativně nedávného. Na cloudových serverech, jako je VPS (Google Cloud, AWS, Arsys atd.) je obvyklou praxí nastavení virtuálního počítače LinuxNainstalujte Docker a poté na něj přidejte Docker Compose.

Co je Docker a co řeší Docker Compose?

Koncepty Dockeru a Compose

Docker je platforma pro balení a spouštění aplikací v izolovaných kontejnerech.Každý kontejner obsahuje pouze to, co je potřeba ke spuštění vašeho procesu (binární soubory, knihovny, běhové prostředí atd.), sdílí jádro s hostitelem, ale bez zasahování do ostatních služeb. Tím se eliminuje klasické dilema „na mém počítači to funguje“ a umožňuje se bezproblémově přesouvat aplikaci mezi různými počítači.

Docker Compose je na druhou stranu nástroj, který orchestruje více kontejnerů, jako by se jednalo o jednu aplikaci.Pokud byste měli jen jednoduchou službu, zvládli byste Docker Run, ale jakmile budete potřebovat:

  • Un frontend (Angular, React, Vue…)
  • Un backend (Node.js, Java, Python…)
  • A databáze (MySQL, PostgreSQL, MongoDB…)
  • Možná systém mezipaměti Typ Redis

Správa všech těchto kontejnerů po kontejnerech se stává nepraktickou.Compose umožňuje definovat celý „zásobník“ v jednom YAML souboru, deklarovat, které služby existují, jak se připojují, které porty zpřístupňují, které svazky používají a jaké proměnné prostředí potřebují.

Tento soubor se obvykle nazývá docker-compose.yml.I když se to dá nazvat i jinak, pokud to při spuštění příkazů zadáte pomocí -f. Funguje to jako recept: kdokoli s Dockerem a Docker Compose může replikovat stejnou kontejnerovou infrastrukturu na svém počítači nebo serveru.

Instalace Docker Compose na různé systémy

Instalace Docker Compose

Jediným předpokladem pro instalaci Docker Compose je spuštěný Docker.Odtud se proces mírně liší v závislosti na operačním systému:

Instalace na Linux (příklad Ubuntu)

Na distribucích jako Ubuntu si můžete Docker Compose nainstalovat stažením oficiálního binárního souboru. a udělení oprávnění ke spuštění. Typický vzorec je:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" \
  -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

Jakmile to uděláte, spusťte příkaz docker-compose --version ověřit, zda je příkaz dostupný a zda odpovídá správnou verzí.

Instalace na macOS

En Mac Nejjednodušší způsob je obvykle nainstalovat Docker Desktopkterý již má integrovaný Docker Engine a Docker Compose. Alternativně mnoho vývojářů používá Homebrew:

brew install docker-compose

S Docker Desktop se obvykle už nemusíte starat o kompozice.protože samotný balíček se stará o jeho aktualizaci spolu s Docker enginem.

Instalace ve Windows

En Windows Nejpraktičtějším řešením je použití Docker Desktop pro Windows.. Soubory ke stažení Spusťte instalační program z oficiálních webových stránek Dockeru a postupujte podle pokynů průvodce. Tím se připraví Docker i Compose. PowerShell nebo ve WSL2.

I když je možné s Dockerem pracovat i na nativních WindowsPro serióznější vývojová prostředí se obvykle doporučuje používat WSL2 s linuxovou distribucí nebo přímo se vzdáleným linuxovým virtuálním počítačem, kde Docker a Compose pracují blíže produkčnímu prostředí.

Základní struktura souboru docker-compose.yml

Struktura souboru Docker Compose

V souboru docker-compose.yml můžeme definovat několik hlavních blokůTo zahrnuje verzi formátu, služby, svazky, sítě a v některých případech i další konfigurace. Služby jsou nezbytné pro nasazení typické aplikace a svazky a sítě jsou nezbytné pro trvalé nasazení.

  Jak nainstalovat hry pro Windows pomocí Steamu na Linuxu

Služby: srdce aplikace

Každá služba v souboru Compose obvykle odpovídá kontejneru (nebo skupině kontejnerů), který poskytuje část aplikace.Například webová služba, databázová služba, služba mezipaměti atd. Definice každé služby podporuje řadu vlastností, mezi nimiž vynikají následující:

  • obrazDocker image, která bude použita pro kontejner (například nginx:latest, postgres:15, node:18…).
  • název_kontejneruExplicitní název kontejneru (volitelný; pokud není definován, Compose jej vygeneruje).
  • stavět: cesta k adresáři, kde se nachází Dockerfile pro sestavení image, pokud neexistuje, nebo pokud chceme vytvořit vlastní image.
  • příkaz: příkaz, který bude proveden při spuštění kontejneru (přepíše CMD (z obrázku).
  • portymapování portů ve formátu host:container, například „80:80“ nebo „3030:3030“.
  • objemypřipojení svazků (pojmenované svazky, připojení vázaných svazků atd.).
  • životní prostředí: proměnné prostředí, které jsou vloženy do kontejneru.
  • záleží na: označuje závislosti mezi službami, takže některé začínají dříve než jiné.
  • sítěSítě Docker, ke kterým se služba připojuje.
  • znovu: politika restartu (ne, vždy, při selhání, pokud není zastaveno).

Zajímavé je, že mnoho z těchto vlastností je volitelných.Službu byste mohli definovat pouze pomocí `image` a Compose by pak mohl spustit kontejner s výchozími hodnotami. Poté můžete podle potřeby doladit porty, sítě, proměnné atd.

Svazky: Perzistence a sdílení dat

Svazky v Dockeru jsou standardním mechanismem pro ukládání dat a jejich sdílení mezi kontejnery nebo s hostitelem.V Compose jsou obvykle deklarovány v sekci „svazky“ na kořenové úrovni a poté se na ně odkazují služby.

Objem může mít několik relevantních vlastností.:

  • řidič: typ ovladače svazku (výchozí, lokální).
  • driver_opts: specifické možnosti ovladače, kde můžete zadat:
    • typ: typ svazku („svazek“, „vázat“, „nfs“ atd.).
    • zařízení: cesta k hostiteli, kterého chcete připojit, v případě připojení typu bind.
    • omožnosti montáže (rw, ro atd.).
  • externí: pokud je svazek spravován externě (není vytvořen nástrojem Compose).
  • etikety: libovolné popisky.
  • název: název svazku, pokud si ho chcete přizpůsobit.
  • rozsah: rozsah svazku (obvykle lokální).

I když můžete nakonfigurovat mnoho detailů, v mnoha případech stačí deklarovat název svazku. a používat ho ve službě. Například pro databázi MySQL nebo PostgreSQL je typické mít datový svazek a někdy i připojení pro inicializační skripty.

Sítě: komunikace mezi kontejnery

Pokud má aplikace více modulů, obvykle budete chtít izolovat její provoz v interní síti. aby se frontend a backend, respektive backend a databáze, mohly vidět pouze navzájem a nebyly nekontrolovatelně vystaveny hostiteli.

Docker implementuje sítě s modelem inspirovaným třemi vrstvami:

  • Konečný bod: virtuální rozhraní, které připojuje kontejner k síti.
  • pískoviště: izolovaný síťový prostor kontejneru (jeho vlastní TCP/IP stack).
  • Síť: síť, která propojuje různé sandboxy prostřednictvím koncových bodů.

Mezi ovladače Nejběžnější síťové komponenty v Dockeru jsou:

Řidič Ambit popis
most Místní Je to výchozí síť na mnoha hostitelích Dockeru, která vytváří virtuální most na hostiteli a propojuje kontejnery navzájem.
hostitel Místní Zakázat izolaci sítě: kontejner sdílí síť hostitele přímo.
obložit Globální Umožňuje propojit kontejnery běžící na různých hostitelích Dockeru v rámci roje.
macvlan Globální Přiřaďte kontejneru MAC adresu, jako by se jednalo o fyzické zařízení v síti.
žádný Místní Bez síťového připojení spravovaného Dockerem, pro velmi specifické případy.

V Compose jsou sítě definovány v sekci „sítě“.Zde si vyberete ovladač a možnosti. Pokud nic nedefinujete, obvykle se standardně použije mostová síť. Služby se k těmto sítím připojují jednoduše uvedením názvu v jejich definici.

Jednoduchý příklad: nginx a PostgreSQL s Docker Compose

Příklad nasazení s Docker Compose

Abychom si všechny tyto koncepty představili v perspektivě, představte si, že chcete vytvořit jednoduchý web s Nginx a databází PostgreSQL.Minimalistický příklad souboru docker-compose.yml by mohl zahrnovat dvě služby, interní síť a několik svazků:

version: '3.8'

services:
  web:
    image: nginx:latest
    container_name: mi_nginx
    ports:
      - "80:80"
    depends_on:
      - db
    networks:
      - app_net

  db:
    image: postgres:latest
    container_name: mi_postgres
    environment:
      POSTGRES_PASSWORD: ejemplo_password
    volumes:
      - datos_db:/var/lib/postgresql/data
    networks:
      - app_net

volumes:
  datos_db:

networks:
  app_net:
    driver: bridge

Zde vidíme dvě velmi důležité věciNa jedné straně Nginx zpřístupňuje hostiteli port 80, zatímco databáze je přístupná pouze v síti app_net, a na druhé straně jsou data PostgreSQL uložena na svazku s názvem datos_db. Web navíc závisí na db, takže Compose se nejprve pokusí spustit databázi.

Závislosti mezi službami s depends_on

V reálných aplikacích často existují vztahy typu „tato služba nedává smysl bez téhle“.Například REST API, které vyžaduje spuštěnou databázi pro inicializaci připojení, nebo frontend, který se spouští pouze tehdy, když backend odpoví.

V Docker Compose můžete tyto vztahy vyjádřit pomocí klíče depends_on., kde je uveden seznam služeb, na kterých je ta současná závislá:

services:
  api:
    image: mi_usuario/mi_api:latest
    depends_on:
      - db

  db:
    image: postgres:15

S touto konfigurací, když spustíte docker-compose up bez zadání služeb,Compose nejprve načte databázi a poté API. Mějte však na paměti, že `depends_on` řídí pořadí operací. botaNezaručuje to však 100% za to, že závislá služba je „připravena“ (například, že databáze přijímá připojení). V kritických případech se obvykle používají čekací skripty nebo kontroly stavu.

  Výukový program LVM (Správce logických svazků) v Linuxu

Základní příkazy Dockeru pro psaní

Jakmile máte soubor docker-compose.yml na svém místěKaždodenní práce s Compose se točí kolem několika základních příkazů. Vždy budeme předpokládat, že se nacházíte v adresáři, kde se soubor nachází, nebo že k jeho označení používáte parametr -f.

Spusťte aplikaci: docker-compose up

Hlavní příkaz pro nasazení kontejnerů je docker-compose up.Pokud jej spustíte bez dalších parametrů, pokusí se sestavit potřebné obrazy (pokud mají sekci pro sestavení) a spustit všechny definované služby:

docker-compose up

Pokud chcete, aby kontejnery běžely na pozadí, jak je na serverech obvyklé, přidejte -d:

docker-compose up -d

Zastavení kontejnerů: docker-compose down

Zastavení a odstranění kontejnerů projektů (i když ne nutně obrázky nebo svazky), které používáte:

docker-compose down

Tento příkaz můžete kombinovat s dalšími možnostmi. Pokud chcete smazat svazky, vlastní sítě atd., můžete to také udělat, ale ve většině případů stačí k řádnému zastavení projektu pouhé použití příkazu `down`.

Zobrazení stavu služeb: docker-compose ps

Pokud potřebujete zkontrolovat, které služby jsou aktivní, které porty mají namapované a jejich stav, příkaz, který je třeba použít, je:

docker-compose ps

Zobrazí se vám tabulka s kontejnery spravovanými daným Compose., včetně sloupců pro název, obrázek, porty a aktuální stav, což je velmi užitečné pro ověření, zda je vše podle očekávání.

Protokoly dotazů: protokoly Docker-Compose

Chcete-li zjistit, co se děje ve vašich službách, můžete použít protokoly docker-compose.Protokoly si můžete prohlédnout pro všechny služby nebo pro konkrétní službu:

docker-compose logs

# Sólo los logs del servicio "api"
docker-compose logs api

Pokud přidáte volbu -f, budete sledovat v reálném čase (podobně jako tail -f):

docker-compose logs -f api

Vstup do kontejneru: docker-compose exec

Když potřebujete „vstoupit“ do kontejneru pro ladění nebo spuštění příkazůPoužíváte `docker-compose exec`. Například pro otevření shellu ve službě s názvem `api`:

docker-compose exec api sh

V kontejnerech založených na distribucích bash Místo sh můžete použít bash, podle toho, co je pohodlnější v závislosti na základním obrazu.

Sestavení nebo obnovení imagí: docker-compose build a docker-compose pull

Pokud jste upravili jakýkoli soubor Dockerfile nebo část kontextu sestaveníBudete muset rekonstruovat související obrázky:

docker-compose build
# O bien para un servicio concreto
docker-compose build api

Když obrazy pocházejí ze vzdáleného registru (Docker Hub, soukromý registr…) A pokud si chcete jednoduše stáhnout nejnovější verzi deklarovanou v YAML, použijete:

docker-compose pull

Nezapomeňte, že se vždy můžete uchýlit k „normálním“ příkazům Dockeru. (docker ps, docker images, docker volume ls, docker network ls atd.), ale pro zachování konzistence projektu je lepší vše, co ovlivňuje služby definované v docker-compose.yml, řešit pomocí Compose.

Kompletní příklad: Node.js + MySQL aplikace s Dockerem a Docker Compose

Podívejme se nyní na trochu realističtější příklad.REST API v Node.js, které používá MySQL k ukládání informací (například dat o autech). Typický postup by byl:

  1. Vývoj API použití proměnných prostředí pro konfiguraci.
  2. Vytvořte soubor Dockerfile pro API.
  3. Sestavte a v případě potřeby nahrajte obraz do Docker Hubu.
  4. Definujte soubor docker-compose.yml s API a databází.
  5. Zprovozněte vše pomocí docker-compose a vyzkoušejte aplikaci.

1. Node.js API připravené pro proměnné prostředí

Předpokládejme, že máte projekt Node s Expressem, který zpřístupňuje některé koncové body. Pro dotazování, vytváření a výpisování aut. Klíčem zde není samotný kód, ale spíše to, že konfigurace připojení k databázi pochází z proměnných prostředí, jako jsou DB_HOST, DB_USER, DB_PASSWORD, DB_NAME atd.

To je nezbytné pro dobrou spolupráci s Dockerem.Nechcete do kódu zapisovat přihlašovací údaje ani adresy URL, ale raději jej parametrizovat v době nasazení, ať už lokálně nebo v cloudu.

2. Dockerfile pro webovou aplikaci

V adresáři aplikace vytvoříte soubor Dockerfile, který je zodpovědný za vytvoření obrazu.Základním příkladem by mohlo být:

FROM node:18-alpine

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install --only=production

COPY . .

EXPOSE 3000

CMD ["node", "index.js"]

Tento Dockerfile je založen na oficiálním obrazu Node.Nainstalujte závislosti, zkopírujte kód, zpřístupněte port aplikace (v tomto případě 3000) a definujte spouštěcí příkaz. Odtud můžete obraz sestavit lokálně.

docker build -t mi_usuario/mi-api-coches:latest .

Ověřte existenci obrazu pomocí obrazů Dockeru. A pokud vše půjde dobře, můžete toto API spustit i v samostatném kontejneru pomocí Docker Run. Zajímavá část ale přijde, až ho propojíme s databází pomocí Compose.

3. Nahrajte obrázek do záznamu (volitelné, ale velmi užitečné)

Pokud chcete mít možnost nasadit svou aplikaci na jiný počítač (například virtuální počítač v cloudu)Je velmi pohodlné nahrát obraz do Docker Hubu nebo jiného registru. Postupujte takto:

docker login
# te pedirá usuario y contraseña

docker push mi_usuario/mi-api-coches:latest

Pokud chcete explicitně verzovatMůžete označit více verzí:

docker tag mi_usuario/mi-api-coches:latest mi_usuario/mi-api-coches:v1

docker push mi_usuario/mi-api-coches:v1

Na serveru, kde budete nasazovatBude stačit provést stažení obrázku z Dockeru a použít ho v souboru docker-compose.yml, aniž by bylo nutné ho tam znovu sestavovat.

  SteamOS 3.7.15: Všechny nové funkce a proč jsou důležité

4. Definujte docker-compose.yml pomocí API a MySQL

Dalším krokem je vytvoření souboru docker-compose.yml, který kombinuje API a databázi.také přidání svazku pro data MySQL a v případě potřeby i skript inicializace:

version: '3.8'

services:
  web:
    image: mi_usuario/mi-api-coches:latest
    container_name: api_coches
    ports:
      - "3000:3000"
    environment:
      DB_HOST: db
      DB_USER: coches_user
      DB_PASSWORD: coches_pass
      DB_NAME: coches_db
    depends_on:
      - db
    networks:
      - coches_net

  db:
    image: mysql:8
    container_name: mysql_coches
    environment:
      MYSQL_ROOT_PASSWORD: root_pass
      MYSQL_DATABASE: coches_db
      MYSQL_USER: coches_user
      MYSQL_PASSWORD: coches_pass
    volumes:
      - datos_mysql:/var/lib/mysql
      - ./initdb:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    networks:
      - coches_net

volumes:
  datos_mysql:

networks:
  coches_net:
    driver: bridge

V této konfiguraci je několik zajímavých detailů.:

  • API odkazuje na databázi pomocí DB_HOST=dbkterý odpovídá názvu služby MySQL. Docker Compose poskytuje interní DNS, takže se nemusíte starat o IP adresy; stačí použít název služby.
  • Složka ./initdb je připojena k souboru /docker-entrypoint-initdb.d v kontejneru MySQL.To umožňuje zahrnout skripty .sql nebo .sh, které se spustí automaticky při prvním spuštění (například pro vytváření tabulek, vkládání vzorových dat atd.).
  • Data MySQL jsou uložena ve svazku data_mysql.Takže pokud vypíšete kontejnery pomocí docker-compose, informace z databáze zůstanou nedotčené.
  • Obě služby sdílejí síť coches_net.která funguje jako izolovaná interní síť. Vnějšku zpřístupňujete pouze porty, které chcete (3000 pro API, 3306, pokud potřebujete k databázi přistupovat zvenčí, což někdy ani není nutné).

5. Nasazení a otestování aplikace

S připraveným souborem docker-compose.yml je jeho nasazení stejně jednoduché jako spuštění. z adresáře souborů:

docker-compose up -d

Poprvé to bude trvat trochu déle Protože potřebuje stáhnout obrazy MySQL (a API, pokud není lokální), vytvořit svazek a spustit inicializační skripty. Pak pro kontrolu stavu:

docker-compose ps

Pokud je vše v pořádku, můžete začít zasílat požadavky do API. z curl nebo Postman. Například:

# Listar todos los coches
curl http://localhost:3000/coches

# Obtener un coche concreto
curl http://localhost:3000/coches/1

# Crear un coche vía POST
curl -X POST http://localhost:3000/coches \
  -H "Content-Type: application/json" \
  -d '{"marca": "Seat", "modelo": "León"}'

Pokud chcete nasazení ukončit, jednoduše spusťte příkaz `docker-compose down`.Pokud svazek nevymažete, data budou zachována pro další spuštění.

Nasazení Docker Compose na cloudových serverech a Portainer

Všechno, co jsme viděli, platí stejnou měrou pro nasazení na vlastním notebooku i na cloudovém serveru.Rozdíl je v podstatě v tom, kde spouštíte příkazy docker-compose up a jak otevíráte porty ven.

Velmi jednoduchý přístup pro osobní projekty nebo vedlejší projekty Zahrnuje vytvoření malého virtuálního počítače (například bezplatného e2-micro na Google Cloudu), instalaci Dockeru a Docker Compose, naklonování repozitáře s kódem a souborem docker-compose.yml a spuštění aplikace tam.

Jediné, co je třeba mít na paměti, jsou zásady firewallu poskytovatele.Pokud vaše aplikace naslouchá na portu 3000, musíte tento port otevřít v nastavení sítě vašeho poskytovatele internetových služeb (nebo použít reverzní proxy na portech 80/443, pokud chcete být s HTTPS extra zabezpečeni). Jakmile je port otevřený, můžete k němu přistupovat pomocí http://SERVER_IP:3000 z libovolného prohlížeče.

Pokud je pro vás správa kontejnerů přes konzoli příliš složitá, můžete použít Portainer.Portainer je nástroj, který také běží v kontejneru a poskytuje webové rozhraní pro správu Dockeru (a Docker Compose). Chcete-li nastavit Portainer na serveru, stačí udělat něco jako:

docker volume create portainer_data

docker run -d \
  -p 8000:8000 -p 9000:9000 \
  --name=portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer

Pak byste se dostali k Portainer na adrese http://SERVER_IP:9000Vytvořili byste administrátorského uživatele a odtud byste si mohli prohlížet kontejnery, zásobníky Compose, sítě, svazky atd., to vše z prohlížeče.

Práce s Docker Compose umožňuje zapouzdřit celou architekturu aplikace do jednoho souboru.Díky tomu může jakýkoli vývojář snadno spustit stejný stack jediným příkazem, ať už z notebooku nebo vzdáleného virtuálního počítače. Přidáním osvědčených postupů, jako je používání proměnných prostředí, interních sítí, perzistentních svazků a v případě potřeby nástrojů, jako je Portainer, získáte solidní základ pro nasazení čehokoli od malých osobních projektů až po poměrně seriózní prostředí, aniž byste se ztratili.