Сборка docker image для spring web service java приложения

docker – служба для создания образов и запуска их в контейнерах.

1. Проверяем есть ли на машине docker служба

docker --version
Docker version 19.03.6, build 369ce74a3c

Если ее нет то устанавливаем, как описано здесь https://docs.docker.com/engine/install/ubuntu/
Проверяем статус и если нужно запускаем службу docker:

sudo service docker status
sudo systemctl start docker

2. Собираем jar вашего приложения

Либо пример spring web service приложения можно скачать отсюда https://github.com/maria-shpatserman/webservice
Допустим у вас простой web service , который можно запустить командой

java -jar webservice-0.0.1-SNAPSHOT.jar

А его работоспособность проверить командой

~/IdeaProjects/webservice$ http GET "http://localhost:8080/greeting?name=Mike"
HTTP/1.1 200
Connection: keep-alive
Content-Type: application/json
Date: Wed, 05 Jan 2022 20:20:29 GMT
Keep-Alive: timeout=60
Transfer-Encoding: chunked{
"content": "Hello, Mike!",
"id": 2
}

3. Запаковываем приложение в docker image.

Для этого в корне проекта создаем Dockerfile. Прописываем в него следующие строчки

FROM openjdk:11
MAINTAINER netunix
WORKDIR /app
COPY ./target/webservice-0.0.1-SNAPSHOT.jar .
EXPOSE 8080
CMD ["java","-jar","/app/webservice-0.0.1-SNAPSHOT.jar"]

Для удобства работы с docker службой в Intellij Idea можно поставить дополнительный плагин Settings→Plugins→Docker

docker plugin

Основные Docker-инструкции
FROM – на основании какого родительского образа будет создан ваш образ. Здесь можно поискать образы уже иещющие jdk для запуска java приложений https://hub.docker.com/_/openjdk
COPY – копирует в контейнер файлы и папки
EXPOSE – указывает какой порт необходимо открыть
CMD – указывает команду, которая бцудет выполнена когда контейнер будет запущен
Собираем образ командой, в текущей папке у Вас должен лежать Dockerfile:

docker build -t webeservice_img

Если не указывать параметр t ( tag) то создастся образ имеющий только IMAGE_ID вида cc31ee19650d. И запускать его в контерйнере можно будет только по ID, поэтому лучше всегда давать имя для образа.

4. Запускаем контейнер с собранным образом

Проверяем, что образ появился в списке доступных для запуска образов:

docker images

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

docker run -dp 8080:8080 webeservice_img

Параметр p — пробросить порт из контейнера на хост
Параметр d -запустить контейнер в background-e
Проверяем, что наше приложение все также работает:

http GET "http://localhost:8080/greeting?name=Mike"

Проверяем текущий статус контейнеров docker:

docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdb377dee50e webeservice_img "java -jar /app/webs…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp interesting_zhukovsky

Видим, что имя ему присвоилось автоматичечски сгенерированное.
Останавливаем контейнер по его ID:

docker stop cdb377dee50e

Запускаем контейнер и пробрасываем портиз 8080 на 80 и указываем свое собственное имя:

docker run -dp 80:8080 --name webservice webeservice_img

Теперь проверяем что все работает и на порту 80:

http GET "http://localhost/greeting?name=Mike"

Также проверяем имя полученного контейнера:

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
e2d4672b1719        3e3378e233e8        "java -jar /app/webs…"   7 minutes ago       Up 7 minutes                  0.0.0.0:80->8080/tcp   webservice
cdb377dee50e        3e3378e233e8        "java -jar /app/webs…"   About an hour ago   Exited (143) About an hour ago                       interesting_zhukovsky

Логи stdout вашего приложения можно посмотреть командой:

docker logs webservice

5. Сохрняем созданный образ в Docker Hub

У вас должна быть своя страничка на https://hub.docker.com/
Имя образа, который вы хотите сохранить в Docker Hub должно начинаться с имени вашего репозитория, поэтому делаем переименование нашего образа:

docker tag webeservice_img shpatsermanm/webeservice_img

Теперь делаем команду сохранения образа в репозиторий:

docker push shpatsermanm/webeservice_img

Если вам понадобится этот образ где-то на другой машине ( или на текущей вы его удалите командой docker rmi), то образ всегда можно будет скачать командой:

docker pull shpatsermanm/webeservice_img:latest