Použití Docker Compose

Docker Compose je nástroj, který vám pomůže definovat a sdílet více kontejnerové aplikace. Pomocí nástroje Compose můžete vytvořit soubor YAML, který definuje služby, a jediným příkazem můžete všechno zkompilovat nebo všechno zkompilovat.

Hlavní výhodou použití funkce Compose je, že můžete definovat zásobník aplikace v souboru, ponechat ho v kořenovém adresáři vašeho projektového repo (teď je řízený verzí) a snadno umožnit, aby do vašeho projektu přispěl někdo jiný. Někdo by potřeboval jenom naklonovat vaše repo a spustit aplikaci pro psaní. Ve skutečnosti můžete vidět poměrně hodně projektů na GitHub/GitLabu, které to dělají právě teď.

Jak tedy začít?

Instalace Docker Compose

Pokud jste nainstalovali Docker Desktop pro Windows nebo Mac, máte už Docker Compose! Instance Dockeru už mají nainstalované Docker Compose také. Pokud jste na počítači s Linuxem, budete si muset nainstalovat Docker Compose podle těchto pokynů.

Po instalaci byste měli být schopni spustit následující příkaz a zobrazit informace o verzi.

docker-compose version

Vytvoření souboru pro psaní

  1. V kořenovém adresáři projektu aplikace vytvořte soubor s názvem docker-compose.yml .

  2. V souboru compose začneme definováním verze schématu. Ve většině případů je nejlepší použít nejnovější podporovanou verzi. Aktuální verze schématu a matici kompatibility najdete v referenčních odkazech na soubor Compose.

    version: "3.7"
    
  3. Dále definujte seznam služeb (nebo kontejnerů), které chcete spustit jako součást vaší aplikace.

    version: "3.7"
    
    services:
    

Teď začnete službu migrovat do souboru compose.

Definování App Service

Připomeňme si, že se jedná o příkaz, který jste použili k definování kontejneru aplikace (nahraďte \ znaky v ` Windows PowerShell).

docker run -dp 3000:3000 \
  -w /app -v ${PWD}:/app \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:12-alpine \
  sh -c "yarn install && yarn run dev"
  1. Nejprve definujte položku služby a image kontejneru. Pro službu můžete vybrat libovolný název. Název se automaticky stane aliasem sítě, který bude užitečný při definování služby MySQL.

    version: "3.7"
    
    services:
      app:
        image: node:12-alpine
    
  2. Obvykle se příkaz zobrazí blízko definice, i když není při image řazení potřeba. Pokračujte a přesuňte ho do souboru .

    version: "3.7"
    
    services:
      app:
        image: node:12-alpine
        command: sh -c "yarn install && yarn run dev"
    
  3. Část -p 3000:3000 příkazu migrujte definováním ports pro službu . Tady použijete krátkou syntaxi, ale k dispozici je také podrobnější dlouhá syntaxe.

    version: "3.7"
    
    services:
      app:
        image: node:12-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
    
  4. Dále migrujte pomocí definic a jak pracovní adresář ( ), tak mapování -w /app svazku ( -v ${PWD}:/app working_dir volumes ). Svazky mají také krátkou a dlouhou syntaxi.

    Jednou z výhod Docker Compose svazků je, že můžete použít relativní cesty z aktuálního adresáře.

    version: "3.7"
    
    services:
      app:
        image: node:12-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
    
  5. Nakonec pomocí klíče migrujte definice proměnných environment prostředí.

    version: "3.7"
    
    services:
      app:
        image: node:12-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: root
          MYSQL_PASSWORD: secret
          MYSQL_DB: todos
    

Definování služby MySQL

Teď je čas definovat službu MySQL. Příkaz, který jste použili pro tento kontejner, byl následující (nahraďte \ znaky v ` souboru Windows PowerShell):

docker run -d \
  --network todo-app --network-alias mysql \
  -v todo-mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=todos \
  mysql:5.7
  1. Nejprve definujte novou službu a pojmnujte ji, aby automaticky získá mysql alias sítě. Zadejte také image, která se má použít.

    version: "3.7"
    
    services:
      app:
        # The app service definition
      mysql:
        image: mysql:5.7
    
  2. Dále definujte mapování svazků. Když jste kontejner spustili s docker run , pojmenovaný svazek se vytvořil automaticky. To se ale při spuštění s aplikací Compose nestane. Svazek je potřeba definovat v části nejvyšší úrovně a pak zadat volumes: přípojný bod v konfiguraci služby. Když jednoduše zadáte jenom název svazku, použije se výchozí možnosti. K dispozici je ale mnoho dalších možností.

    version: "3.7"
    
    services:
      app:
        # The app service definition
      mysql:
        image: mysql:5.7
        volumes:
          - todo-mysql-data:/var/lib/mysql
    
    volumes:
      todo-mysql-data:
    
  3. Nakonec je potřeba zadat pouze proměnné prostředí.

    version: "3.7"
    
    services:
      app:
        # The app service definition
      mysql:
        image: mysql:5.7
        volumes:
          - todo-mysql-data:/var/lib/mysql
        environment: 
          MYSQL_ROOT_PASSWORD: secret
          MYSQL_DATABASE: todos
    
    volumes:
      todo-mysql-data:
    

