Используйте Docker Compose для создания локальной среды разработки для приложений Node.js (Nest.js).

Node.js

Разработка на локальном компьютереNode.jsПриложение, вам необходимо установить Node.js и подготовить систему управления базой данных, необходимую для приложения. Чтобы установить Node.js локально, вы можете напрямую загрузить и использовать установочный пакет, чтобы в вашу систему была включена только одна версия Node.js. Если вы хотите иметь несколько версий Node.js одновременно, вы можете использовать NVM, инструмент для управления несколькими версиями Node.js, установленными на вашем компьютере, и вы можете переключаться между разными версиями.

Еще один способ создать среду разработки приложений Node.js — использоватьDocker. Далее я расскажу об использовании Docker и Docker Compose для создания среды разработки Node.js на локальном компьютере. В качестве демонстрации я буду использовать фреймворк приложения Nest.js.

необходимость

Чтобы использовать Docker локально, установите настольную версию Docker, например Docker для Windows или Docker для Mac. Использование Docker Desktop на компьютере Mac не должно вызывать особых проблем, но для запуска Docker Desktop в Windows есть некоторые требования.

Система должна быть Windows 10 Professional или Enterprise Edition, обычная Windows 10 не будет работать, и в системе должен быть включен Hyper-V.

Подготовить

Загрузите и установите настольную версию Docker, которая довольно велика и занимает некоторое время.Перед загрузкой вам необходимо войти в свою учетную запись Docker Hub.

  • Windows: https://docs.docker.com/docker-foru-windows/install/
  • macOS: https://docs.docker.com/docker-foru-Mac/install/

Большинство операций Docker необходимо выполнять в интерфейсе командной строки, поэтому вам необходимо подготовить интерфейс командной строки.Пользователи macOS могут использовать терминал, который идет в комплекте с системой (Терминал), пользователям Windows рекомендуется скачать и установить полную версию Cmder, а затем создайте новый Bash в качестве командной строки администратора.

настроить

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

Место для загрузки этих образов по умолчанию находится за границей, поэтому мы иногда медленны в Китае.Решение состоит в том, чтобы настроить Docker для использования внутреннего адреса ускорения изображений. Например, Alibaba Cloud временно предоставляет эту услугу, вы можете использовать своюАли КлаудВойдите в сервис зеркалирования контейнеров Alibaba Cloud под своей учетной записью, и вы найдете в нем адрес ускорения зеркала, который выглядит так: https://wgaccbzr.mirror.aliyuncs.com

Настройте адрес ускорения, который вы нашли в сервисе образов облачных контейнеров Alibaba, в зеркалах реестра Docker.

Среда разработки Nest.js

Затем мы используем Docker Compose для создания среды разработки, которая может запускать приложения Nest.js локально.

docker-compose.yml

Docker Compose позволяет нам описать сервисы (контейнеры), необходимые приложению, в файле, создать новый каталог для проекта, который вы хотите разработать, а затем создать файл docker-compose.yml в корневом каталоге. Сначала добавьте две строки кода внутрь:

version: '3'

services:

использоватьversionНастройте использование версии Docker Compose, и несколько служб, необходимых для среды разработки, будут доступны через некоторое время.servicesОпределено ниже.

.env

Службы, определенные в файле docker-compose.yml, могут использовать некоторые переменные среды, и эти переменные среды и соответствующие значения можно поместить отдельно в файл с именем.envВ файле этот файл эквивалентен файлу конфигурации. Создайте пустой файл в корневом каталоге проекта с именем:.env.

Инструмент командной строки для подготовки приложений Nest.js

Если вы планируете разработать Node-приложение на основе фреймворка Nest.js, вы можете сначала установить инструмент командной строки (@nestjs/cli), предоставляемый этим фреймворком, который позволяет нам использовать команды для создания нового приложения и некоторых компонентов. нужно в приложении. Однако, поскольку мы планируем использовать Docker для создания среды разработки приложений, мы не будем устанавливать этот инструмент непосредственно на компьютер, поскольку для этого потребуется установить на компьютер Node.js.

существуетdocker-compose.ymlСлужба определена в файле, и ее функция заключается в том, чтобы позволить нам использовать инструменты командной строки, предоставляемые в среде Nest.js, для открытияdocker-compose.ymlфайл, вservicesДавайте добавим сервис инструмента командной строки:

version: '3'

services:
  cli:
    image: nestjs/cli
    volumes:
      - ./app:/workspace
    tty: true

Вышеизложенное определяетcliСлужба, вы можете определить имя произвольно, эта служба используетimage, то есть зеркалоnestjs/cli,volumesУстановите функцию объема данных, что означает, что каталог приложения в текущем каталоге соответствует каталогу в контейнере./workspaceэто место. Пучокttyустановлен вtrueзаключается в том, чтобы этот контейнер работал все время.

Откройте терминал системы (Terminal), пользователям Windows рекомендуется использовать Cmder. Входитьdocker-compose.ymlкаталог, в котором находится файл, затем запустите службу:

cd ~/desktop/ninghao-nestjs
docker-compose up -d cli

Выше выполняются две команды, первая строка — вводdocker-compose.ymlКаталог, в котором находится файл, вторая строка команды выполняется в фоновом режимеdocker-compose.ymlТот, который определен в файле, называетсяcliуслуга. Убедитесь, что служба запущена:

docker-compose ps
        Name           Command   State    Ports  
-------------------------------------------------
ninghao-nestjs_cli_1   /bin/sh   Up      3000/tcp

Обратите внимание, что служба находится в состоянии Up, что означает, что она работает. Вы можете войти в систему ниже.cliСлужить:

docker-compose exec cli /bin/sh

После ввода командная строка будет выглядеть так:

/workspace #

В этом контейнере мы можем использовать инструменты командной строки в приложении Nest.js для выполнения:

nest

Появятся некоторые справочные сообщения:

Usage: nest [options] [command]

Options:
  -V, --version                                   output the version number
  -h, --help                                      output usage information

Commands:
  new|n [options] [name]                          Generate Nest application
  generate|g [options]  [name] [path]  Generate a Nest element
    Available schematics:

Создайте приложение с помощью инструмента командной строки Nest

в созданныйcliПосле этого контейнера вы можете выполнитьnestCommand, воспользуемся этой командой для создания проекта Nest.js. воплощать в жизнь:

nest new app

Появится что-то вроде этого:

⚡  We will scaffold your app in a few seconds..

CREATE /app/.prettierrc (51 bytes)
CREATE /app/README.md (3370 bytes)
CREATE /app/nest-cli.json (84 bytes)
...

выше используетсяnest newкоманда создает проект, вставляетappниже каталога, хотя вcliЭтот проект создается в контейнере, но мы настроили объем данных этого сервиса, поэтому созданный файл проекта также будет виден на локальном компьютере. То есть это у вас на локальном компеdocker-compose.ymlНиже каталога, в котором находится файл, вы увидите значокappкаталог, здесь находится созданный проект Nest.js.

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

При создании проекта вам может быть предложено:

Failed to execute command: git init
Git repository has not been initialized

Это связано с тем, что после создания проектаnestКоманда инициализирует репозиторий кода, но он не установлен в этом контейнере.git, так что будут проблемы при выполнении связанных команд. Вы можете использовать Git для локального управления исходным кодом вашего проекта.

Обратите внимание, что если вы чувствуете, что скорость создания проекта низкая, вы можете войти вcliПосле того, как служба окажется внутри, выполните:

npm config set registry https://registry.npm.taobao.org

определить службу приложения

существуетdocker-compose.ymlВ файле определите службу, которая запускает приложение Nest.js:

  nest:
    image: node:${NODE_VERSION}
    working_dir: /home/node/app
    command: npm config set registry https://registry.npm.taobao.org
    command: npm run start:dev
    volumes:
      - ./app:/home/node/app
    ports:
      - ${APP_PORT}:3000

Вышеизложенное определяетnestсервис, потому что созданное нами приложение основано на фреймворке Nest.js, поэтому имя этого сервисаnest, вы также можете изменить свое любимое имя.

