Вероятно, это будет миллионное руководство 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
И заставление его бежать.
Ресурсы
- Репозиторий GitHub для Docker Adonis Starter
- Официальный начальный гид Docker
- Руководство по установке Adonis
Оригинал: «https://dev.to/kaymathew/setting-up-adonis-js-with-docker-mysql-28k8»