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í.
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 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.
Pomocí tohoto příkazu vytvořte síť.
docker network create todo-app
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
Pomocí příkazu získejte ID kontejneru
docker ps
.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.
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)
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.
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"
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
Zadejte
http://localhost:3000
do prohlížeče. Přidejte do seznamu úkolů některé položky.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ě.
V kořenovém adresáři projektu aplikace vytvořte soubor s názvem
docker-compose.yml
.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.
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.
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.
Přidejte příkaz.
version: "3.7" services: app: image: node:20-alpine command: sh -c "yarn install && yarn run dev"
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
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.
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
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.
Definujte mapování svazků.
Zadejte svazek s oddílem
volumes:
na stejné úrovni jakoservices:
. 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:
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.
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.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í.
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.
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 down
pří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 --volumes
pří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é:
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro