Skip to content

Latest commit

 

History

History

docker

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Домашнее задание к занятию «3.1. Docker»

Важно: прежде чем приступать, обязательно прочитайте руководство по установке Docker.

В качестве результата пришлите ссылки на ваши GitHub-проекты в личном кабинете студента на сайте netology.ru.

Все задачи этого занятия нужно делать в разных репозиториях.

Важно: если у вас что-то не получилось, то оформляйте issue по установленным правилам.

Важно: не делайте ДЗ всех занятий в одном репозитории. Иначе вам потом придётся достаточно сложно подключать системы Continuous integration.

Как сдавать задачи

  1. Инициализируйте на своём компьютере пустой Git-репозиторий.
  2. Добавьте в него готовый файл .gitignore.
  3. Добавьте в этот же каталог код, требуемый в ДЗ. Создать и отредактировать конфигурационные файлы вы можете в любом текстовом редакторе или IntelliJ IDEA. Если вы используете IntelliJ IDEA, то рекомендуется использовать тип проекта Empty Project.
  4. Сделайте необходимые коммиты.
  5. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым.
  6. Сделайте пуш — удостоверьтесь, что ваш код появился на GitHub.
  7. Ссылку на ваш проект отправьте в личном кабинете на сайте netology.ru.
  8. Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачёта.

Важно: задачи этого занятия не предполагают подключения к CI.

Plugin IDEA

Этот раздел не является частью ДЗ и не обязателен для выполнения, но он позволяет вам облегчить себе взаимодействие с Docker и Docker compose на первое время, воспользовавшись графическим интерфейсом.

В данный момент плагин недоступен на территории России

Откройте IntelliJ IDEA, перейдите в раздел настроек:

  • Windows/Linux: File -> Settings
  • MacOS: IntelliJ IDEA -> Preferences

Найдите в поиске раздел Plugins:

Нажмите на кнопку Install, после установки перезапустите IDEA.

Теперь при открытии файлов Dockerfile, docker-compose.yml IDEA будет предлагать автодополнение и возможность запуска прямо из окна редактора:

После запуска откроется окно Services, где вы можете посмотреть образы, контейнеры и запущенные с помощью Docker compose сервисы:

Задача №1: PostgreSQL

Вам необходимо подготовить приложение к тестированию на СУБД PostgreSQL. Используйте образ 13-alpine, если он недоступен, то берите последний опубликованный на Docker Hub. Возьмите собранный JAR-файл db-api.jar, аналогично примеру на лекции положите рядом файл application.properties, но в строке: jdbc:mysql://... поменяйте mysql на postgresql.

Вам нужно дописать остальные настройки: хост, порт, БД, имя пользователя и пароль.

Кроме того, вам нужно подготовить файл docker-compose.yml, в котором прописать настройки для запуска контейнера PostgreSQL. Всю информацию о его запуске вы найдёте на официальной странице образа на Docker Hub. Рекомендуем также изучить документацию по СУБД PostgreSQL для получения информации о данном продукте.

Запустите сначала docker-compose up и только после того, как БД запустится, запустите целевое приложение: java -jar db-api.jar. Если нужно поменять порт запуска, по умолчанию он 9999, то добавьте в файл application.properties строку server.port=<нужный номер порта>.

Если вы сделали всё правильно, то приложение запустится и на GET http://localhost:9999/api/cards выдаст вам JSON с картами:

[ 
   { 
      "id":1,
      "name":"Альфа-Карта Premium",
      "description":"Альфа-Карта вернёт ваши деньги",
      "imageUrl":"/alfa-card-premium.png"
   },
   { 
      "id":2,
      "name":"Alfa Travel Premium",
      "description":"Самая выгодная карта для путешествий",
      "imageUrl":"/alfa-card-travel.png"
   },
   { 
      "id":3,
      "name":"CashBack Premium",
      "description":"Заправь свою карту. Кешбэк на АЗС, в кафе и ресторанах",
      "imageUrl":"/alfa-card-cashback.png"
   }
]

В результате выполнения этой задачи вы должны положить в репозиторий следующие файлы (других файлов не должно быть):

  • .gitignore
  • db-api.jar,
  • application.properties,
  • docker-compose.yml,
  • README.md со скриншотом ответа приложения.

Важно: для удаления всех данных и начала с чистого листа сделайте следующее:

  • docker-compose down в каталоге с файлом docker-compose.yml,
  • удалите каталог для хранения данных data,
  • запустите заново docker-compose up, после того как всё исправите.

