Руки на доке (5 части серии)
Обложка изображения по Алиса Ахтергоф. на Бессмысленно
В этом сообщении я хотел бы показать вам, как запустить ваше угловое приложение в контейнере Docker, затем введем многоступенчатую сборку докера, которая сделает контейнер меньше и вашу работу более автоматизирован.
Без дальнейшего вступления, давайте грязным руками и поместите угловое приложение в контейнер докена. С целью этого поста в блоге я буду использовать свой старый проект — Aston-Villa-App . Это простая приборная панель с заходом из лиги одного из моих любимых футбольных клубов — Aston Villa.
Но если вы хотите использовать свой проект, вы можете пойти с ним, все шаги будут такими же, как для моего приложения.
ОК, чтобы получить мое приложение, вам нужно сначала клонировать его, поэтому откройте терминал и введите:
> git clone https://github.com/wkrzywiec/aston-villa-app.git
Теперь у вас есть в вашей локальной папке, а затем ввести его. Далее убедитесь, что вы установили Node.js и угловые CLI на местном ПК. Полная инструкция можно найти на Официальный угловой сайт Отказ
Теперь, если вы установили оба предварительных условия, вы можете компилировать угловое приложение. Поэтому откройте терминал в корневой папке приложения и типа:
> ng build --prod
Это приведет к созданию новой папки, называемой Dist/Aston-Villa-App в котором все скомпилированные файлы поставлены.
Затем создайте новый файл под названием Dockerfile Это будет расположено в корневой папке проекта. Это должно иметь эти следующие линии:
FROM nginx:1.17.1-alpine COPY nginx.conf /etc/nginx/nginx.conf COPY /dist/aston-villa-app /usr/share/nginx/html
Этот простой DockerFile скажет Docker сделать три вещи:
сначала получить NGINX Docker Image из Docker Hub Тег с
1.17.1-Alpine.
(Это как номер версии),Затем скопируйте-вставьте конфигурацию Nginx по умолчанию,
И, наконец, скопируйте-вставьте скомпилированное приложение (мы сделали его на предыдущем шаге) к контейнеру.
Мой файл конфигурации NGINX по умолчанию выглядит следующим образом (он находится в том же каталоге, что и DockerFile):
events{} http { include /etc/nginx/mime.types; server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } } }
Я не хочу проходить так много в деталях, что здесь значит каждая строка (если вы хотите, есть две очень хорошие ссылки с большим объяснением в конце этой статьи). В общем, здесь мы определяем сервер, на котором будет проведен приложение, его поведение порта и по умолчанию.
Наконец, вернитесь к терминалу и используйте эту команду:
> docker build -t av-app-image .
Если вы проверяете список локально доступных документов Docker, вы должны получить аналогичный выход:
> docker image ls REPOSITORY TAG IMAGE ID av-app-image latest a160a7494a19 nginx 1.17.1-alpine ea1193fd3dde
Чтобы запустить изображение, которое вы только что создали, используйте следующую команду:
> docker run --name av-app-container -d -p 8080:80 av-app-image
С нем сначала вы даете имя контейнеру ( --name AV-App-Containter
), затем убедитесь, что он будет работать в фоновом режиме ( -D
), затем вы на карте контейнеров Ваш местный ( -P 8080: 80
) И, наконец, вы выбираете изображение докера, чтобы быть то, что вы только что создали — AV-App-изображение
Отказ
Чтобы проверить, работает ли новый контейнер в типе терминала:
> docker container ls CONTAINER ID IMAGE STATUS NAMES 2523d9f77cf6 av-app-image Up 26 minutes av-app-container
Или вы можете ввести веб-браузер и перейти на http://localhost: 8080/ Отказ
Хорошо! Это было легко! Разве это не было? Я надеюсь, что это было для вас, но вы могли видеть, что это многоэтапный процесс, и, как таковые, рядом с тем, как потребляется много времени, также подвержен ошибкам.
Так как это можно сделать лучше? Может быть, это может быть лучше, когда мы включаем фазу компиляции ( NG Build - Prod
) в сборку Docker? Это звучит многообещающим, давайте сделаем это!
Чтобы добиться этого, я хотел бы представить что-то, что называется Multi-Stopent Docker Build Отказ
Он был введен в Docker 17.05, и это главная цель состояла в том, чтобы создать меньшие контейнеры, не теряя читаемость докерафила. С таким подходом мы можем разделить здание докера изображения на более мелкие фазы (этапы), где в другой можно использовать результат предыдущего (или его части).
Чтобы положить его в наш контекст, мы разделим наш Docker Build на два этапа:
Составление исходного кода на производство готовый вывод,
Запуск компиляционного приложения в документе Docker.
Только скомпилированные выходные данные с первого этапа будут перемещены ко второму, поэтому небольшой размер контейнера будет сохранен.
До этого момента мы сделали второй шаг, так что давайте сосредоточимся на первом.
Для составления исходного кода мы пойдем с разным изображением докера в качестве основы, что это содержит Node.js Отказ Часть DockerFile, которая охватывает этап строительства:
FROM node:12.7-alpine AS build WORKDIR /usr/src/app COPY package.json package-lock.json ./ RUN npm install COPY . . RUN npm run build
В этом случае есть больше линий, которые несут ответственность за:
(
от
) Получение Узел Docker Image из реестра и название этапа компиляции в виде сборки (так что мы сможем обратиться к нему на другой этапе),(
Workdir
) Настройка каталога по умолчанию,(
Копировать
) Копирование package.json и Package-lock.json Файлы из локального корневого каталога — этот файл содержит все зависимости, которые требуют нашего приложения,(
Run
) Установка необходимых библиотек (на основе файла скопирована на предыдущем шаге),(
Копировать
) Копирование всех оставшихся файлов с исходным кодом,(
запустить
) и, наконец, составление нашего приложения.
Чтобы создать создание нашего образа Docker еще более эффективным, мы можем добавить в корневой файл проекта, который называется файл .Dockerignore Отказ Это работает похоже на .gitignore И в этом мы можем определить, какие файлы и папки мы хотим, чтобы игнорировать. В нашем случае мы не хотим копировать какие-либо файлы из Node_Modules и Dist папки, потому что они не нужны в компиляции.
Поэтому этот файл должен выглядеть следующим образом:
dist node_modules
Хорошо, так что давайте объединим оба этапа докеров в один и в результате мы получим:
### STAGE 1: Build ### FROM node:12.7-alpine AS build WORKDIR /usr/src/app COPY package.json package-lock.json ./ RUN npm install COPY . . RUN npm run build ### STAGE 2: Run ### FROM nginx:1.17.1-alpine COPY nginx.conf /etc/nginx/nginx.conf COPY --from=build /usr/src/app/dist/aston-villa-app /usr/share/nginx/html
Единственная регулировка, которую я сделал здесь, заключается в том, что я добавил комментарии перед каждым этапом, а также я добавил - от = построить
Флаг, чтобы сказать Docker, что ему нужно скопировать скомпилированные файлы из построить Этап (также исходный путь изменился, потому что файлы находятся в другой папке).
Возвращаясь к терминалу, сначала вам нужно создать образечку докера:
> docker build -t av-app-multistage-image .
А затем запустить приложение (на другом порту):
> docker run --name av-app-multistage-container -d -p 8888:80 av-app-multistage-image
И если вы сейчас входите http://localhost:8888/ Вы увидите, что он работает!
Если вы хотите проверить этот проект, перейдите на его репозиторий на GitHub:
wkrzywiec/Aston-Villa-App
Приборная панель Aston Villa из угловых 7
использованная литература
- Используйте многоступенчатые сборки на docs.docker.com.
- Создать эффективный угловой докер изображения с многоступенчатым сборки на dev.to
- Бег угловой в контейнере докера с использованием многоступенчатых сборки на malcoded.com.
- Усовершенствованные многоступенчатые шаблоны сборки на среднем
- Ваши угловые приложения в качестве контейнеров докеров на среднем
- Понимание структуры файлов конфигурации NGINX и контексты конфигурации на www.digitalocean.com.
- Руководство для начинающих на nginx.org.
Руки на доке (5 части серии)
Оригинал: «https://dev.to/wkrzywiec/build-and-run-angular-application-in-a-docker-container-19pm»