V tuto chvíli by mělo dokončení docker-compose.yml vypadat takhle:

version: "3.7"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

Spuštění zásobníku aplikací

Teď, když máte docker-compose.yml soubor, ho můžete spustit.

  1. Nejprve se ujistěte, že nejsou spuštěné žádné další kopie aplikace a databáze ( docker ps a docker rm -f <ids> ).

  2. Spusťte zásobník aplikací pomocí docker-compose up příkazu . Přidejte -d příznak , který spustí všechno na pozadí. Případně můžete kliknout pravým tlačítkem na soubor Compose a vybrat možnost Vytvořit na bočním VS Code panelu.

    docker-compose up -d
    

    Po spuštění tohoto příkazu by se měl zobrazit výstup, jako je tento:

    Creating network "app_default" with the default driver
    Creating volume "app_todo-mysql-data" with default driver
    Creating app_app_1   ... done
    Creating app_mysql_1 ... done
    

    Všimněte si, že se svazek vytvořil i síť. Ve výchozím Docker Compose automaticky vytvoří síť specificky pro zásobník aplikací (proto jste ji v souboru pro psaní nedefinují).

  3. Prohlédněte si protokoly pomocí docker-compose logs -f příkazu . Uvidíte protokoly z jednotlivých služeb prokládané do jednoho datového proudu. To je neuvěřitelně užitečné, když chcete sledovat problémy související s časování. Příznak -f "sleduje" protokol, takže vám poskytne živý výstup při generování.

    Pokud to ještě nemáte, zobrazí se výstup, který vypadá jako tento:

    mysql_1  | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
    mysql_1  | Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
    app_1    | Connected to mysql db at host mysql
    app_1    | Listening on port 3000
    

    Název služby se zobrazí na začátku řádku (často barevné), aby se zprávy rozlišují. Pokud chcete zobrazit protokoly pro konkrétní službu, můžete přidat název služby na konec příkazu logs (například docker-compose logs -f app ).

    Tip

    Čekání na databázi před spuštěním aplikace Když se aplikace spouští, ve skutečnosti se nachází a čeká, až bude MySQL připravený, než se k ní zkusí připojit. Docker nemá žádnou integrovanou podporu, která by před spuštěním dalšího kontejneru čekala, až bude úplně funkční, spuštěný a připravený jiný kontejner. Pro projekty založené na node můžete použít závislost wait-port. Podobné projekty existují i pro jiné jazyky nebo architektury.

  4. V tuto chvíli byste měli být schopni otevřít aplikaci a vidět ji spuštěnou. A nazýtá se! Máte k dispozici jediný příkaz.

Zobrazení zásobníku aplikací v rozšíření Dockeru

Pokud se podíváte na rozšíření Dockeru, můžete změnit možnosti seskupení pomocí skupin "cog" a "seskupit podle". V tomto případě chcete zobrazit kontejnery seskupené podle názvu Project:

Rozšíření VS s compose

Pokud síť twirl down, uvidíte dva kontejnery, které jste definovali v souboru compose.

Rozšíření VS s rozbalenou příponou Compose

Ztržení všech konců

Až budete připravení vše ztrhnout, jednoduše spusťte nebo klikněte pravým tlačítkem na aplikaci v seznamu kontejnerů v rozšíření dockeru VS Code a vyberte docker-compose down Vytvořit dolů. Kontejnery se zastaví a síť se odebere.

Upozornění

Odebrání svazků Ve výchozím nastavení nejsou pojmenované svazky v souboru pro psaní při spuštění docker-compose down odebrány. Pokud chcete svazky odebrat, budete muset přidat příznak --volumes .

Po roztržování můžete přepnout na jiný projekt, spustit a být připraveni docker-compose up k přispívání do tohoto projektu. Ve skutečnosti to není o moc jednodušší!

Rekapitulace

V této části jste se dozvěděli o Docker Compose a o tom, jak výrazně zjednodušuje definování a sdílení aplikací s více službami. Soubor Compose jste vytvořili překladem příkazů, které jste měli, do vhodného formátu pro psaní.

V tuto chvíli tento kurz začínáte sbalovat. Existuje však několik osvědčených postupů pro sestavení image, které je třeba pokrýt, protože u souboru Dockerfile, který používáte, existuje velký problém. Pojďme se na to podívat!

Další kroky

Pokračujte kurzem!