Важно: команда docker-compose rm в каталоге с файлом docker-compose.yml удаляет сам контейнер.

Задача №2: докеризация приложения (необязательная)

Приложение можно упаковать в Docker-образ, чтобы затем запускать из него контейнеры.

Сделать это, в принципе, несложно: достаточно создать файл Dockerfile, в котором описать правила сборки образа.

Для лучшего пониманию процесса докеризации приведем небольшой пример с использованием учебного приложения для Node.js.

Важно: Для решения домашнего задания надо будет выполнить докеризацию другого учебного приложения.

Поскольку наше приложение для Node.js написано на языке JavaScript, то со слов разработчиков:

Компилировать ничего не надо.
Нужна только установленная Node.js версии не ниже 12.
В командной строке нужно выполнить: npm install для установки зависимостей.
Для запуска приложения нужно выполнить: npm start.
Приложение запустится на порту 9999.

Итак, начнём по порядку. Мы, конечно, можем с нуля собрать образ, но так почти никто не делает. Мы можем взять уже готовый образ, в котором установлена платформа Node.js.

Поскольку мы рассматриваем простейший сценарий, то сборка образа сведётся к следующим инструкциям:

  • FROM — выбираем готовый образ для старта, на базе которого мы будем создавать свой;
  • WORKDIR — установим рабочий каталог внутри образа;
  • COPY — копируем файлы из текущего каталога в файловую систему образа;
  • RUN — выполняем дополнительные действия, например, установку зависимостей;
  • CMD — описываем команду запуска;
  • EXPOSE — описываем, какие порты будет слушать контейнер.

Полное описание синтаксиса Dockerfile.

Идём на Docker Hub и ищем Node.js:

Начинаем писать наш Dockerfile:

FROM node:erbium-alpine3.12

Apline Linux — минималистичный образ, который часто используется в качества базового благодаря своим небольшим размерам — около 5 мегабайт.

Устанавливаем рабочий каталог и пишем команду копирования всех файлов из текущего каталога нашего проекта в образ:

FROM node:erbium-alpine3.12
WORKDIR /opt/app
COPY . .

Запускаем команду установки зависимостей из инструкции разработчиков:

FROM node:erbium-alpine3.12
WORKDIR /opt/app
COPY . .
RUN npm install

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

Прописываем команду старта:

FROM node:erbium-alpine3.12
WORKDIR /opt/app
COPY . .
RUN npm install
CMD ["npm", "start"]

Да, CMD пишется достаточно странно, но это связано с особенностями обработки. Текущая форма называется exec form и представляет из себя JSON-массив в формате: ["executable","param1","param2"]. О деталях вы можете почитать на странице описания Dockerfile.

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

FROM node:erbium-alpine3.12
WORKDIR /opt/app
COPY . .
RUN npm install
CMD ["npm", "start"]
EXPOSE 9999

Собираем командой: docker image build -t node-app:1.0 ., где -t — это задание тега образу.

Если всё соберётся успешно, то вы можете стандартными средствами посмотреть, что теперь ваш образ есть на вашем компьютере: docker image ls.

А также запустить из него контейнер, в том числе с использованием Docker compose.

Можно собрать всё приложение и запустить, сразу используя следующую конфигурацию Docker compose:

version: '3.7'
services:
  node-app:
    build: .
    image: node-app:1.0
    ports:
      - '9999:9999'

build: . означает, что мы собираем образ из Dockerfile, находящемся в текущем каталоге.

И запускайте docker-compose up --build. Уберите флаг --build, чтобы образ не пересобирался каждый раз.

Готовый проект вы можете найти в каталоге node вместе с файлом docker-compose.yml.

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

Теперь ваша задача — взять готовое приложение для контейнеризации db-api-for-docker.jar (оно без зависимостей, никакая СУБД ему не нужна) и упаковать в образ, то есть создать Dockerfile и docker-compose.yml.

Общие условия:

  • приложению для работы нужна Java 8, используйте в качестве базового образа openjdk:8-slim;
  • никаких внешних файлов, кроме самого JAR-ника не требуется;
  • JAR-ник запускается командой java -jar db-api-for-docker.jar и поднимает сервер на порту 9999. Для теста сделайте GET http://localhost:9999/api/cards.

В результате выполнения этой задачи вы должны положить в репозиторий следующие файлы:

  • .gitignore
  • db-api-for-docker.jar,
  • Dockerfile,
  • docker-compose.yml,
  • README.md со скриншотом ответа приложения.