Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/levvolkov/dockerpostgresql

7 «Docker PostgreSQL»
https://github.com/levvolkov/dockerpostgresql

automated-testing docker postgresql postman

Last synced: 2 days ago
JSON representation

7 «Docker PostgreSQL»

Awesome Lists containing this project

README

        


postman_docker

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

**Важно**: прежде чем приступать, обязательно прочитайте [руководство по установке Docker](https://github.com/netology-code/aqa-homeworks/blob/master/docker/installation.md).

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

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

**Важно**: если у вас что-то не получилось, то оформляйте issue [по установленным правилам](https://github.com/netology-code/aqa-homeworks/blob/master/report-requirements.md).

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

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

1. Инициализируйте на своём компьютере пустой Git-репозиторий.
1. Добавьте в него готовый файл [.gitignore](https://github.com/netology-code/aqa-homeworks/blob/master/.gitignore).
1. Добавьте в этот же каталог код, требуемый в ДЗ. Создать и отредактировать конфигурационные файлы вы можете в любом текстовом редакторе или IntelliJ IDEA. Если вы используете IntelliJ IDEA, то рекомендуется использовать тип проекта Empty Project.
1. Сделайте необходимые коммиты.
1. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым.
1. Сделайте пуш — удостоверьтесь, что ваш код появился на GitHub.
1. Ссылку на ваш проект отправьте в личном кабинете на сайте [netology.ru](https://netology.ru).
1. Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачёта.

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

### Plugin IDEA

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

Откройте IntelliJ IDEA, перейдите в раздел настроек:
* Windows/Linux: File -> Settings
* MacOS: IntelliJ IDEA -> Preferences

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

![](https://github.com/netology-code/aqa-homeworks/blob/master/docker/pic/plugins.png)

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

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

![](https://github.com/netology-code/aqa-homeworks/blob/master/docker/pic/editor.png)

![](https://github.com/netology-code/aqa-homeworks/blob/master/docker/pic/run.png)

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

![](https://github.com/netology-code/aqa-homeworks/blob/master/docker/pic/services.png)

## Задача №1: PostgreSQL

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

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

Кроме того, вам нужно подготовить файл `docker-compose.yml`, в котором прописать настройки для запуска контейнера PostgreSQL. Всю информацию о его запуске вы найдёте на официальной странице [образа на Docker Hub](https://hub.docker.com/_/postgres). Рекомендуем также изучить документацию по [СУБД PostgreSQL](https://www.postgresql.org/docs/12/index.html) для получения информации о данном продукте.

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

Если вы сделали всё правильно, то приложение запустится и на `GET http://localhost:9999/api/cards` выдаст вам JSON с картами:
```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](https://docs.docker.com/engine/reference/builder/).

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

![](https://github.com/netology-code/aqa-homeworks/blob/master/docker/pic/node.png)

Начинаем писать наш `Dockerfile`:
```
FROM node:erbium-alpine3.12
```

[Apline Linux](https://wiki.alpinelinux.org/wiki/Docker) — минималистичный образ, который часто используется в качества базового благодаря своим небольшим размерам — около 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](https://docs.docker.com/engine/reference/builder/#cmd).

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

```
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:
```yml
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 со скриншотом ответа приложения.