Как создать и запустить бэкэнд Node.js-Express и интерфейс React внутри контейнера Docker.
Docker дает разработчикам возможность упаковывать все свои приложения в контейнеры. Эти контейнеры могут работать на любой машине, на которой установлен Docker, и приложение будет идентичным. Это отличный способ запустить клон кодовой базы на нескольких системах, и вы можете быть уверены, что все они будут одинаковыми.
Рабочие процессы CI/CD и среды тестирования DevOps значительно улучшаются при использовании Docker, который по сути представляет собой набор программных инструментов, которыми можно делиться. Kubernetes — это еще один инструмент, который используется для работы с несколькими контейнерами Docker, но в гораздо большем масштабе.
В этом руководстве мы узнаем, как создать и запустить бэкэнд Node.js-Express и интерфейс React внутри контейнера Docker.
Запуск бэкенда Node.js-Express внутри Docker
Прежде чем начать, убедитесь, что на вашем компьютере установлен и запущен Docker.
Теперь используйте командную строку, чтобы перейти в каталог, такой как ваш рабочий стол, а затем выполните приведенные ниже команды.
mkdir my-app-docker
cd my-app-docker
touch docker-compose.yml
mkdir api
cd api
npm init -y
npm i express
touch app.js Dockerfile .dockerignore
cd ..
Мы настроили серверную часть под названием api и создали несколько файлов Docker. Теперь откройте проект в редакторе кода и добавьте приведенный ниже код в соответствующие файлы.
Поместите это в файл docker-compose.yml
. Будьте осторожны с форматированием YAML, иначе вы получите ошибки Docker при попытке запустить его.
version: '3.8'
services:
api:
build: ./api
container_name: api_backend
ports:
- '4000:4000'
volumes:
- ./api:/app
- ./app/node_modules
Добавьте это в файл app.js
:
const express = require('express');
const app = express();
const port = process.env.PORT || 4000;
app.get('/', (req, res) => { res.send('Home Route'); });
app.listen(port, () => console.log(`Server running on port ${port}, https://localhost:${port}`) );
Теперь добавьте эту строку в файл .dockerignore
:
node_modules
Затем добавьте этот код в файл Dockerfile
:
FROM node:16-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 4000
CMD ["node", "app.js"]
Наконец, добавьте этот скрипт запуска в файл package.json
:
"scripts": {
"start": "node app.js"
},
(Необязательно) Использование Nodemon для автоматического перезапуска сервера при внесении изменений
Если вы хотите, чтобы сервер перезагружался каждый раз, когда вы вносите изменения в файлы в бэкэнде, вы можете настроить его на использование Nodemon.
Все, что вам нужно сделать, это обновить файлы Dockerfile
и package.json
в папке api.
Обновите код в Dockerfile
, используя приведенный ниже код. Теперь мы устанавливаем Nodemon в начале и используем dev в качестве команды запуска.
FROM node:16-alpine
RUN npm install -g nodemon
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 4000
CMD ["npm", "run", "dev"]
Теперь обновите файл package.json
с помощью этого сценария запуска для Nodemon.
"scripts": {
"start": "node app.js",
"dev": "nodemon -L app.js"
},
Мы только что создали базовое приложение Node.js-Express, которое работает на порту 4000. Этот порт также сопоставлен с 4000 в докере, что позволяет нам запускать его в контейнере Docker.
Запуск серверов
Чтобы запустить сервер вне контейнера Docker с помощью Node, как обычно, просто запустите приведенный ниже код в командной строке. Вы должны быть уверены, что находитесь внутри папки API. Если вы перейдете на https://localhost:4000, вы должны увидеть домашний маршрут в окне браузера.
npm run start
Для запуска приложения Node.js-Express внутри Docker требуется другая команда. Во-первых, вам нужно быть в корневой папке, где находится файл docker-compose.yml
. Теперь запустите приведенную ниже команду, и она должна работать внутри контейнера Docker.
Не забудьте сначала остановить запуск сервера узла, потому что у вас может быть только один сервер, работающий на порту 4000.
docker-compose up
Если вы перейдете на https://localhost:4000, вы должны увидеть домашний маршрут в окне браузера.
Вы можете остановить сервер с помощью приведенной ниже команды или перейти в приложение Docker и остановить запуск контейнера.
docker-compose down
Запуск интерфейса React внутри Docker
Теперь давайте создадим интерфейс React! Используйте свою командную строку, чтобы попасть в корневую папку для my-app-docker. Запустите приведенные ниже команды, чтобы настроить проект.
npx create-react-app client
cd client
touch .dockerignore Dockerfile
Теперь добавьте приведенный ниже код в соответствующие файлы.
Добавьте эту строку в файл .dockerignore
.
node_modules
Поместите этот код в файл Dockerfile
.
FROM node:17-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Наконец, обновите docker-compose.yml
в корневой папке кодом ниже. Мы добавили клиентский раздел внизу с настройками для запуска React внутри контейнера Docker. Будьте осторожны с форматированием YAML, иначе вы получите ошибки Docker при попытке запустить его.
version: '3.8'
services:
api:
build: ./api
container_name: api_backend
ports:
- '4000:4000'
volumes:
- ./api:/app
- ./app/node_modules
client:
build: ./client
container_name: client_frontend
ports:
- '3000:3000'
volumes:
- ./client:/app
- ./app/node_modules
stdin_open: true
tty: true
Запуск серверов
Чтобы запустить сервер вне контейнера Docker с помощью Node, как обычно, просто запустите приведенный ниже код в командной строке. Убедитесь, что вы находитесь внутри папки клиента. Если вы перейдете на https://localhost:3000, вы должны увидеть домашний маршрут в окне браузера.
npm run start
Для запуска приложения React внутри Docker требуется другая команда. Во-первых, вам нужно быть в корневой папке, где находится файл docker-compose.yml
. Теперь запустите приведенную ниже команду, и она должна работать внутри контейнера Docker.
Не забудьте сначала остановить запуск сервера приложений React, потому что у вас может быть только один сервер, работающий на порту 3000.
docker-compose up
Если вы перейдете на https://localhost:3000, вы должны увидеть домашний маршрут в окне браузера.
Вы можете остановить сервер с помощью приведенной ниже команды или перейти в приложение Docker и остановить запуск контейнера.
docker-compose down
С этой настройкой вы можете одновременно запускать бэкэнд Node.js и интерфейс React внутри Docker! Если вы столкнулись с какими-либо ошибками, вам может потребоваться открыть настольное приложение Docker и удалить все изображения, связанные с этим проектом. Затем вы можете попробовать снова запустить команду docker-compose up
и, надеюсь, на этот раз все должно работать как положено.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.