Kurz: Vytváření vícekontejnerových aplikací pomocí MySQL a Docker Compose

V tomto kurzu se naučíte vytvářet vícekontenerové aplikace. Tento kurz vychází z úvodních kurzů, začínáme s Dockerem a editorem Visual Studio Code. V tomto pokročilém kurzu aktualizujete aplikaci tak, aby fungovala, jak je popsáno v tomto diagramu, a naučíte se, jak:

  • Spusťte MySQL.
  • Spusťte aplikaci pomocí MySQL.
  • Vytvořte soubor pro psaní zpráv.
  • Spusťte zásobník aplikací.

Diagram shows two containers labeled Todo App and MySQL connected with a line.

Použití více kontejnerů umožňuje vyhradit kontejnery pro specializované úlohy. Každý kontejner by měl udělat jednu věc a udělat to dobře.

Tady je několik důvodů, proč můžete chtít používat vícekontenerové aplikace:

  • Oddělení kontejnerů pro správu rozhraní API a front-endů odlišně než databáze.
  • Kontejnery umožňují izolovaně verze a aktualizovat verze.
  • I když můžete pro databázi použít kontejner místně, můžete chtít pro databázi v produkčním prostředí použít spravovanou službu.
  • Spouštění více procesů vyžaduje správce procesů, který zvyšuje složitost spouštění a vypínání kontejneru.

Požadavky

Tento kurz pokračuje v sérii kurzů počínaje vytvořením aplikace typu kontejner. Začněte s tím, co zahrnuje požadavky. Pak proveďte kurz Uchování dat v aplikaci.

Potřebujete také následující položky:

  • Docker Compose.

    Docker Desktop pro Windows nebo Mac zahrnuje Docker Compose. Spuštěním tohoto příkazu ověřte:

    docker-compose version
    

    Pokud používáte operační systém Linux, nainstalujte Docker Compose.

Stejně jako v předchozíchkurzch Pokud chcete otevřít okno příkazového řádku ve VS Code, můžete vybrat Terminál>nový terminál. Příkazy můžete také spustit v okně Bash. Pokud není zadaný, může jakýkoli příkaz označený jako Bash běžet v okně Bash nebo v terminálu VS Code.

Spuštění MySQL

Kontejnery ve výchozím nastavení běží izolovaně. Neví nic o jiných procesech nebo kontejnerech na stejném počítači. Pokud chcete povolit komunikaci jednoho kontejneru s druhým, použijte sítě.

Pokud jsou dva kontejnery ve stejné síti, můžou si vzájemně komunikovat. Pokud ne, nemůžou.

Kontejner můžete umístit do sítě dvěma způsoby: přiřaďte ho při spuštění nebo připojte existující kontejner. V tomto příkladu nejprve vytvoříte síť a při spuštění připojíte kontejner MySQL.

  1. Pomocí tohoto příkazu vytvořte síť.

    docker network create todo-app
    
  2. Spusťte kontejner MySQL a připojte ho k síti.

    docker run -d 
        --network todo-app --network-alias mysql 
        -v todo-mysql-data:/var/lib/mysql 
        -e MYSQL_ROOT_PASSWORD=<your-password> 
        -e MYSQL_DATABASE=todos 
        mysql:5.7
    

    Tento příkaz také definuje proměnné prostředí. Další informace najdete v tématu MySQL Docker Hub listing.

    Příkaz určuje alias sítě . mysql

  3. Pomocí příkazu získejte ID kontejneru docker ps .

  4. Pokud chcete ověřit, že máte databázi v provozu, připojte se k databázi.

    docker exec -it <mysql-container-id> mysql -p
    

    Po zobrazení výzvy zadejte heslo, které jste použili výše.

  5. V prostředí MySQL zobrazte seznam databází a ověřte, že se databáze zobrazí todos .

    SHOW DATABASES;
    

    Měli byste vidět následující výstup.

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | todos              |
    +--------------------+
    5 rows in set (0.00 sec)
    
  6. Až budete připraveni se vrátit na příkazový řádek terminálu, zadejte exit .

Spuštění aplikace pomocí MySQL

Aplikace todo podporuje nastavení proměnných prostředí pro zadání nastavení připojení MySQL.

  • MYSQL_HOST Název hostitele pro server MySQL.
  • MYSQL_USER Uživatelské jméno, které se má použít pro připojení.
  • MYSQL_PASSWORD Heslo, které se má použít pro připojení.
  • MYSQL_DB Databáze, která se má použít po připojení.

Upozorňující

