Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается создание многоконтейнерных приложений с помощью MySQL и Docker Compose. Приложение с несколькими контейнерами позволяет выделять контейнеры для специализированных задач, поэтому каждый контейнер может сосредоточиться на одной задаче. Существует множество преимуществ использования многоконтейнерных приложений:
- Отдельные контейнеры позволяют управлять API и интерфейсными ресурсами по-разному, чем базы данных.
- Несколько контейнеров позволяют создавать версии и обновлять их в изоляции.
- Локальные базы данных можно поддерживать в контейнерах и управляемых службах, используемых для баз данных в рабочей среде.
- Приложения с несколькими контейнерами более эффективны, чем выполнение нескольких процессов с помощью диспетчера процессов, что упрощает запуск и завершение работы контейнера.
В этом руководстве вы:
- Запуск MySQL
- Запуск приложения с несколькими контейнерами с помощью MySQL
- Создание файла Docker Compose для приложения
- Запуск стека приложений с помощью Docker Compose
Необходимые условия
Эта статья является частью серии учебников. Процедуры, созданные на основе установленного примера, требующего Docker Desktop для контейнеров Linux.
Рекомендуемый подход — сначала завершить учебник Создание приложения-контейнера, выполнив соответствующие предварительные требования, а также учебник Сохранение данных в приложении. После работы с этими руководствами перейдите к процедурам, описанным в этой статье.
В примере в этой статье используется Docker Compose.
Visual Studio Code
В этом руководстве описываются процедуры Visual Studio Code (VS Code). Ознакомьтесь со следующими рекомендациями по работе в этой среде:
Используйте меню слева для переключения между представлением ОБОЗРЕВАТЕЛЯ КОНТЕЙНЕРОВ и ПРОВОДНИКА (файлы и папки).
Откройте окно командной строки в VS Code, выбрав терминал >новый терминал. Вы также можете использовать сочетание клавиш Ctrl+Shift+` (обратная кавычка).
Если иное не указано, выполните команды в окне Bash. Большинство команд, помеченных для
Bash
выполняются в окне Bash или в окне командной строки VS Code.
Запуск системы управления базами данных MySQL
По умолчанию контейнеры выполняются в изоляции. Контейнер не знает о других процессах или других контейнерах на том же компьютере.
Чтобы включить обмен данными между контейнерами, им необходимо подключиться к одной сети. Несколько контейнеров в одной сети могут совместно использовать и обрабатывать данные.
Существует два способа подключения контейнера к сети. Контейнер можно подключить к сети во время создания или подключить существующий контейнер к сети позже.
В этом примере вы создадите сеть и подключите контейнер MySQL при запуске.
Создание сети с именем
todo-app
:docker network create todo-app
Запустите контейнер MySQL с именем
todo-mysql-data
и подключите его к сетиtodo-app
. Команда создает псевдоним сетиmysql
дляtodos
базы данных MySQL.При выполнении команды введите корневой пароль MySQL для заполнителя
<your-password>
.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:lts
Эта команда также определяет переменные среды
MYSQL_ROOT_PASSWORD
иMYSQL_DATABASE
. Дополнительные сведения см. в списке MySQL Docker Hub.Получите идентификатор контейнера для использования на следующем шаге.
docker ps
Убедитесь, что вы можете подключиться к контейнеру в сети
mysql
.При выполнении команды введите идентификатор контейнера в место заполнителя
<mysql-container-id>
.docker exec -it <mysql-container-id> mysql -p
В командной строке введите пароль, предоставленный при создании контейнера
todo-mysql-data
.В оболочке MySQL выведите список баз данных и убедитесь, что отображается база данных
todos
.SHOW DATABASES;
Вы увидите следующие выходные данные:
+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | todos | +--------------------+ 5 rows in set (0.00 sec)
Чтобы завершить подключение и вернуться к командной строке, введите выйти.
Запуск приложения с помощью MySQL
Приложение todo
поддерживает настройку определенных переменных среды для указания параметров подключения MySQL. В следующей таблице перечислены поддерживаемые переменные и значения, используемые в примере, представленном в этом разделе.
Имя переменной | Пример значения | Описание |
---|---|---|
MYSQL_HOST |
mysql |
Имя узла сервера MySQL. |
MYSQL_USER |
root |
Имя пользователя, используемое для подключения. |
MYSQL_PASSWORD |
<your-password> |
Пароль, используемый для подключения. В этом примере замените корневой пароль заполнителем <your-password> . |
MYSQL_DATABASE |
todos |
Имя базы данных, используемой после установки подключения. |
Предупреждение
Использование переменных среды для задания параметров подключения приемлемо для разработки, но эта практика не рекомендуется для запуска приложений в рабочей среде. Дополнительные сведения см. в разделе Почему не следует использовать переменные среды для секретных данных.
Более безопасный механизм — использовать поддержку секретов, предоставляемую платформой оркестрации контейнеров. В большинстве случаев эти секреты монтируются как файлы в работающем контейнере.
В следующем примере вы запускаете приложение и подключаете контейнер приложения к контейнеру MySQL.
Выполните следующую команду
docker
. Обратите внимание, как команда указывает переменные среды, описанные ранее.При выполнении команды не забудьте ввести корневой пароль MySQL для заполнителя
<your-password>
.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:lts-alpine sh -c "yarn install && yarn run dev"
В редакторе VS Code откройте обозреватель контейнеров, щелкните правой кнопкой мыши контейнер приложения и выберите "Просмотр журналов".
Вы также можете просматривать журналы из командной строки с помощью команды
docker logs
.Просмотрите выходные данные журнала. Обратите внимание, что строка, указывающая, что приложение подключено к базе данных MySQL:
Connected to mysql db at host 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
В браузере в интернете перейдите к работающему приложению:
http://localhost:3000
.В работающем приложении добавьте некоторые элементы в список дел.
Подключитесь к базе данных контейнеров MySQL в сети
mysql
, чтобы проверить базу данных.При выполнении команды введите идентификатор контейнера в место заполнителя
<mysql-container-id>
.docker exec -ti <mysql-container-id> mysql -p todos
В командной строке введите пароль, предоставленный при создании контейнера
todo-mysql-data
.В оболочке MySQL убедитесь, что добавленные
todo_items
записаны в базу данныхtodos
.use todos; select * from todo_items;
Вы должны увидеть выходные данные, аналогичные следующему примеру:
+--------------------------------------+--------------------+-----------+ | id | name | completed | +--------------------------------------+--------------------+-----------+ | c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! | 0 | | 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome! | 0 | +--------------------------------------+--------------------+-----------+
Теперь у вас есть приложение, в котором хранятся данные во внешней базе данных, работающей в отдельном контейнере. В этой процедуре показано, как включить обмен данными между контейнерами с помощью сети.
Создание файла Docker Compose
Docker Compose помогает определять и совместно использовать многоконтейнерные приложения. Файл Docker Compose может указать все необходимые службы, чтобы можно было запустить или завершить все связанные процессы с помощью одной команды. Вы можете определить стек приложений в файле Docker Compose в корне репозитория проекта и сохранить конфигурацию под управлением версиями. Этот подход позволяет другим пользователям вносить свой вклад в проект при клонировании репозитория.
В следующем примере вы настроите файл Docker Compose для приложения с несколькими контейнерами todo
.
В корне проекта приложения
todo
создайте файл Docker Compose с именем docker-compose.yml.Заметка
По умолчанию для версии схемы YAML задана последняя версия. При запуске приложения, если версия схемы устарела, вы получите предупреждение. Для получения сведений о текущих версиях схемы и матрице совместимости см. в обзоре (файл Compose).
В файле docker-compose.yml добавьте следующие элементы. Укажите
name
приложения и запустите списокservices
(или контейнеров), которые вы хотите запустить в рамках приложения.name: todo services:
Список служб уникален для вашего приложения. К примерам относятся
app
,web
,db
,proxy
и т. д. Вы расширяете определение элементаservices
на следующем шаге.Совет
Отступ имеет важное значение в .yml файлах. Если вы редактируете VS Code, Intellisense указывает на любые ошибки в формате или синтаксисе.
Вернитесь к определению
services
в файле docker-compose.yml. Расширение определения путем добавления записи для определения элемента службыapp
, который включает образ контейнера.services: app: image: node:lts-alpine
Вы можете выбрать любое имя службы. Имя автоматически становится сетевым псевдонимом, который полезен при определении службы MySQL.
Расширьте определение элемента
app
, чтобы указатьcommand
для выполнения.app: image: node:lts-alpine command: sh -c "yarn install && yarn run dev"
Определите
ports
для использования со службойapp
. Обратите внимание, что эти порты соответствуют аргументу-p 3000:3000
для команды, используемой для запуска приложения с mySQL.app: image: node:lts-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000
Определите рабочий каталог
working_dir
для службыapp
, а также сопоставленный элементvolumes
.app: image: node:lts-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app
При определении томов Docker Compose можно использовать относительные пути на основе текущего каталога.
Укажите определения переменных для
environment
, которые следует использовать при исполнении команд для службыapp
.app: image: node:lts-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 для заполнителя
<your-password>
.Добавьте определение службы MySQL
mysql
после определения службыapp
. Укажите имена и значения элементов, как показано, с таким же отступом.services: app: ... mysql: image: mysql:lts
Определение службы
mysql
соответствует команде, которую вы использовали ранее для запуска MySQL. При определении службы он автоматически получает псевдоним сети.Определите
volumes
, сопоставленный службеmysql
.services: app: ... mysql: image: mysql:lts volumes: - todo-mysql-data:/var/lib/mysql
Укажите определения переменных для
environment
, которые следует использовать при исполнении команд для службыmysql
.services: app: ... mysql: image: mysql:lts volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: <your-password> MYSQL_DATABASE: todos
Не забудьте ввести корневой пароль MySQL для заполнителя
<your-password>
.Определите сопоставление томов для всего приложения. Добавьте раздел
volumes:
следом за разделомservices:
с таким же отступом.services: ... volumes: todo-mysql-data:
Убедитесь, что завершенный файл docker-compose.yml выглядит следующим образом. Вы должны увидеть корневой пароль MySQL для заполнителя
<your-password>
.name: todo services: app: image: node:lts-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:lts volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: <your-password> MYSQL_DATABASE: todos volumes: todo-mysql-data:
Запуск стека приложений с помощью Docker Compose
Теперь можно попробовать запустить файл docker-compose.yml.
Остановите все запущенные экземпляры приложения и базы данных.
Выполните следующие действия в VS Code:
Откройте обозреватель контейнеров (расширение "Средства контейнеров").
Для каждого запущенного контейнера щелкните правой кнопкой мыши контейнер и выберите Удалить.
Запустите приложение с несколькими контейнерами и все службы.
Выполните следующие действия в VS Code:
Откройте представление обозреватель для файлов и папок.
Щелкните правой кнопкой мыши файл docker-compose.yml и выберите Compose Up.
Вы должны увидеть выходные данные, аналогичные следующему примеру:
[+] Building 0.0s (0/0) [+] Running 2/2 ✔ Container app-app-1 Started 0.9s ✔ Container app-mysql-1 Running
Эта операция создает сопоставленный том для приложения и сети. По умолчанию Docker Compose создает сеть специально для стека приложений.
Просмотрите логи запущенного контейнера.
Выполните следующие действия в VS Code:
Откройте обозреватель контейнеров (расширение "Средства контейнеров").
Щелкните правой кнопкой мыши контейнер приложения и выберите Просмотр журналов.
Вы должны увидеть выходные данные, аналогичные следующему примеру:
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
В журналах отображаются имя службы и номер экземпляра, например
app_1
в начале каждой строки. Этот формат позволяет вам различать сообщения по службам и экземплярам. Журналы из каждой службы встраиваются в один поток. Этот подход позволяет отслеживать проблемы, связанные с временем.Теперь вы можете перейти к работающему приложению в браузере Интернета:
http://localhost:3000
.
Остановка Docker Compose и запуск контейнеров
После завершения работы с приложением и контейнерами их можно удалить.
Выполните следующие действия в VS Code:
Откройте представление обозреватель для файлов и папок.
Щелкните правой кнопкой мыши файл docker-compose.yml и выберите Compose Down.
Эта операция останавливает все запущенные контейнеры и удаляет сеть.
По умолчанию именованные тома в файле Compose не удаляются. Если вы хотите удалить эти тома, воспользуйтесь командой docker-compose down --volumes
.
Очистка ресурсов
Если вы применили необходимые компоненты в этой серии руководств к установке, вы можете повторно использовать конфигурацию для будущей разработки Docker. Не обязательно удалять или деинсталлировать какой-либо компонент.