Один из недостатков, который влияет на команды при разработке программного обеспечения, — это совместное использование общей среды, которая позволяет всем в команде строить с учетом фреймворков и зависимостей.
Одним из решений этой проблемы может быть использование контейнеров.
Контейнеры иногда определяются как облегченные виртуальные машины.
Запуск контейнера аналогичен запуску виртуальной машины с той лишь заметной разницей, что для взаимодействия с ней (логирование, запуск команд, запуск приложений) обычно используется интерфейс командной строки Docker.
Как и в случае с виртуальными машинами, у контейнеров есть образы, которые можно создавать и запускать.
Контейнеры абстрагируют операционные системы, а не оборудование.
Контейнеры — это решение проблемы обеспечения надежной работы программного обеспечения при перемещении из одной вычислительной среды в другую. Это может быть перенос с ноутбука разработчика в тестовую среду, из промежуточной среды в производственную среду и, возможно, с физической машины в центре обработки данных на виртуальную машину в частном или общедоступном облаке.
В этом посте я буду делать докеризацию приложения React.
Докер
Первым шагом будет загрузка и установка Docker Desktop.
Docker спроектирован как клиент-серверное решение. На стороне клиента предоставляется интерфейс командной строки, который позволяет взаимодействовать с демоном, работающим на вашем компьютере.
Вы можете выбрать операционную систему, на которой должны работать ваши контейнеры, на сегодняшний день доступны контейнеры Windows и Linux.
В этой статье я буду использовать контейнеры Windows.
Докеризованное приложение состоит из исходного кода и Dockerfile. Dockerfile позволяет взаимодействовать с Docker и инструктировать, как создавать и запускать контейнер и образ внутри него.
В Dockerfile в его простейшей форме обычно можно было бы:
- Выберите образ для контейнера из реестра или из общедоступных на Docker Hub. Например, в этом посте будет использовано следующее изображение:
- Настройте среду в соответствии с тем, что приложение должно делать (например, открывать порты).
- Запустите исполняемые файлы внутри контейнера. На этом шаге можно указать команду запуска двигателя при запуске.
Для справки это будет типичный Dockerfile:
FROM mcr.microsoft.com/dotnet/core/runtime:3.1-nanoserver-1909 WORKDIR /app ENTRYPOINT ["dotnet", "website.dll"]
ОТ
Инструкция
FROM
инициализирует новый этап сборки и устанавливает Базовый образ для последующих инструкций. Таким образом, действительныйDockerfile
должен начинаться с инструкцииFROM
. Изображение может быть любым допустимым изображением — особенно легко начать с вытягивания изображения из Общедоступных репозиториев.
РАБОЧИЙ КАТАЛОГ
Инструкция
WORKDIR
задает рабочий каталог для любых инструкцийRUN
,CMD
,ENTRYPOINT
,COPY
иADD
, которые следуют за ней вDockerfile
.
ВХОД
ENTRYPOINT
позволяет настроить контейнер, который будет работать как исполняемый файл.
Вкратце, ENTRYPOINT [“dotnet”, “website.dll”] аналогично запуску контейнера с использованием настроенного образа, входу в него и вводу «dotnet website.dll».
Докеризация интерфейса React
Чтобы создать тривиальное веб-приложение с использованием React, я следовал этому хорошему руководству по началу работы, состоящему из нескольких частей:
Также я взял рабочий код с официального стартапа:
Я немного упростил предлагаемую конфигурацию веб-пакета:
Короче говоря, я удалил предложенную выходную папку и сохранил папку dist, которая используется по умолчанию.
Кроме того, начиная с веб-пакета 4, больше нет необходимости устанавливать точку входа так далеко, как в /src/index.js.
Я также изменил index.js, чтобы использовать JSX, расширение синтаксиса для JavaScript.
В классическом сценарии новый разработчик, работающий над этим кодом, должен будет установить узел на свой компьютер. Им также потребуется установить все модули узла.
Эти шаги можно автоматизировать с помощью «Dockerfile», который я использовал:
FROM node:latest WORKDIR /usr/src/app COPY package.json ./ RUN npm install COPY . . EXPOSE 80 ENTRYPOINT npx webpack-dev-server --host 0.0.0.0 --port 80
Мне пришлось явно попросить webpack-dev-server прослушивать IP 0.0.0.0, так как в противном случае я получал ошибку EMPTY_RESPONSE. Контейнер автоматически перенаправляет поступающие извне вызовы на IP-адрес 0.0.0.0, в то время как webpack-dev-server настроен на привязку к локальному хосту 127.0.0.1.
«Пустой ответ с сервера при попытке запустить webpack-dev-server внутри контейнера докеров с…
У меня проблемы с доступом к контейнеру реагирования, запущенному с docker-compose внутри докер-машина. Я могу свернуть веб-страницу…stackoverflow.com»
Чтобы создать образ, в интерфейс командной строки Docker нужно передать следующую команду:
docker build . -t frontend
Только что построенный образ теперь будет виден работающим:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE frontend latest 52159d9a7188 5 days ago 1.05GB node latest 07e774543bdf 2 weeks ago 939MB
Два образа доступны локально, один содержит установку Node.js, другой создан на основе этого с нашим исходным кодом в папке «/usr/src/app».
Настало время запустить контейнер, это сделает следующая команда:
docker run -p 49160:80 -d frontend
Бег:
docker ps
Покажет информацию о запущенном контейнере.
Начало работы с React также будет доступно для просмотра.
Работа по протоколу HTTPS
Запуск HTTPS при разработке потребует, чтобы SSL-сертификат был доверенным и монтировался в томе внутри контейнера.
Файл Dockerfile нужно будет изменить, так как «webpack-dev-server» нужно будет настроить для использования только что созданного сертификата.
FROM node:latest WORKDIR /usr/src/app COPY package.json ./ RUN npm install COPY . . EXPOSE 80 ENTRYPOINT npx webpack-dev-server --host 0.0.0.0 --https --port 443 --pfx=/etc/ssl/certs/backend.pfx --pfx-passphrase=**yourpassword**
Изменения, которые я сделал, где:
- Порт теперь 443
- Мы ссылаемся на сертификат с именем «backend.pfx».
- Передаем пароль для доступа к нему
После изменения Dockerfile нам нужно будет пересобрать образ:
docker build . -t frontend
Одним из способов создания самозаверяющего сертификата и доверия к нему может быть использование OpenSSL. Однако сегодня я буду использовать инструмент «dotnet dev-certs».
Шаги по созданию самозаверяющего сертификата и доверию ему подробно описаны здесь:
После экспорта файла .pfx в папку «$Env:USERPROFILE\.aspnet\https» его можно смонтировать как том, передав следующий параметр команде «docker run»:
- -v $Env:USERPROFILE\.aspnet\https:/etc/ssl/certs/ интерфейс:последний
Последняя команда будет:
docker run --rm -it -p 443:443 -v $Env:USERPROFILE\.aspnet\https:/etc/ssl/certs/ frontend:latest
Компиляция JSX вручную
Если вам интересно посмотреть, что делает Вавилон под деревом, посмотрите этот отличный ответ:
Я установил Babel CLI:
npm install babel-cli --save-dev
Затем я преобразовал файл JSX вручную:
npx babel --plugins transform-react-jsx .\src\index.js
Это был результат:
Сводка
Переключение на контейнеры в процессе разработки позволяет приложению работать изолированно от выбранной ОС.
Одним из больших ограничений разработки клиентского приложения с использованием Docker является то, что мы не сможем отслеживать изменения.