Použití proměnných prostředí k nastavení připojení je přijatelné pro vývoj. Doporučujeme, aby se aplikace spouštěly v produkčním prostředí. Další informace najdete v tématu Proč byste neměli používat proměnné prostředí pro tajná data.

Bezpečnějším mechanismem je použití podpory tajných kódů poskytovaných architekturou orchestrace kontejnerů. Ve většině případů se tyto tajné kódy připojují jako soubory ve spuštěném kontejneru.

Tímto postupem spustíte aplikaci a připojíte tento kontejner k kontejneru MySQL.

  1. Použijte následující příkaz docker run. Určuje výše uvedené proměnné prostředí.

    docker run -dp 3000:3000 
      -w /app -v ${PWD}:/app 
      --network todo-app 
      -e MYSQL_HOST=mysql 
      -e MYSQL_USER=root 
      -e MYSQL_PASSWORD=<your-password> 
      -e MYSQL_DB=todos 
      node:20-alpine 
      sh -c "yarn install && yarn run dev"
    
  2. V editoru VS Code klikněte v zobrazení Dockeru pravým tlačítkem na kontejner aplikace a vyberte Zobrazit protokoly. Pokud chcete zobrazit protokoly z příkazového řádku, použijte docker logs tento příkaz.

    Výsledek obsahuje řádek, který označuje, že je aplikace připojená k databázi MySQL.

    # Previous log messages omitted
    $ nodemon src/index.js
    [nodemon] 1.19.2
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching dir(s): *.*
    [nodemon] starting `node src/index.js`
    Connected to mysql db at host mysql
    Listening on port 3000
    
  3. Zadejte http://localhost:3000 do prohlížeče. Přidejte do seznamu úkolů některé položky.

  4. Připojení k databázi MySQL, jak jste to udělali v předchozí části. Spuštěním tohoto příkazu ověřte, že se položky zapisují do databáze.

    docker exec -ti <mysql-container-id> mysql -p todos
    

    V prostředí MySQL spusťte následující příkazy.

    use todos;
    select * from todo_items;
    

    Výsledek bude vypadat jako následující výstup.

    +--------------------------------------+--------------------+-----------+
    | id                                   | name               | completed |
    +--------------------------------------+--------------------+-----------+
    | c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! |         0 |
    | 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome!        |         0 |
    +--------------------------------------+--------------------+-----------+
    

V tuto chvíli máte aplikaci, která ukládá data do externí databáze. Tato databáze běží v samostatném kontejneru. Dozvěděli jste se o sítích kontejnerů.

Vytvoření souboru Docker Compose

Docker Compose pomáhá definovat a sdílet vícekontenerové aplikace. Pomocí Docker Compose můžete vytvořit soubor pro definování služeb. Jediným příkazem můžete všechno zmáčkat nebo ho úplně roztrhat.

Zásobník aplikace můžete definovat v souboru a ponechat ho v kořenovém adresáři úložiště projektu v rámci správy verzí. Tento přístup umožňuje ostatním přispívat do vašeho projektu. Stačí, když naklonují vaše úložiště.

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

  2. V souboru psaní začněte definováním verze schématu.

    version: "3.7"
    

    Ve většině případů je nejlepší použít nejnovější podporovanou verzi. Aktuální verze schématu a matice kompatibility najdete v tématu Vytvoření souboru.

  3. Definujte služby nebo kontejnery, které chcete spustit jako součást aplikace.

    version: "3.7"
    
    services:
    

    Tip

    V souborech .yml je odsazení významné. Pokud upravujete v editoru VS Code, IntelliSense indikuje chyby.

  4. Tady je příkaz, který jste použili ke kontejneru aplikace. Tyto informace přidáte do souboru .yml .

    docker run -dp 3000:3000 
      -w /app -v ${PWD}:/app 
      --network todo-app 
      -e MYSQL_HOST=mysql 
      -e MYSQL_USER=root 
      -e MYSQL_PASSWORD=<your-password> 
      -e MYSQL_DB=todos 
      node:20-alpine 
      sh -c "yarn install && yarn run dev"
    

    Definujte položku služby a image kontejneru.

    version: "3.7"
    
    services:
      app:
        image: node:20-alpine
    

    Můžete vybrat libovolný název služby. Název se automaticky stane síťovým aliasem, který je užitečný při definování služby MySQL.

  5. Přidejte příkaz.

    version: "3.7"
    
    services:
      app:
        image: node:20-alpine
        command: sh -c "yarn install && yarn run dev"
    
  6. Zadejte porty pro službu, které odpovídají -p 3000:3000 výše uvedenému příkazu.

    version: "3.7"
    
    services:
      app:
        image: node:20-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
    
  7. Zadejte pracovní adresář a mapování svazků.

    version: "3.7"
    
    services:
      app:
        image: node:20-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
    

    V definicích svazků Docker Compose můžete použít relativní cesty z aktuálního adresáře.

  8. Zadejte definice proměnných prostředí.

    version: "3.7"
    
    services:
      app:
        image: node:20-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: <your-password>
          MYSQL_DB: todos
    
  9. Přidejte definice pro službu MySQL. Tady je příkaz, který jste použili výše:

    docker run -d 
      --network todo-app --network-alias mysql 
      -v todo-mysql-data:/var/lib/mysql 
      -e MYSQL_ROOT_PASSWORD=<your-password> 
      -e MYSQL_DATABASE=todos 
      mysql:5.7
    

    Definujte novou službu a pojmenujte ji mysql. Přidejte text za app definici na stejné úrovni odsazení.

    version: "3.7"
    
    services:
      app:
        # The app service definition
      mysql:
        image: mysql:5.7
    

    Služba automaticky získá alias sítě. Zadejte obrázek, který se má použít.

  10. Definujte mapování svazků.

    Zadejte svazek s oddílem volumes: na stejné úrovni jako services:. Zadejte mapování svazku pod obrázkem.

    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:
    
  11. Zadejte 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: <your-password>
          MYSQL_DATABASE: todos
    
    volumes:
      todo-mysql-data:
    

