Поделиться через


Руководство по созданию многоконтейнерных приложений с помощью MySQL и Docker Compose

В этой статье описывается создание многоконтейнерных приложений с помощью MySQL и Docker Compose. Приложение с несколькими контейнерами позволяет выделять контейнеры для специализированных задач, поэтому каждый контейнер может сосредоточиться на одной задаче. Существует множество преимуществ использования многоконтейнерных приложений:

  • Отдельные контейнеры позволяют управлять API и интерфейсными ресурсами по-разному, чем базы данных.
  • Несколько контейнеров позволяют создавать версии и обновлять их в изоляции.
  • Локальные базы данных можно поддерживать в контейнерах и управляемых службах, используемых для баз данных в рабочей среде.
  • Приложения с несколькими контейнерами более эффективны, чем выполнение нескольких процессов с помощью диспетчера процессов, что упрощает запуск и завершение работы контейнера.

В этом руководстве вы:

  • Запуск MySQL
  • Запуск приложения с несколькими контейнерами с помощью MySQL
  • Создание файла Docker Compose для приложения
  • Запуск стека приложений с помощью Docker Compose

Необходимые условия

  • Эта статья является частью серии учебников. Процедуры, созданные на основе установленного примера, требующего Docker Desktop для контейнеров Linux.

    Рекомендуемый подход — сначала завершить учебник Создание приложения-контейнера, выполнив соответствующие предварительные требования, а также учебник Сохранение данных в приложении. После работы с этими руководствами перейдите к процедурам, описанным в этой статье.

  • В примере в этой статье используется Docker Compose.

    Docker Desktop для Windows включает Docker Compose.

    Выполните следующую команду, чтобы проверить установку Docker:

    docker-compose version
    

Visual Studio Code

