Рубрики
Uncategorized

Настройка adonis.js с Docker & MySQL

Это, вероятно, будет миллионным учебником Docker, но я чувствовал, что должен был сделать это как ресурсы, посвященные … Tagged с JavaScript, Node, DevOps, WebDev.

Вероятно, это будет миллионное руководство Docker, но я чувствовал, что должен был сделать это, поскольку ресурсы, посвященные моему конкретному варианту использования (настройка Adonis.js на машине Windows с MySQL), особенно трудно найти.

Предположения

Погрузитесь в этот урок, я сделаю несколько основных предположений:

  • Вы знакомы с запуском приложений Adonis на установке Windows.
  • У вас есть базовое понимание Docker (хотя вам не нужно быть DevOps)

Монтаж

Чтобы сохранить этот урок кратким, насколько это возможно, мы не будем освещать установку Docker здесь, потому что прекрасные люди в Docker уже делал

Настраивать

Мы создадим каталог для размещения наших различных услуг. Посетите папку предпочтительных проектов, откройте командное окно и запустите:

mkdir -p docker-adonis-starter\services\api

cd docker-adonis-starter

Эти команды создадут каталоги для нашего API оказание услуг. Нам также нужно добавить шаблон стартера для API и Docker-compose.yml Для настройки наших различных контейнеров:

touch docker-compose.yml

Клонировать шаблон стартера Adonis:

git clone --dissociate https://github.com/adonisjs/adonis-api-app services/api

Нам также нужно настроить наш Dockerfile Чтобы позволить нам правильно настроить наш API оказание услуг:

touch services/src/api/Dockerfile

Мы будем тянуть предварительно построенное изображение и настраивать нашу установку. Добавьте эти строки в наши Dockerfile :

# We'll use the Node slim image as a base cos it's light and nice
FROM node:10-alpine

WORKDIR /usr/src/services/api

# Copy package.json & package-lock.json to the root of the api dir
COPY package*.json ./

# Create an .env file by copying the .env.example file
COPY .env.example .env

# Add node_modules to the envionmental path variable so we can run binaries easily
ENV PATH /usr/src/services/api/node_modules/.bin:$PATH

USER root

# Install the good ol' NPM modules and get Adonis CLI in the game
RUN npm install --no-optional

# We'll use PM2 as a process manager for our Node server
RUN npm i -g pm2

# Copy everything to the root of the API service docker volume, and expose port to the outside world
COPY --chown=node:node . .

# Let all incoming connections use the port below
EXPOSE 1379

CMD npm run pm2:start

Создать PM2 Файл конфигурации, чтобы мы могли указать, сколько экземпляров/кластеров нам нужно:

var pm2Config = {
  apps: [
    {
      name: "server",
      script: "server.js",
      exec_mode: "cluster_mode",
      instances: 1,
      watch: false,
      ignore_watch: ["node_modules", ".git", "tmp", "./Dockerfile"],
    },
  ],
};

module.exports = pm2Config;

Не забудьте добавить свой .dockerignore Файл с контентом ниже, чтобы мы не копировали их в наше изображение Docker.

node_modules
npm-debug.log
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode

Мы встроим это в изображение Docker и пометить его, чтобы мы могли запустить его самостоятельно и убедиться, что наш Dockerfile — все это хорошо. Не забудьте заменить <ваше имя пользователя> в заполнителе ниже.

docker build -t /docker-adonis-api .

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

docker run -p 1379:3333 -d docker-adonis-api

Если вы посетите http://localhost: 1379 Вы должны увидеть хорошую приветственную страницу от Adonis.

Хорошая работа! Теперь нам нужно создать Docker-compose.yml Файл в корне нашего рабочего каталога, чтобы мы могли настроить наши контейнеры и сервисы Docker.

version: "3.2"

services:
  docker-adonis-api:
    image: docker-adonis-api
    container_name: docker-adonis-api
    restart: unless-stopped

    # We specify the image for this service and where we can build that image from
    build:
      context: ./services/api
      dockerfile: Dockerfile

    # We can use these volumes to specify where we want our files to be accessible at.
    # It's best to house all node modules on a separate volume
    volumes:
      - "./services/api:/usr/src/services/api"
      - "./services/api/node_modules"
    ports:
      - "1379:3333"

    # For Windows, we need to enable Chokidar polling so our file changes reflect in real-time.
    environment:
      - CHOKIDAR_USEPOLLING=1

Нам нужно создать сеть, чтобы наш API мог общаться с другими услугами. Мы также планируем использовать Mysql Как наша основная база данных, поэтому мы также настроем Mysql Сервис как зависимость нашего приложения. Добавьте эти строки чуть ниже порты запись в Docker-compose.yml Анкет

networks:
  - app-network
depends_on:
  - adonis-mysql
  - adonis-mysql-testing

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

Мы сделаем обновление на нашем Docker-compose.yml и добавить экземпляры базы данных. Соединения будут сделаны на порту 1380 И мы добавим запись в систему проверки здоровья, поэтому наше приложение только начинает работать Когда соединение MySQL готово принять запросы.

  adonis-mysql:
    # We'll use the MySQL 5.7 image as our base image. Less likely to spring unexpected surprises.
    image: mysql:5.7
    restart: always
    container_name: adonis-mysql
    healthcheck:
      test: ["CMD", "curl", "-fk", "tcp://localhost:3306"]
      interval: 300s
      timeout: 400s
      retries: 10
    ports:
      - 3306:3306
    expose:
      - "3306"
    # It is best to bind sockets on Windows.
    command: --innodb_use_native_aio=0 --socket=/tmp/mysql.sock --bind_address=0.0.0.0

    # We'd like to be able to access our data files on our local filesystem
    volumes:
      - ./db:/var/lib/mysql

    # It is recommended to not do this in production as it is wildly insecure
    environment:
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'mr-adonis'
      # You can use whatever password you like
      MYSQL_PASSWORD: 'password'
      MYSQL_DATABASE: 'adonis-mysql'
      # Password for root access
      MYSQL_ROOT_PASSWORD: 'password'

  adonis-mysql-testing:
    image: mysql:5.7
    container_name: adonis-mysql-testing
    healthcheck:
      test: ["CMD", "curl", "-fk", "tcp://localhost:3306"]
      interval: 300s
      timeout: 400s
      retries: 10
    ports:
      - 1381:3306
    expose:
      - "3306"
    command: --innodb_use_native_aio=0 --socket=/tmp/mysql.sock --bind_address=0.0.0.0
    volumes:
      - ./db-testing:/var/lib/mysql
    environment:
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'mr-adonis'
      # You can use whatever password you like
      MYSQL_PASSWORD: 'password'
      # Password for root access
      MYSQL_ROOT_PASSWORD: 'password'
      MYSQL_DATABASE: "adonis-mysql-test"
      MYSQL_LOG_CONSOLE: "true"
    restart: always

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

networks:
  app-network:
    driver: bridge

Мы настроем переменные среды, необходимые для подключения нашего приложения к нашей базе данных, поэтому нам нужно изменить .env Файл, который мы создали ранее в Услуги/API и добавить наши учетные данные, которые мы настройка:

HOST=0.0.0.0
PORT=3333
DB_CONNECTION=mysql
DB_HOST=adonis-mysql
DB_PORT=3306
DB_USER=root
DB_PASSWORD=password
DB_DATABASE=adonis-mysql

Давайте восстановим и развернете контейнеры, которые мы определили с помощью одной команды

docker-compose up --build -d

Теперь у нас есть готовые контейнеры MySQL, нам нужно запустить миграции для создания таблиц базы данных, и нам также необходимо заселить наши таблицы некоторыми данными. Чтобы сделать это, давайте получим доступ к оболочке в Docker-Adonis-Api контейнер, выполнив команду ниже:

docker-compose exec docker-adonis-api sh

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

node ace migration:run && adonis seed

Мы выходим из оболочки и с этим поздравлениями в порядке, так как мы успешно настроили приложение Adonis с использованием экземпляра MySQL, доступного нам в короткие сроки.

Вывод

Docker Compose — это фантастический инструмент для помощи в достижении более плавного рабочего процесса и более надежной среды разработки.

Это просто царапает поверхность того, чего мы могли бы достичь, но вы можете позволить своему творчеству взлететь.

Веселое упражнение может быть добавлено сервис Swagger в Docker-compose.yml И заставление его бежать.

Ресурсы

Оригинал: «https://dev.to/kaymathew/setting-up-adonis-js-with-docker-mysql-28k8»