V tomto okamžiku vypadá dokončení docker-compose.yml takto:

version: "3.7"

services:
  app:
    image: node:20-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: <your-password>
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: <your-password>
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

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

Teď, když máte docker-compose.yml soubor, zkuste ho.

  1. Ujistěte se, že nejsou spuštěné žádné další kopie aplikace a databáze. V rozšíření Dockeru klikněte pravým tlačítkem na libovolný spuštěný kontejner a vyberte Odebrat. Nebo na příkazovém řádku použijte příkaz docker rm jako v předchozích příkladech.

  2. V Průzkumníku VS Code klikněte pravým tlačítkem na docker-compose.yml a vyberte Vytvořit. Nebo na příkazovém řádku použijte tento příkaz Dockeru.

    docker-compose up -d
    

    Parametr -d spustí příkaz na pozadí.

    Měl by se zobrazit výstup podobný následujícím výsledkům.

    [+] Building 0.0s (0/0)
    [+] Running 2/2
    ✔ Container app-app-1    Started                                                                                                       0.9s 
    ✔ Container app-mysql-1  Running
    

    Svazek byl vytvořen i síť. Ve výchozím nastavení Vytvoří Docker Compose síť speciálně pro zásobník aplikací.

  3. V rozšíření Docker klikněte pravým tlačítkem na kontejner aplikace a vyberte Zobrazit protokoly. Pokud chcete zobrazit protokoly z příkazového řádku, použijte docker logs tento příkaz.

    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
    

    Protokoly z každé služby jsou prokládání do jednoho datového proudu. Při tomto chování můžete sledovat problémy související s časováním.

    Název služby se zobrazí na začátku řádku, který pomáhá rozlišovat zprávy. Pokud chcete zobrazit protokoly pro konkrétní službu, přidejte název služby na konec příkazu logs.

  4. V tuto chvíli byste měli být schopni aplikaci otevřít. Zadejte http://localhost:3000 do prohlížeče.

Až tyto kontejnery dokončíte, můžete je jednoduše odebrat.

  • V Průzkumníku VS Code klikněte pravým tlačítkem na docker-compose.yml a vyberte Vytvořit dolů.
  • Na příkazovém řádku spusťte docker-compose downpříkaz .

Kontejnery se zastaví. Síť se odebere.

Ve výchozím nastavení se pojmenované svazky v souboru pro psaní neodeberou. Pokud chcete svazky odebrat, spusťte docker-compose down --volumespříkaz .

Vyčištění prostředků

Požadavky, které jste použili v této sérii kurzů, můžete použít pro budoucí vývoj Dockeru. Neexistuje žádný důvod k odstranění nebo odinstalaci čehokoli.

Další kroky

V tomto kurzu jste se dozvěděli o vícekontenerových aplikacích a Docker Compose. Docker Compose pomáhá výrazně zjednodušit definování a sdílení aplikací s více službami.

Tady jsou některé zdroje informací, které by pro vás mohly být užitečné: