я был в прошлой статье,Что нужно знать о Docker для фронтенд-разработки Как упоминалось в этой статье, идея контейнеризации Docker — это не только инструмент, который необходимо освоить студентам, занимающимся исследованиями и разработками серверной части, студентам, занимающимся исследованиями и разработками внешнего интерфейса, также необходимо научиться его использовать. Иногда студенты, изучающие интерфейсные части, неизбежно будут что-то делать. полнофункциональные проекты, если они используются в настоящее время. Для MySQL, Redis и других компонентов, если существует конфигурация, позволяющая объединить их вместе и четко управлять ими, это значительно повысит удобство сопровождения кода и побудит других новых студентов участвовать в исследованиях и разработках проектов в будущем. тоже будет очень удобно.
Чтобы всем было проще понять преимущества Docker, я перечислю преимущества и недостатки двух методов. Без сравнения, в будущем вреда не будет.
характеристика | Использование Докера | Нет Использование Докера |
---|---|---|
экологическая согласованность | Контейнеры Docker обеспечивают согласованность в средах разработки, тестирования и производства, уменьшая количество проблем «это работает на моей машине». | Среда может быть противоречивой из-за различий в конфигурациях компьютеров, и вам необходимо вручную убедиться, что среды схожи. |
Управление зависимостями | Все зависимости упакованы в контейнеры и изолированы от хоста. | Зависимостями необходимо управлять вручную на каждом компьютере, и они могут конфликтовать с другими частями системы. |
скорость развертывания | Контейнеры могут запускаться быстро, скорость развертывания быстрая. | Развертывание может потребовать сложных процессов установки и настройки. |
портативность | Контейнеры можно запускать на любом поддерживаемом Docker бегать на машине,Улучшенное приложениепортативность。 | Переносимость приложений может быть ограничена конфигурациями операционной системы и среды. |
процесс разработки | Docker Можно упростить процесс разработки,примернравитьсяиспользовать docker-compose Запускайте все службы одним щелчком мыши. | процесс Разработка может включать несколько этапов, требующих запуска каждого Служить вручную. |
Изоляция ресурсов | Контейнеры предоставляют функции, которые помогают обеспечить стабильную работу приложений. | Приложение запускается непосредственно на хосте и на него могут влиять другие приложения или системные процессы. |
Мы видим, что при использовании Docker наша линия поддержки значительно усиливается. Ниже я буду использовать конкретную демонстрацию, которая представляет собой очень простой пример, чтобы проиллюстрировать структуру полнофункционального проекта. этот.
/myapp
|-- /backend
| |-- Dockerfile
| |-- package.json
| |-- server.js
|-- /frontend
| |-- Dockerfile
| |-- package.json
| |-- /src
| |-- /public
|-- docker-compose.yml
В этом проекте будут использоваться:
Просто простой пример в интерфейсе,Просто получите данные через интерфейс,Но если вы получите данные,Есть характеристика,Если он уже существует в Redis,Возврат напрямую из Redis,если не,Сначала проверьте MySQL,Нашел это,Кэш в Redis,затем вернись,Пример довольно жесткий,Но по сути он собрал простой, но сложный полнофункциональный проект. Ниже приводится бизнес-схема нашего проекта.,Вам удобно интуитивно понимать эту архитектуру.
Здесь нашему бэкэнду необходимо подключиться к MySQL, Redis и другим сервисам. Согласно нашему традиционному мнению, нам нужно локально запустить сервер MySQL и запустить службу Redis. Итак, как нам с этим справиться с помощью Docker? Мы используем docker-compose, а затем используем зависимости, то есть вся архитектура — это фронтенд, зависящий от бекенда, бекенд зависит от MySQL и Redis, и тогда мы можем написать весь docker-compose .
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
Чтобы запустить эту службу:
# Студентам, участвующим в этом проекте, нужна только одна такая команда, чтобы начать разработку. Им не нужно отдельно запускать MySQL, серверную часть и Redis.
docker-compose up --build
Здесь наш внешний интерфейс проекта может быть создан непосредственно с помощью реакции для создания строительных лесов:
npx create-react-app frontend
Затем мы добавили Dockerfile, поскольку наш фронтенд-проект описан в docker-compose.yml и его необходимо собрать, поскольку этот образ — наш собственный. Таким же образом необходимо собрать и внутренние проекты. Dockerfile внутреннего проекта будет предоставлен позже. Мы заметили, что база данных и кэш не собираются, потому что мы можем перетащить эти изображения прямо из Docker Hub и использовать. Это очень мощно. Это означает, что нам вообще не нужно запускать какие-либо службы MySQL или Redis локально, их можно использовать «из коробки».
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Тогда Dockerfile для бэкэнда:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4000
CMD ["npm", "start"]
Как видите, он почти точно такой же, как и внешний интерфейс, за исключением того, что открытые порты отличаются.
Еще одна деталь: мы используем том для сопоставления каталогов, который включен в настройку интерфейсных, серверных и MySQL-сервисов. Итак, какова его роль?
Действительно ли такой подход разумен? Чтобы продемонстрировать преимущества докера, мы создали такой полнофункциональный проект механически и использовали docker-compose для его объединения. Но есть ли в реальных проектах более элегантный способ?
Фактически, инфраструктура или потребности вашего проекта определяют элегантный метод, который вы можете выбрать. Если вы хотите быстро проверить бизнес-модель, я думаю, что этот метод будет очень быстрым, но если вы планируете вести бизнес сроком на 3 года или даже. дольше, этот метод очень опасен, и разделение передней и задней частей должно быть лучшим способом.
нравиться,MySQLДоступен в Tencent Cloud.Служба MySQL,Redis также можно использовать как сервис в Tencent Cloud.,Будьте внимательны при использовании этих услуг,Обязательно не пишите в коде свои ключи и другой простой текст.,Лучше всего использовать переменные среды.
Способ, которым Dockerfile определяет переменные среды, очень прост.
docker run --env-file ./env.list -d my-node-app
docker-compose --env-file [development|production].env up
docker-compose.yml
Способ прямого указания переменных среды также очень прост.
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 создает два набора сред: среду разработки и онлайн. Кажется, это возвращение к природе, и фронтенд можно делать со спокойной душой. Что касается остального, оставьте это облачному сервису.