В этом руководстве описываются процедуры Visual Studio Code (VS Code). Ознакомьтесь со следующими рекомендациями по работе в этой среде:

  • Используйте меню слева для переключения между представлением ОБОЗРЕВАТЕЛЯ КОНТЕЙНЕРОВ и ПРОВОДНИКА (файлы и папки).

    Скриншот, на котором показаны Container Explorer и проводник файлов и папок в Visual Studio Code.

  • Откройте окно командной строки в VS Code, выбрав терминал >новый терминал. Вы также можете использовать сочетание клавиш Ctrl+Shift+` (обратная кавычка).

  • Если иное не указано, выполните команды в окне Bash. Большинство команд, помеченных для Bash выполняются в окне Bash или в окне командной строки VS Code.

Запуск системы управления базами данных MySQL

По умолчанию контейнеры выполняются в изоляции. Контейнер не знает о других процессах или других контейнерах на том же компьютере.

Чтобы включить обмен данными между контейнерами, им необходимо подключиться к одной сети. Несколько контейнеров в одной сети могут совместно использовать и обрабатывать данные.

Существует два способа подключения контейнера к сети. Контейнер можно подключить к сети во время создания или подключить существующий контейнер к сети позже.

В этом примере вы создадите сеть и подключите контейнер MySQL при запуске.

  1. Создание сети с именем todo-app:

    docker network create todo-app
    
  2. Запустите контейнер 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.

    Предупреждение

    В этом руководстве показаны учетные данные паролей для проверки подлинности в базе данных MySQL, которая не является самым безопасным методом. Дополнительные сведения о более безопасных методах проверки подлинности см. в документации MySQL.

  3. Получите идентификатор контейнера для использования на следующем шаге.

    docker ps
    
  4. Убедитесь, что вы можете подключиться к контейнеру в сети mysql.

    При выполнении команды введите идентификатор контейнера в место заполнителя <mysql-container-id>.

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

    В командной строке введите пароль, предоставленный при создании контейнера todo-mysql-data.

  5. В оболочке MySQL выведите список баз данных и убедитесь, что отображается база данных todos.

    SHOW DATABASES;
    

    Вы увидите следующие выходные данные:

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | todos              |
    +--------------------+
    5 rows in set (0.00 sec)
    
  6. Чтобы завершить подключение и вернуться к командной строке, введите выйти.

Запуск приложения с помощью MySQL

Приложение todo поддерживает настройку определенных переменных среды для указания параметров подключения MySQL. В следующей таблице перечислены поддерживаемые переменные и значения, используемые в примере, представленном в этом разделе.

Имя переменной Пример значения Описание
MYSQL_HOST mysql Имя узла сервера MySQL.
MYSQL_USER root Имя пользователя, используемое для подключения.
MYSQL_PASSWORD <your-password> Пароль, используемый для подключения. В этом примере замените корневой пароль заполнителем <your-password>.
MYSQL_DATABASE todos Имя базы данных, используемой после установки подключения.

Предупреждение

Использование переменных среды для задания параметров подключения приемлемо для разработки, но эта практика не рекомендуется для запуска приложений в рабочей среде. Дополнительные сведения см. в разделе Почему не следует использовать переменные среды для секретных данных.

Более безопасный механизм — использовать поддержку секретов, предоставляемую платформой оркестрации контейнеров. В большинстве случаев эти секреты монтируются как файлы в работающем контейнере.

В следующем примере вы запускаете приложение и подключаете контейнер приложения к контейнеру MySQL.

  1. Выполните следующую команду 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"
    
  2. В редакторе VS Code откройте обозреватель контейнеров, щелкните правой кнопкой мыши контейнер приложения и выберите "Просмотр журналов".

    Вы также можете просматривать журналы из командной строки с помощью команды docker logs.

  3. Просмотрите выходные данные журнала. Обратите внимание, что строка, указывающая, что приложение подключено к базе данных 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
    
  4. В браузере в интернете перейдите к работающему приложению: http://localhost:3000.

  5. В работающем приложении добавьте некоторые элементы в список дел.

  6. Подключитесь к базе данных контейнеров MySQL в сети mysql, чтобы проверить базу данных.

    При выполнении команды введите идентификатор контейнера в место заполнителя <mysql-container-id>.

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

    В командной строке введите пароль, предоставленный при создании контейнера todo-mysql-data.

  7. В оболочке 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.

  1. В корне проекта приложения todo создайте файл Docker Compose с именем docker-compose.yml.

    Заметка

    По умолчанию для версии схемы YAML задана последняя версия. При запуске приложения, если версия схемы устарела, вы получите предупреждение. Для получения сведений о текущих версиях схемы и матрице совместимости см. в обзоре (файл Compose).

  2. В файле docker-compose.yml добавьте следующие элементы. Укажите name приложения и запустите список services (или контейнеров), которые вы хотите запустить в рамках приложения.

    name: todo
    
    services:
    

    Список служб уникален для вашего приложения. К примерам относятся app, web, db, proxyи т. д. Вы расширяете определение элемента services на следующем шаге.

    Совет

    Отступ имеет важное значение в .yml файлах. Если вы редактируете VS Code, Intellisense указывает на любые ошибки в формате или синтаксисе.

  3. Вернитесь к определению services в файле docker-compose.yml. Расширение определения путем добавления записи для определения элемента службы app, который включает образ контейнера.

    services:
      app:
        image: node:lts-alpine
    

    Вы можете выбрать любое имя службы. Имя автоматически становится сетевым псевдонимом, который полезен при определении службы MySQL.

  4. Расширьте определение элемента app, чтобы указать command для выполнения.

      app:
        image: node:lts-alpine
        command: sh -c "yarn install && yarn run dev"
    
  5. Определите ports для использования со службой app. Обратите внимание, что эти порты соответствуют аргументу -p 3000:3000 для команды, используемой для запуска приложения с mySQL.

      app:
        image: node:lts-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
    
  6. Определите рабочий каталог 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 можно использовать относительные пути на основе текущего каталога.

  7. Укажите определения переменных для 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>.

  8. Добавьте определение службы MySQL mysql после определения службы app. Укажите имена и значения элементов, как показано, с таким же отступом.

    services:
      app:
        ...
      mysql:
        image: mysql:lts
    

    Определение службы mysql соответствует команде, которую вы использовали ранее для запуска MySQL. При определении службы он автоматически получает псевдоним сети.

  9. Определите volumes, сопоставленный службе mysql.

    services:
      app:
        ...
      mysql:
        image: mysql:lts
        volumes:
          - todo-mysql-data:/var/lib/mysql
    
  10. Укажите определения переменных для 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>.

  11. Определите сопоставление томов для всего приложения. Добавьте раздел volumes: следом за разделом services: с таким же отступом.

    services:
       ...
    
    volumes:
      todo-mysql-data:
    
  12. Убедитесь, что завершенный файл 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.

  1. Остановите все запущенные экземпляры приложения и базы данных.

    Выполните следующие действия в VS Code:

    1. Откройте обозреватель контейнеров (расширение "Средства контейнеров").

    2. Для каждого запущенного контейнера щелкните правой кнопкой мыши контейнер и выберите Удалить.

  2. Запустите приложение с несколькими контейнерами и все службы.

    Выполните следующие действия в VS Code:

    1. Откройте представление обозреватель для файлов и папок.

    2. Щелкните правой кнопкой мыши файл 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 создает сеть специально для стека приложений.

  3. Просмотрите логи запущенного контейнера.

    Выполните следующие действия в VS Code:

    1. Откройте обозреватель контейнеров (расширение "Средства контейнеров").

    2. Щелкните правой кнопкой мыши контейнер приложения и выберите Просмотр журналов.

    Вы должны увидеть выходные данные, аналогичные следующему примеру:

    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 в начале каждой строки. Этот формат позволяет вам различать сообщения по службам и экземплярам. Журналы из каждой службы встраиваются в один поток. Этот подход позволяет отслеживать проблемы, связанные с временем.

  4. Теперь вы можете перейти к работающему приложению в браузере Интернета: http://localhost:3000.

Остановка Docker Compose и запуск контейнеров

После завершения работы с приложением и контейнерами их можно удалить.

Выполните следующие действия в VS Code:

  1. Откройте представление обозреватель для файлов и папок.

  2. Щелкните правой кнопкой мыши файл docker-compose.yml и выберите Compose Down.

Эта операция останавливает все запущенные контейнеры и удаляет сеть.

По умолчанию именованные тома в файле Compose не удаляются. Если вы хотите удалить эти тома, воспользуйтесь командой docker-compose down --volumes.

Очистка ресурсов

Если вы применили необходимые компоненты в этой серии руководств к установке, вы можете повторно использовать конфигурацию для будущей разработки Docker. Не обязательно удалять или деинсталлировать какой-либо компонент.