nestдля этой услугиimageдаnode, конкретная версия использует переменную среды,NODE_VERSION, эта переменная окружения также имеет соответствующее значение, которое должно находиться в.envНастройте его в файле.

working_dirПерейдите в рабочий каталог и выполните дваcommand, нужно установитьnpmИсточник установки, чтобы установка пакета в дальнейшем была быстрее, второйcommandОн управляет услугами разработки проекта.

volumesОбъем данных установлен таким образом, что текущая директорияappЭтот каталог соответствуетnestв этом служебном контейнере/home/node/app, мы находимся под этим каталогом этого сервиса и выполняемnpm run start:dev, который также будет запускать службу разработки для этого проекта Nest.js.

portsУстановка публичного порта означает установку порта на хосте (локальном компьютере) таким образом, чтобы этот порт соответствовал порту в контейнере. После запуска службы разработки для приложения Nest он будет использовать3000Этот порт предоставляет услуги.${APP_PORT}Вот это называетсяAPP_PORTпеременная среды, конкретное значение должно быть в.envУстановить в файле:

NODE_VERSION=11.13
APP_PORT=3000

обрати внимание на.envфайл, мы позволяемAPP_PORTЗначение этой переменной окружения равно3000, то есть открытый порт должен быть3000:3000, то есть на локальном компьютере3000Порт соответствует тому, что в этом сервисе3000порт.

с этим новымnestсервис, чтобы запустить его снова:

docker-compose up -d nest

Если все в порядке, откройте браузер, перейдите по адресу http://localhost:3000, и вы должны увидеть «Hello World».

позже вам нужно использоватьnpm installПри установке некоторых пакетов для проекта можно ввести этоnestВнутри службы используйтеnpm. Вход в эту службу может выполнять:

docker-compose exec nest bash

Определить службы данных

Разработка приложений Nest.js поддерживает использование множества различных типов баз данных, вам необходимо создать соответствующий сервис, для какой системы баз данных вам нужно. Например, я хочу использовать в своем приложении базу данных, такую ​​как MySQL, поэтому я могу использоватьdocker-compose.ymlВнутри определитеmysqlСлужить:

  mysql:
    image: mysql:${MYSQL_VERSION}
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    ports:
      - ${MYSQL_PORT}:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

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

MYSQL_VERSION=5.7
MYSQL_PORT=3306
MYSQL_DATABASE=nest
MYSQL_USER=nest
MYSQL_ROOT_PASSWORD=root
MYSQL_PASSWORD=password

Главное — указать используемую версию системы MySQL, какой порт используется для доступа к этой службе данных на локальном хосте, а также имя, пользователя и пароль создаваемой базы данных. вы можете изменить.envЗначение этих переменных среды в файле для изменения конфигурации базы данных.

Вышеупомянутое создаст5.7версия MySQL, порт, используемый для использования этой службы данных на локальном хосте,3306Система создает базу данных под названиемnestбазу данных, вы можете использовать эту базу данных для работыnestпользователя, соответствующий парольpassword, и настроить систему базы данныхrootПароль пользователяroot.

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

docker-compose up -d mysql

Просмотр журналов

Просмотр вывода журнала контейнера, вы можете сделать:

docker-compose logs --follow

приложение

докер-compose.yml:

version: '3'

services:
  cli:
    image: nestjs/cli
    volumes:
      - ./:/workspace
    tty: true
  nest:
    image: node:${NODE_VERSION}
    working_dir: /home/node/app
    command: npm config set registry https://registry.npm.taobao.org
    command: npm run start:dev
    volumes:
      - ./app:/home/node/app
    ports:
      - ${APP_PORT}:3000
  mysql:
    image: mysql:${MYSQL_VERSION}
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    ports:
      - ${MYSQL_PORT}:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

.env:

NODE_VERSION=11.13
APP_PORT=3000

MYSQL_VERSION=5.7
MYSQL_PORT=3306
MYSQL_DATABASE=nest
MYSQL_USER=nest
MYSQL_ROOT_PASSWORD=root
MYSQL_PASSWORD=password