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-инструкции
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