Используйте Docker, чтобы легко создать полнофункциональную среду разработки.
Используйте Docker, чтобы легко создать полнофункциональную среду разработки.

я был в прошлой статье,Что нужно знать о Docker для фронтенд-разработки Как упоминалось в этой статье, идея контейнеризации Docker — это не только инструмент, который необходимо освоить студентам, занимающимся исследованиями и разработками серверной части, студентам, занимающимся исследованиями и разработками внешнего интерфейса, также необходимо научиться его использовать. Иногда студенты, изучающие интерфейсные части, неизбежно будут что-то делать. полнофункциональные проекты, если они используются в настоящее время. Для MySQL, Redis и других компонентов, если существует конфигурация, позволяющая объединить их вместе и четко управлять ими, это значительно повысит удобство сопровождения кода и побудит других новых студентов участвовать в исследованиях и разработках проектов в будущем. тоже будет очень удобно.

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

характеристика

Использование Докера

Нет Использование Докера

экологическая согласованность

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

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

Управление зависимостями

Все зависимости упакованы в контейнеры и изолированы от хоста.

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

скорость развертывания

Контейнеры могут запускаться быстро, скорость развертывания быстрая.

Развертывание может потребовать сложных процессов установки и настройки.

портативность

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

Переносимость приложений может быть ограничена конфигурациями операционной системы и среды.

процесс разработки

Docker Можно упростить процесс разработки,примернравитьсяиспользовать docker-compose Запускайте все службы одним щелчком мыши.

процесс Разработка может включать несколько этапов, требующих запуска каждого Служить вручную.

Изоляция ресурсов

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

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

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

Язык кода:javascript
копировать
/myapp
|-- /backend
|   |-- Dockerfile
|   |-- package.json
|   |-- server.js
|-- /frontend
|   |-- Dockerfile
|   |-- package.json
|   |-- /src
|   |-- /public
|-- docker-compose.yml

В этом проекте будут использоваться:

  • koaПредоставляемые услуги внутреннего интерфейса
  • MySQLОбеспечить поддержку данных,Выносливость
  • redisПредоставьте данные в обмен на,Улучшите производительность нашего интерфейса
  • reactкак передняя часть,Приведите простой пример запроса данных

Просто простой пример в интерфейсе,Просто получите данные через интерфейс,Но если вы получите данные,Есть характеристика,Если он уже существует в Redis,Возврат напрямую из Redis,если не,Сначала проверьте MySQL,Нашел это,Кэш в Redis,затем вернись,Пример довольно жесткий,Но по сути он собрал простой, но сложный полнофункциональный проект. Ниже приводится бизнес-схема нашего проекта.,Вам удобно интуитивно понимать эту архитектуру.

Анализ плана реализации

Здесь нашему бэкэнду необходимо подключиться к MySQL, Redis и другим сервисам. Согласно нашему традиционному мнению, нам нужно локально запустить сервер MySQL и запустить службу Redis. Итак, как нам с этим справиться с помощью Docker? Мы используем docker-compose, а затем используем зависимости, то есть вся архитектура — это фронтенд, зависящий от бекенда, бекенд зависит от MySQL и Redis, и тогда мы можем написать весь docker-compose .

Язык кода:javascript
копировать
version: '3.8'
services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend/src:/app/src
    depends_on:
      - backend

  backend:
    build: ./backend
    ports:
      - "4000:4000"
    volumes:
      - ./backend:/app
    depends_on:
      - db
      - cache

  db:
    image: mysql:5.7
    #Инициализируем базу данных и создаем несколько таблиц
    command: --init-file /data/application/init.sql
		#Обратите внимание, что переменные среды здесь лучше всего определять в .env Внутри, не пишите прямо здесь, я здесь чисто для демонстрации.
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword 
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - ./backend/db-data:/var/lib/mysql
      - ./backend/init.sql:/data/application/init.sql

  cache:
    image: redis:alpine
    ports:
      - "6379:6379"

Здесь мы в основном рассматриваем проект depend_on: в файле docker-compose.yml. Передняя часть зависит от внутренней части, а задняя часть зависит от службы MySQL и службы кэширования Redis.

В конечном итоге мы будем использовать docker-compose up Чтобы запустить эту службу:

Язык кода:javascript
копировать
# Студентам, участвующим в этом проекте, нужна только одна такая команда, чтобы начать разработку. Им не нужно отдельно запускать MySQL, серверную часть и Redis.
docker-compose up  --build

Обратите внимание на некоторые детали

Здесь наш внешний интерфейс проекта может быть создан непосредственно с помощью реакции для создания строительных лесов:

Язык кода:javascript
копировать
npx create-react-app frontend

Затем мы добавили Dockerfile, поскольку наш фронтенд-проект описан в docker-compose.yml и его необходимо собрать, поскольку этот образ — наш собственный. Таким же образом необходимо собрать и внутренние проекты. Dockerfile внутреннего проекта будет предоставлен позже. Мы заметили, что база данных и кэш не собираются, потому что мы можем перетащить эти изображения прямо из Docker Hub и использовать. Это очень мощно. Это означает, что нам вообще не нужно запускать какие-либо службы MySQL или Redis локально, их можно использовать «из коробки».

Язык кода:javascript
копировать
FROM node:14

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

Тогда Dockerfile для бэкэнда:

Язык кода:javascript
копировать
FROM node:14

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 4000

CMD ["npm", "start"]

Как видите, он почти точно такой же, как и внешний интерфейс, за исключением того, что открытые порты отличаются.

Еще одна деталь: мы используем том для сопоставления каталогов, который включен в настройку интерфейсных, серверных и MySQL-сервисов. Итак, какова его роль?

  • Сопоставление каталогов во внешнем и внутреннем интерфейсе призвано облегчить нашу локальную разработку. Наши локальные изменения будут быстро отражаться в каталоге контейнера для обеспечения горячих обновлений.
  • Цель сопоставления каталогов в MySQL состоит в том, чтобы мы могли синхронизировать данные MySQL. При следующем запуске контейнера данные все равно будут там, как показано ниже.

дальнейшие мысли

Действительно ли такой подход разумен? Чтобы продемонстрировать преимущества докера, мы создали такой полнофункциональный проект механически и использовали docker-compose для его объединения. Но есть ли в реальных проектах более элегантный способ?

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

нравиться,MySQLДоступен в Tencent Cloud.Служба MySQL,Redis также можно использовать как сервис в Tencent Cloud.,Будьте внимательны при использовании этих услуг,Обязательно не пишите в коде свои ключи и другой простой текст.,Лучше всего использовать переменные среды.

Способ, которым Dockerfile определяет переменные среды, очень прост.

Язык кода:javascript
копировать
docker run --env-file ./env.list -d my-node-app
docker-compose --env-file [development|production].env up

docker-compose.yml Способ прямого указания переменных среды также очень прост.

Язык кода:javascript
копировать
version: '3'
services:
  webapp:
    image: my-webapp:latest
    ports:
      - "5000:5000"
    env_file:
      - webapp.env
  database:
    image: postgres:latest
    env_file:
      - database.env

Таким образом, мы упростим его до одного внешнего и внутреннего интерфейса. Мы больше не полагаемся на MySQL и Redis, а переместим MySQL и Redis в облако. Таким же образом можно перенести и бэкенд. Мы можем быть более гибкими. Например, мы можем перенести его на Serverless. Server Less создает два набора сред: среду разработки и онлайн. Кажется, это возвращение к природе, и фронтенд можно делать со спокойной душой. Что касается остального, оставьте это облачному сервису.

Я участвую в четвертом выпуске специального учебного лагеря Tencent Technology Creation 2023 с эссе, получившими награды. Приходите и разделите приз со мной!

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода