Как развернуть приложение в docker
Это продолжение учебника, начало которого можно просмотреть здесь.
В оставшейся части этого руководства вы будете работать с простым диспетчером списка задач, который выполняется в Node. js. Если вы не знакомы с Node. js, не беспокойтесь! Реальное взаимодействие с JavaScript не требуется!
На этом этапе команда разработчиков довольно мала, и вы просто создаете приложение, чтобы доказать свое звание MVP. Вы хотите продемонстрировать, как он работает и что может делать без необходимости думать о том, как он будет работать для крупной группы, нескольких разработчиков и т. д.
Получение приложения
Перед запуском приложения необходимо получить исходный код приложения на компьютере. Для реальных проектов обычно клонируется репозиторий. Но в этом учебнике мы создали ZIP-файл, содержащий приложение.
Если вы используете Windows, на локальном компьютере должно быть установлено приложение "Docker для Windows" или Docker Community Edition. См. документацию по установке Docker для Windows. Процесс установки создает ZIP-файл, содержащий пример, доступный по адресу localhost. Если вы используете Mac, установите Docker Desktop для Mac.
После извлечения используйте любой редактор кода, чтобы открыть проект. Если вам требуется редактор, можно использовать Visual Studio Code. Вы должны увидеть package.json и два подкаталога ( src и spec ).
Создание образа контейнера приложения
Чтобы создать приложение, необходимо использовать Dockerfile . Dockerfile — это просто текстовый сценарий инструкций, который используется для создания образа контейнера. Если вы создали файлы Dockerfile ранее, в Dockerfile ниже может появиться несколько изъянов. Но не беспокойтесь! Мы исправим их.
Создайте файл с именем Dockerfile в той же папке, где находится файл package.json со следующим содержимым.
Убедитесь, что файл Dockerfile не имеет расширения файла, например .txt . Некоторые редакторы могут добавлять это расширение файла автоматически, что приведет к ошибке на следующем шаге.
Если вы еще не сделали этого, откройте терминал и перейдите в каталог app с помощью Dockerfile . Теперь создайте образ контейнера с помощью команды docker build .
Кроме того, вы можете щелкнуть Dockerfile правой кнопкой мыши и выбрать пункт Build Image… (Создать образ), а затем при появлении запроса указать тег.
Эта команда использовала Dockerfile для создания нового образа контейнера. Возможно, вы заметили, что загружено много уровней. Это связано с тем, что вы указали построителю, что хотели бы начать с образа node:12-alpine . Но, так как у вас нет этого компьютера, необходимо скачать этот образ.
После загрузки образа вы скопировали в свое приложение и использовали yarn для установки зависимостей приложения. Директива CMD указывает команду по умолчанию, которую необходимо выполнить при запуске контейнера из этого образа.
Наконец, флаг -t помечает образ. Представьте себе, что это просто удобное для восприятия имя конечного образа. Так как вы назвали образ getting-started , вы можете ссылаться на этот образ при запуске контейнера.
. в конце команды docker build указывает, что Docker должен искать Dockerfile в текущем каталоге.
Запуск контейнера приложения
Теперь, когда у вас есть образ, запустите приложение. Для этого используйте команду docker run (вспомнили?).
Запустите контейнер с помощью команды docker run и укажите имя образа, который вы только что создали:
Помните флаги -d и -p ? Вы запускаете новый контейнер в "отключенном" (фоновом) режиме и создаете сопоставление между портом 3000 узла и портом 3000 контейнера. Без сопоставления портов вы не сможете получить доступ к приложению.
Добавьте элемент или два, чтобы увидеть, что он работает, как ожидалось. Элементы можно пометить как завершенные и удалить элементы. Внешний интерфейс успешно сохраняет элементы в серверной части. Просто и быстро, правда?
На этом этапе у вас должен быть работающий список задач с небольшими наборами элементов. Теперь сделаем несколько изменений и изучим управление контейнерами.
Если взглянуть на расширение VS Code, вы должны увидеть два контейнера, которые работают сейчас (это учебник и новый контейнер приложения).
Резюме
В этом разделе вы узнали о создании образа контейнера и Dockerfile. После создания образа вы запустили контейнер и увидели работающее приложение!
Далее предстоит внести изменения в приложение и узнать, как обновить работающее приложение с помощью нового образа. Кроме того, вы узнаете о некоторых других полезных командах.
Оно состоит из одного контроллера и одного html и js-файла, позволяющего выводить и добавлять животных. Животные хранятся в базе.
Как выглядит приложение
Установка Docker
Чтобы развернуть приложение в Docker, для начала нужно установить Docker на компьютер. В Window 7 это проблематично, в Windows 10 и других ОС вполне возможно.
Чтобы убедиться, что Docker установлен, выполните из командной строки:
Будет выведена версия Docker.
Теперь можно выполнять различные команды, которые билдят образы, запускают контейнеры и удаляют их все.
PostreSQL в контейнере
Одна из причин, почему Java-разработчику полезен Docker, это то, что можно не устанавливать различное дополнительное ПО. Например, базы данных различных версий. Ведь потом их придется удалять, остаются артефакты. Все это нежелательно, да и долго. С Docker проще.Например, чтобы испытать работу приложения с базой данных PostgreSQL 12 версии, можно не устанавливать ее на компьютер, а поднять в Docker-контейнере.
Для этого из командной строки запустим контейнер с базой:
Теперь с базой можно соединиться по такому url:
Вкладка Databases в Intellij Idea Ultimate
Разберем строку выше. Она поднимает контейнер из образа PostgreSQL:
Параметры команды
Таким образом, мы соединились с базой со вкладки Databases редактора Intellij Idea. Так же можно соединяться и из приложения, не устанавливая базу на компьютер, а запуская любую ее версию в контейнере.
Файл docker-compose.yml
Файл docker-compose.yml представлен ниже:
docker-compose.yml со структурой папок
Начнем с postgres.
Сервис Postgres: база данных PostgreSQL
Кстати, volume с именем db-data создается отдельной строкой в конце файла:
Обратите внимание, что каждого сервиса указан Dockerfile (файл для сборки образа):
для Postgres он лежит в папке services/postgres (см. скриншот выше). Его содержимое предельно кратко:
Строка выше означает, что мы просто берем готовый образ postgres:12-alpine и ничего к нему не добавляем.
Кстати, порты, указанные в docker-compose.yml:
можно и не выставлять, ведь к базе будем подключаться не мы с localhost, а Spring Boot из соседнего контейнера. А запись выше именно для доступа с локальной машины.
Другие образы будут чуть сложнее.
Сервис App: Spring Boot приложение
Скопирую фрагмент из docker-compose.yml, касающийся приложения Spring Boot:
Рассмотрим, из чего он состоит.
Порты
Зависимость
Имя образа
Переменные среды
В environment перечислены переменные среды, к которым наше Spring Boot приложение имеет доступ. Мы их прописываем в application.yml приложения таким образом (через двоеточие стоит значение по умолчанию, которое используется в случае, если переменной окружения нет; у меня это просто значения для локального запуска без контейнера):
Доступ из одного контейнера в другой
Обратите внимание, что доступ из одного контейнера к другому происходит по имени сервиса. То есть к базе данных мы обращаемся не по localhost, а по postgres:
Это значение мы указывали выше в docker-compose.yml в переменной среды SPRING_DATASOURCE_URL.
Dockerfile.development
Сервис app использует такой докер-файл:
Наконец, рассмотрим последний компонент.
Сервис JS: JavaScript приложение
Тут все аналогично, только заданы другие порты и другое имя образа:
Dockerfile.development
Докер-файл у сервиса js такой:
То есть мы собираем образ на основе готового образа nginx:alpine. Затем копируем в папку сервера Nginx /usr/share/nginx/html файлы из папки dist (лежит рядом с докер-файлом, содержит html и js-файлы).
Как всё запустить: команда docker-compose
Наконец, из папки с файлом docker-compose.yml надо выполнить команду:
Команда выше и построит образы, и запустит на их основе контейнеры.
Теперь в браузере по адресу
будет доступно наше приложение.
Чтобы остановить и удалить контейнеры, выполним команду:
Если нужно удалить и volume с данными, делаем так:
Если вы сохраняли каких-то животных в приложении, то после этой команды при следующем запуске приложения их не будет.
Сортируем ветки
- JRTB-0
- JRTB-2
- JRTB-3
- STEP_1_JRTB-0 — первый шаг
- STEP_2_JRTB-2 — второй шаг
- STEP_3_JRTB-3 — третий шаг
Немного о докере
Что такое Docker? Вкратце — это инструмент, с помощью которого можно быстро и безопасно развертывать (деплоить) приложения, создавая для них закрытую инфраструктуру, необходимую только для них. Пока что сложно, я понимаю. В общем и целом докер можно понимать как платформу для разработки, где можно быстро и эффективно работать. Докер можно понимать как программу, которая работает на сервере. Эта программа имеет возможность хранить контейнеры с приложениями. Что такое контейнер? Это отдельная инфраструктура, в которую можно добавить все, что нужно. Например для Java-приложения нам нужна JRE, чтобы запустить приложение, вот контейнер будет иметь это, нужно будет еще какое-то программное обеспечение — можно добавить это. А может быть, нам нужен Линукс и Tomcat сервлет контейнер. Такое тоже можно будет сделать. Контейнеры создаются на основе image (образа): то есть, это определенный шаблон в котором написано все необходимое для создания докер контейнера. Как создать этот образ? В нашем случае нам нужно будет создать файл Dockerfile в корне проекта с описанием того, что должно быть в контейнере. Так как мы не хотим где-то показывать токен бота, придется извернуться и передавать его каждый раз, когда мы захотим развертывать приложение. Более детально об этой теме почитать можно здесь и здесь.
Пишем JRTB-13
Нужно настроить быстрый и легкий процесс развертывания (деплоя) нашего приложения на сервер. То есть на машину, которая работает 24/7. За основу возьмем докер. Но задачи в нашем списке, которая бы отвечала за добавление этой функциональности, нет. Как-то я его пропустил при создании. Ничего страшного, сейчас создадим. Заходим на вкладку создания issue на гитхаб и выбираем Feature Request:Добавляем описание задачи, критерии его приемки, устанавливаем, к какому проекту этот issue относится и можно создавать новое issue:Теперь чтобы показать, что задача взята в работу, сменим статус задачи с To do на In Progress:Это будет сложная статья. Если будут проблемы — пишите в комментариях: я буду следить и отвечать на них в меру сил. Такой будет небольшой Customer Support :DСоздаем Dockerfile
Создаем docker-compose.yml
Хорошо бы вам про YAML формат почитать отдельно, а то статья и так уже растет, как на дрожжах. Для нас это просто еще одно описание переменных по типу .properties. Только в пропертях записывается через точку, а в YAML это делается немного красивее. Например, так. Две переменные в .properties: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin А вот в .yaml (тоже самое что и .yml) будет это так: Второй вариант более красивый и понятный. Пробелы должны быть именно такие, как указаны выше. Как-нибудь переведем наши application.properties и application.yml. Для начала нужно его создать. В корне проекта создаем файл docker-compose.yml и записываем туда следующее: Первая строка — это версия docker-compose. services: говорит о том, что все следующие строки после этого (будут сдвинуты) — относятся к сервисам, которые мы настраиваем. У нас такой пока только один — java-приложение под названием jrtb . И уже под ним будут все его настройки. Например, build: context: . говорит о том, что мы будем искать Dockerfile в той же директории, что и docker-compose.yml. А вот секция environment: будет отвечать за то, чтобы мы передали в Dockerfile необходимые переменные среды (environment variables). Как раз то, что нам и нужно. Поэтому ниже мы переменные и передаем. Их docker-compose будет искать в переменных операционной среды сервера. Добавим их в баш скрипте.
Создаем баш скрипты
- Dockerfile — файл для создания образа нашего приложения;
- docker-compose.yml — файл с настройкой того, как мы будем запускать наши контейнеры;
- start.sh — баш скрипт для развертывания нашего приложения;
- stop.sh — баш скрипт для остановки нашего приложения.
И в README добавим новый параграф с описанием того, как деплоить наше приложение:
Разумеется, все пишет на английском. Уже как обычно, в нашей новосозданной ветке STEP_4_JRTB-13 создаем новый коммит с именем: JRTB-13: implement deployment process via docker и делаем пуш. Я перестаю подробно останавливаться на вещах, которые я уже описывал в прошлых статьях. Не вижу смысла повторять одно и тоже. К тому же, кто разобрался и сделал у себя, у того вопросов не возникнет. Это я о том, как создать новую ветку, как создать коммит, как запушить коммит в репозиторий.
Вы, конечно, прекрасно знаете, что такое docker и контейнеры и даже как развернуть модель машинного обучения в docker? Но есть еще один интересный вопрос: как запустить и открыть любое приложение с графическим интерфейсом в docker? Похоже, это не так просто. Но сейчас мы со всем разберемся…
В статье мы пройдем этот процесс, выполнив несколько этапов.
Запуск контейнера в docker в режиме графического интерфейса.
Запуск любого ПО с графическим интерфейсом в контейнере.
Первым делом установим docker в компьютере, используя такую команду:
yum install docker
Затем нужно запустить и включить службу «Docker». Делается это следующими командами:
systemctl start docker
systemctl enable docker
Теперь добавляем образ:
docker pull centos:8
Теперь запустим контейнер Docker…
Здесь с помощью параметра -it в интерактивном терминале задается название контейнера, в нашем случае это «vedantos».
docker container run -it — name=<any name> centos:8
Теперь нужно установить firefox в контейнере:
Для этого используем команду
yum install firefox -y
Как думаете, будет работать наш firefox или нет? Правильно! Конечно же, нет.
Видите здесь ошибку с переменной окружения DISPLAY? Нужно задать эту переменную окружения.
Переходим на localhost и выполняем следующие команды (чтобы продолжить, нам нужно создать каталог, а затем Dockerfile):
Здесь мы создали каталог doraemon и внутри него Dockerfile.
Внутри Dockerfile нужно ввести следующие команды:
docker build -t firefox .
Эта точка в конце тоже важна для выполнения всех команд, так что не забываем ставить ее:
Образ firefox находится среди образов docker в списке отображения:
Теперь для доступа к firefox вводим:
docker container run -it — env=”DISPLAY” — net=host firefox
и после выполнения этой команды вот что у нас получится:
Вот и все, теперь firefox запускается в контейнере Docker.
Читайте также: