Samouczek: tworzenie aplikacji wielokontenerowych za pomocą programów MySQL i Docker Compose
Z tego samouczka dowiesz się, jak tworzyć aplikacje z wieloma kontenerami. Ten samouczek opiera się na samouczkach wprowadzających, rozpoczynaniu pracy z platformą Docker i programem Visual Studio Code. W tym zaawansowanym samouczku zaktualizujesz aplikację tak, aby działała zgodnie z opisem na tym diagramie i dowiesz się, jak wykonywać następujące działania:
- Uruchom program MySQL.
- Uruchom aplikację za pomocą programu MySQL.
- Utwórz plik redagowania.
- Uruchom stos aplikacji.
Korzystanie z wielu kontenerów umożliwia dedykować kontenery dla wyspecjalizowanych zadań. Każdy kontener powinien zrobić jedną rzecz i zrobić to dobrze.
Oto kilka powodów, dla których warto używać aplikacji wielokontenerowych:
- Oddzielaj kontenery, aby zarządzać interfejsami API i frontonami inaczej niż bazy danych.
- Kontenery umożliwiają przechowywanie wersji i aktualizowanie wersji w izolacji.
- Chociaż możesz użyć kontenera dla bazy danych lokalnie, możesz użyć usługi zarządzanej dla bazy danych w środowisku produkcyjnym.
- Uruchamianie wielu procesów wymaga menedżera procesów, co zwiększa złożoność uruchamiania/zamykania kontenera.
Wymagania wstępne
Ten samouczek kontynuuje serię samouczków, począwszy od sekcji Tworzenie aplikacji kontenera. Zacznij od tego, który zawiera wymagania wstępne. Następnie wykonaj samouczek Utrwalanie danych w aplikacji.
Potrzebne są również następujące elementy:
-
Program Docker Desktop dla systemu Windows lub Mac zawiera narzędzie Docker Compose. Uruchom to polecenie, aby sprawdzić:
docker-compose version
Jeśli używasz systemu operacyjnego Linux, zainstaluj program Docker Compose.
Podobnie jak w przypadku poprzednich samouczków, większość zadań można wykonać z widoku EKSPLORATORa programu VS Code lub widoku platformy DOCKER. Możesz wybrać pozycję Terminal>Nowy terminal, aby otworzyć okno wiersza polecenia w programie VS Code. Polecenia można również uruchamiać w oknie powłoki Bash. O ile nie określono, każde polecenie oznaczone jako powłoka Bash może być uruchamiane w oknie powłoki Bash lub w terminalu programu VS Code.
Uruchamianie bazy danych MySQL
Kontenery, domyślnie, działają w izolacji. Nie wiedzą nic o innych procesach ani kontenerach na tym samym komputerze. Aby zezwolić jednemu kontenerowi na rozmowę z innym, użyj sieci.
Jeśli dwa kontenery znajdują się w tej samej sieci, mogą komunikować się ze sobą. Jeśli tak nie jest, nie mogą.
Istnieją dwa sposoby umieszczania kontenera w sieci: przypisywanie go na początku lub łączenie istniejącego kontenera. W tym przykładzie najpierw utworzysz sieć i dołączysz kontener MySQL podczas uruchamiania.
Utwórz sieć przy użyciu tego polecenia.
docker network create todo-app
Uruchom kontener MySQL i dołącz go do sieci.
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
To polecenie definiuje również zmienne środowiskowe. Aby uzyskać więcej informacji, zobacz Artykuł MySQL Docker Hub listing (Lista usługi Docker Hub w usłudze MySQL).
Polecenie określa alias sieciowy,
mysql
.Pobierz identyfikator kontenera
docker ps
przy użyciu polecenia .Aby potwierdzić, że baza danych jest uruchomiona, połącz się z bazą danych.
docker exec -it <mysql-container-id> mysql -p
Wprowadź hasło użyte powyżej po wyświetleniu monitu.
W powłoce MySQL wyświetl listę baz danych i sprawdź, czy baza danych jest widoczna
todos
.SHOW DATABASES;
Powinny zostać wyświetlone następujące dane wyjściowe.
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | todos | +--------------------+ 5 rows in set (0.00 sec)
Wprowadź
exit
, gdy wszystko będzie gotowe do powrotu do wiersza polecenia terminalu.
Uruchamianie aplikacji za pomocą programu MySQL
Aplikacja do wykonania obsługuje ustawienie zmiennych środowiskowych w celu określenia ustawień połączenia z programem MySQL.
MYSQL_HOST
Nazwa hosta serwera MySQL.MYSQL_USER
Nazwa użytkownika do użycia na potrzeby połączenia.MYSQL_PASSWORD
Hasło do użycia dla połączenia.MYSQL_DB
Baza danych do użycia po nawiązaniu połączenia.
Ostrzeżenie
Ustawienie ustawień połączenia przy użyciu zmiennych środowiskowych jest akceptowalne w przypadku programowania. Zalecamy stosowanie tej praktyki w przypadku uruchamiania aplikacji w środowisku produkcyjnym. Aby uzyskać więcej informacji, zobacz Dlaczego nie należy używać zmiennych środowiskowych dla tajnych danych.
Bezpieczniejszym mechanizmem jest użycie obsługi wpisów tajnych udostępnianych przez platformę orkiestracji kontenerów. W większości przypadków te wpisy tajne są instalowane jako pliki w uruchomionym kontenerze.
Ta procedura uruchamia aplikację i łączy ten kontener z kontenerem MySQL.
Użyj następującego polecenia docker run. Określa zmienne środowiskowe powyżej.
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"
W programie VS Code w widoku platformy Docker kliknij prawym przyciskiem myszy kontener aplikacji i wybierz pozycję Wyświetl dzienniki. Aby wyświetlić dzienniki z wiersza polecenia, użyj
docker logs
polecenia .Wynik zawiera wiersz wskazujący, że aplikacja jest połączona z bazą danych 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
Wprowadź
http://localhost:3000
wartość w przeglądarce. Dodaj niektóre elementy do listy zadań do wykonania.Połączenie do bazy danych MySQL, tak jak w poprzedniej sekcji. Uruchom to polecenie, aby sprawdzić, czy elementy są zapisywane w bazie danych.
docker exec -ti <mysql-container-id> mysql -p todos
W powłoce MySQL uruchom następujące polecenia.
use todos; select * from todo_items;
Wynik będzie wyglądać podobnie do poniższych danych wyjściowych.
+--------------------------------------+--------------------+-----------+ | id | name | completed | +--------------------------------------+--------------------+-----------+ | c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! | 0 | | 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome! | 0 | +--------------------------------------+--------------------+-----------+
W tym momencie masz aplikację, która przechowuje dane w zewnętrznej bazie danych. Ta baza danych działa w osobnym kontenerze. Wiesz już o sieci kontenerów.
Tworzenie pliku docker Compose
Aplikacja Docker Compose ułatwia definiowanie i udostępnianie aplikacji z wieloma kontenerami. Za pomocą narzędzia Docker Compose można utworzyć plik w celu zdefiniowania usług. Za pomocą jednego polecenia można ściągnąć wszystko lub rozerwać wszystko.
Możesz zdefiniować stos aplikacji w pliku i zachować ten plik w katalogu głównym repozytorium projektu pod kontrolą wersji. Takie podejście umożliwia innym osobom współtworzenie projektu. Wystarczyłoby sklonować repozytorium.
W katalogu głównym projektu aplikacji utwórz plik o nazwie
docker-compose.yml
.W pliku redagowania rozpocznij od zdefiniowania wersji schematu.
version: "3.7"
W większości przypadków najlepiej użyć najnowszej obsługiwanej wersji. Aby uzyskać informacje o bieżących wersjach schematów i macierzy zgodności, zobacz Compose file (Redaguj plik).
Zdefiniuj usługi lub kontenery, które mają być uruchamiane w ramach aplikacji.
version: "3.7" services:
Napiwek
Wcięcie jest istotne w plikach yml . W przypadku edytowania w programie VS Code funkcja IntelliSense wskazuje błędy.
Oto polecenie użyte do kontenera aplikacji. Te informacje zostaną dodane do pliku 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"
Zdefiniuj wpis usługi i obraz kontenera.
version: "3.7" services: app: image: node:20-alpine
Możesz wybrać dowolną nazwę usługi. Nazwa automatycznie staje się aliasem sieci, który jest przydatny podczas definiowania usługi MySQL.
Dodaj polecenie .
version: "3.7" services: app: image: node:20-alpine command: sh -c "yarn install && yarn run dev"
Określ porty dla usługi, które odpowiadają
-p 3000:3000
w poleceniu powyżej.version: "3.7" services: app: image: node:20-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000
Określanie katalogu roboczego i mapowania woluminu
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
W definicjach woluminów narzędzia Docker Compose można użyć ścieżek względnych z bieżącego katalogu.
Określ definicje zmiennych środowiskowych.
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
Dodaj definicje dla usługi MySQL. Poniżej przedstawiono polecenie, którego użyto powyżej:
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
Zdefiniuj nową usługę i nadaj jej nazwę mysql. Dodaj tekst po
app
definicji na tym samym poziomie wcięcia.version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7
Usługa automatycznie pobiera alias sieciowy. Określ obraz do użycia.
Zdefiniuj mapowanie woluminu.
Określ wolumin z sekcją
volumes:
na tym samym poziomie coservices:
. Określ mapowanie woluminów pod obrazem.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:
Określ zmienne środowiskowe.
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:
W tym momencie ukończenie docker-compose.yml
wygląda następująco:
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:
Uruchamianie stosu aplikacji
Teraz, gdy masz docker-compose.yml
plik, wypróbuj go.
Upewnij się, że żadne inne kopie aplikacji i bazy danych nie są uruchomione. W rozszerzeniu platformy Docker kliknij prawym przyciskiem myszy dowolny uruchomiony kontener i wybierz polecenie Usuń. Możesz też użyć polecenia
docker rm
w wierszu polecenia, jak w poprzednich przykładach.W Eksploratorze programu VS Code kliknij prawym przyciskiem myszy plik docker-compose.yml i wybierz polecenie Utwórz. Możesz też użyć tego polecenia platformy Docker w wierszu polecenia.
docker-compose up -d
Parametr
-d
sprawia, że polecenie jest uruchamiane w tle.Powinny zostać wyświetlone dane wyjściowe podobne do poniższych wyników.
[+] Building 0.0s (0/0) [+] Running 2/2 ✔ Container app-app-1 Started 0.9s ✔ Container app-mysql-1 Running
Wolumin został utworzony, a także sieć. Domyślnie narzędzie Docker Compose tworzy sieć specjalnie dla stosu aplikacji.
W rozszerzeniu platformy Docker kliknij prawym przyciskiem myszy kontener aplikacji i wybierz pozycję Wyświetl dzienniki. Aby wyświetlić dzienniki z wiersza polecenia, użyj
docker logs
polecenia .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
Dzienniki z poszczególnych usług są przeplatane w jeden strumień. Dzięki temu zachowaniu można obserwować problemy związane z chronometrażem.
Nazwa usługi jest wyświetlana na początku wiersza, aby ułatwić odróżnienie komunikatów. Aby wyświetlić dzienniki dla określonej usługi, dodaj nazwę usługi na końcu polecenia logs.
Na tym etapie powinno być możliwe otwarcie aplikacji. Wprowadź
http://localhost:3000
wartość w przeglądarce.
Gdy skończysz z tymi kontenerami, możesz je usunąć po prostu.
- W Eksploratorze programu VS Code kliknij prawym przyciskiem myszy plik docker-compose.yml i wybierz polecenie Redaguj w dół.
- W wierszu polecenia uruchom polecenie
docker-compose down
.
Kontenery zatrzymują się. Sieć zostanie usunięta.
Domyślnie nazwane woluminy w pliku redagowania nie są usuwane.
Jeśli chcesz usunąć woluminy, uruchom polecenie docker-compose down --volumes
.
Czyszczenie zasobów
Wymagania wstępne użyte w tej serii samouczków mogą służyć do tworzenia w przyszłości platformy Docker. Nie ma powodu, aby usunąć ani odinstalować niczego.
Następne kroki
W tym samouczku przedstawiono informacje o aplikacjach z wieloma kontenerami i narzędziu Docker Compose. Aplikacja Docker Compose znacznie upraszcza definiowanie i udostępnianie aplikacji obsługujących wiele usług.
Poniżej przedstawiono niektóre zasoby, które mogą być przydatne:
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla