<šablona x-if=visible><šablona x-if=$isMobile()>
Co je Docker Compose?
Pokud vaše aplikace Docker obsahuje více než jeden kontejner (například webový server a databáze běžící v samostatných kontejnerech), je vytváření, spouštění a připojování kontejnerů ze samostatných souborů Dockerfiles těžkopádné a časově náročné. Docker Compose tento problém řeší tím, že vám umožňuje použít soubor YAML k definování aplikací pro více kontejnerů. Můžete nakonfigurovat tolik kontejnerů, kolik chcete, jak by měly být sestaveny a propojeny a kde by se měla ukládat data. Po dokončení souboru YAML můžete spustit jediný příkaz k vytvoření, spuštění a konfiguraci všech kontejnerů.
Tato příručka vysvětlí, jak docker-compose.yml
soubor je uspořádán a ukazuje, jak jej používat k vytvoření několika základních konfigurací aplikace.
Poznámka Obecně všechny kontejnery v aplikaci vytvořené pomocí Docker Compose poběží na stejném hostiteli. Správa kontejnerů běžících na různých hostitelích obvykle vyžaduje další nástroj, jako je Docker Swarm nebo Kubernetes.
Než začnete
Instalovat Docker CE
Abyste mohli postupovat podle kroků v této příručce, budete potřebovat Linode s nainstalovaným Docker CE.
Chcete-li nainstalovat Docker CE (Community Edition), postupujte podle pokynů v jedné z níže uvedených příruček:
-
Instalace a používání Dockeru na Ubuntu a Debian
-
Instalace a používání Dockeru na CentOS a Fedoře
Úplné pokyny pro ještě více distribucí Linuxu naleznete v části Instalace Docker Engine v oficiální dokumentaci Dockeru.
Instalovat Docker Compose
-
Stáhněte si nejnovější verzi Docker Compose. Zkontrolujte stránku s vydáními a nahraďte
1.25.4
v příkazu níže s verzí označenou jako Poslední vydání :sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
-
Nastavit oprávnění souboru:
sudo chmod +x /usr/local/bin/docker-compose
Základní použití
V této části se podíváme na ukázkový soubor Docker Compose převzatý z oficiální dokumentace Docker.
-
Otevřete
docker-compose.yml
v textovém editoru a přidejte následující obsah:- Soubor:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
version: '3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data:
-
Uložte soubor a spusťte Docker Compose ze stejného adresáře:
docker-compose up -d
Tím se vytvoří a spustí
db
awordpress
kontejnery. Stejně jako při spuštění jednoho kontejneru pomocídocker run
,-d
flag spustí kontejnery v odděleném režimu. -
Nyní máte na svém hostiteli spuštěný kontejner WordPress a kontejner MySQL. Přejděte na
192.0.8.1:8000/wordpress
ve webovém prohlížeči, abyste viděli svou nově nainstalovanou aplikaci WordPress. Můžete také použítdocker ps
k dalšímu prozkoumání výsledné konfigurace:docker ps
-
Zastavte a vyjměte nádoby:
docker-compose down
Syntaxe nového souboru
docker-compose.yml
soubor je uspořádán do čtyř sekcí:
Směrnice | Použít |
---|---|
verze | Určuje verzi syntaxe souboru Compose. Tato příručka bude používat verzi 3. |
služby | V Dockeru je služba názvem pro „Kontejner ve výrobě“. Tato část definuje kontejnery, které budou spuštěny jako součást instance Docker Compose. |
sítě | Tato část se používá ke konfiguraci sítě pro vaši aplikaci. Můžete změnit nastavení výchozí sítě, připojit se k externí síti nebo definovat sítě pro konkrétní aplikace. |
svazky | Připojí k hostitelskému počítači propojenou cestu, kterou může kontejner použít. |
Většina této příručky se zaměří na nastavení kontejnerů pomocí services
sekce. Zde jsou některé z běžných direktiv používaných k nastavení a konfiguraci kontejnerů:
Směrnice | Použít |
---|---|
obrázek | Nastaví obrázek, který bude použit k sestavení kontejneru. Použití této direktivy předpokládá, že zadaný obrázek již existuje buď na hostiteli nebo na onDocker Hub. |
sestavit | Tuto direktivu lze použít místo image . Určuje umístění souboru Dockerfile, který bude použit k vytvoření tohoto kontejneru. |
db | V případě příkladu souboru Dockercompose db je proměnná pro kontejner, který se chystáte definovat. |
restartovat | Říká kontejneru, aby se restartoval, pokud se systém restartuje. |
svazky | Připojí propojenou cestu na hostitelský počítač, kterou může kontejner použít |
životní prostředí | Definujte proměnné prostředí, které mají být předány příkazu Docker run. |
závisí_na | Nastaví službu jako závislost pro aktuální kontejner definovaný blokem |
port | Mapuje port z kontejneru na hostitele následujícím způsobem:host:container |
odkazy | Propojte tuto službu s dalšími službami v souboru Docker Compose zadáním jejich názvů zde. |
K dispozici je mnoho dalších konfiguračních direktiv. Podrobnosti naleznete v odkazu na vytvoření souboru.
Pozor Příkladdocker-compose.yml
výše používáenvironment
direktiva k ukládání uživatelských hesel MySQL přímo do souboru YAML, který se má importovat do kontejneru jako proměnné prostředí. Toto se nedoporučuje pro citlivé informace v produkčním prostředí. Místo toho mohou být citlivé informace uloženy v samostatném.env
soubor (který není zkontrolován ve správě verzí ani zveřejněn) a přístupný zdocker-compose.yml
pomocíenv_file
směrnice.
Vytvoření aplikace od nuly
Vytvořte docker-compose.yml
soubor jednu sekci po druhé pro ilustraci kroků vytváření multi-kontejnerové aplikace.
Definujte jednoduchou službu:
-
Vytvořte nový
docker-compose.yml
v textovém editoru a přidejte následující obsah:- Soubor:docker -compose.yml
1 2 3 4 5 6 7 8
version: '3' services: distro: image: alpine restart: always container_name: Alpine_Distro entrypoint: tail -f /dev/null
Každý záznam v
services
sekce vytvoří samostatný kontejner přidocker-compose
je spuštěn. V tomto okamžiku sekce obsahuje jediný kontejner založený na oficiální distribuci Alpine:restart
direktiva se používá k označení, že kontejner by se měl vždy restartovat (například po havárii nebo restartu systému).container_name
Direktiva se používá k přepsání náhodně vygenerovaného názvu kontejneru a jeho nahrazení názvem, který se snáze zapamatuje a lépe se s ním pracuje.- Pokud na nich neběží žádný proces, ve výchozím nastavení se kontejnery Docker ukončí.
tail -f
je probíhající proces, takže poběží neomezeně dlouho a zabrání zastavení kontejneru. Výchozíentrypoint
je přepsáno, aby kontejner zůstal v chodu.
-
Otevřete svůj kontejner:
docker-compose up -d
-
Zkontrolujte stav svého kontejneru:
docker ps
Výstup by měl vypadat takto:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 967013c36a27 alpine "tail -f /dev/null" 3 seconds ago Up 2 seconds Alpine_Distro
-
Spusťte kontejner:
docker-compose down
Přidat další služby
Odtud můžete začít budovat ekosystém kontejnerů. Můžete definovat, jak spolu spolupracují a komunikují.
-
Znovu otevřete
docker-compos.yml
a přidejtedatabase
níže:- Soubor:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - ../dumps:/tmp/ ports: - "5432:5432"
Nyní jsou definovány dvě služby:
- Distro
- Databáze
Služba Distro je stejná jako dříve. Databázový server obsahuje instrukce pro postgres kontejner a direktivy:
volumes: - ../dumps:/tmp
aports:-"5432:5432"
, první direktiva mapuje kontejner/dumps
složku do našeho místního/tmp
složka. Druhá direktiva mapuje porty kontejnerů na porty místního hostitele. -
Zkontrolujte běžící kontejnery:
docker ps
Tento příkaz zobrazuje stav kontejnerů, mapování portů, názvy a poslední příkaz spuštěný na nich. Je důležité si uvědomit, že kontejner postgres zní „docker-entrypoint…“ pod příkazy. Skript PostgresDocker Entrypoint je poslední věcí, která se spustí při spuštění kontejneru.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ecc37246f6ef postgres:latest "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp postgres_db 35dab3e712d6 alpine "tail -f /dev/null" About a minute ago Up About a minute Alpine_Distro
-
Sundejte oba kontejnery:
docker-compose down
Přidat službu nginx
-
Přidejte kontejner nginx, aby vaše aplikace mohla obsluhovat webové stránky:
- Soubor:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - ../dumps:/tmp/ ports: - "5432:5432" web: image: nginx:latest container_name: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=example.com - NGINX_port=80 links: - database:db - distro
Toto
docker-compose
soubor obsahuje několik nových direktiv:environment a odkazy . První direktiva nastavuje možnosti úrovně běhu v kontejneru.links
vytváří závislostní síť mezi kontejnery. Spuštění kontejneru nginx závisí na dalších dvou. Kromě toho budou odpovídající kontejnery dosažitelné pod názvem hostitele označeným aliasem. V tomto případě ping nadb
zweb
kontejner se dostane dodatabase
servis. I když nepotřebujetelinks
direktiva pro kontejnery, aby spolu mluvily,links
může sloužit jako zabezpečení proti selhání při spouštění aplikace docker-compose. -
Spusťte Docker Compose a zkontrolujte stav kontejneru:
docker-compose up -d docker ps
Výstup by měl být podobný:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 55d573674e49 nginx:latest "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp nginx ad9e48b2b82a alpine "tail -f /dev/null" 3 minutes ago Up 3 minutes Alpine_Distro 736cf2f2239e postgres:latest "docker-entrypoint..." 3 minutes ago Up 3 minutes 0.0.0.0:5432->5432/tcp postgres_db
-
Otestujte nginx tak, že přejdete na veřejnou IP adresu vašeho Linode, port
8080
v prohlížeči (například192.0.2.0:8080
). Měla by se zobrazit výchozí vstupní stránka nginx.
Trvalé úložiště dat
Ukládání dat PostgreSQL přímo do kontejneru se nedoporučuje. Kontejnery Docker jsou určeny k tomu, aby se s nimi zacházelo jako s pomíjivými:kontejnery vaší aplikace se při spuštění docker-compose up
sestavují od začátku. a zničeny při spuštění docker-compose down
. Kromě toho jakékoli neočekávané selhání nebo restart vašeho systému způsobí ztrátu všech dat uložených v kontejneru.
Z těchto důvodů je důležité nastavit na hostiteli trvalý svazek, který budou databázové kontejnery používat k ukládání dat.
-
Přidejte
volumes
sekce nadocker-compose.yml
a upravtedatabase
služby odkazovat na svazek:- Soubor:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - data:/var/lib/postgresql ports: - "5432:5432" web: image: nginx:latest container_name: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=example.com - NGINX_port=80 links: - database:db - distro volumes: data: external: true
-
external: true
říká Docker Compose, aby použil již existující externí datový objem. Pokud není žádný svazek s názvemdata
je přítomen, spuštění aplikace způsobí chybu. Vytvořte svazek:docker volume create --name=data
-
Spusťte aplikaci jako dříve:
docker-compose up -d
Další kroky
Docker Compose je výkonný nástroj pro orchestraci sad kontejnerů, které mohou spolupracovat. Věci jako aplikace nebo vývojové prostředí mohou využívat Docker-compose. Výsledkem je modulární a konfigurovatelné prostředí, které lze nasadit kdekoli.