Учебник Docker для начинающих: пример Hello World

Docker — это инструмент разработчика для упаковки приложений вместе с их средой выполнения, так что любой может развернуть и запустить их на любой другой машине, не сталкиваясь с конфликтами среды выполнения. Это очень похоже на концепцию виртуальной машины( виртуализации ), где вы можете получить образ виртуальной машины и запустить его на любом поддерживающем оборудовании. Все внутренние программы в виртуальной машине будут функционировать так, как они были упакованы изначально.

Разница между виртуальной машиной и образом docker заключается в том, что образ docker не упаковывает всю виртуальную операционную систему. Он использует ресурсы ОС так же, как и другие процессы на машине разработчика, упаковываются только приложение и его зависимости, специфичные для среды выполнения(контейнеризация).

Учебник Docker для начинающих: Hello World Example0
Виртуализация V/S Контейнеризация

Docker позволяет пользователям публиковать образы Docker и использовать образы, опубликованные другими в репозиториях, таких как Docker Hub.

В этом руководстве вы научитесь устанавливать контейнер Docker в Windows, создавать образ Docker и развертывать Dockerized-образ(который представляет собой один простой микросервис на основе Spring Boot) на машине разработчика.

1. Установка Docker на Windows

Чтобы установить Docker на компьютер с Windows, выполните следующие действия:

1.1. Выберите подходящий установщик Docker для вашей системы

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

В этой статье мы будем следовать инструкциям по установке Docker toolbox.

1.2. Загрузить установщик Docker

Сначала нам необходимо загрузить дистрибутив Docker toolbox с сайта https://download.docker.com/win/static/stable/x86_64/, а затем выполнить шаги установки на локальной рабочей станции.

1.3. Включение технологии аппаратной виртуализации

Для того, чтобы Docker toolbox работал правильно, нам нужно убедиться, что ваша система Windows поддерживает технологию аппаратной виртуализации и что виртуализация включена. Docker предоставил подробные инструкции по этому вопросу здесь: https://docs.docker.com/toolbox/toolbox_install_windows/#step-1-check-your-version. Если эта опция не включена, нам нужно перейти в BIOS и включить аппаратную виртуализацию. BIOS немного отличается для разных моделей компьютеров, поэтому, пожалуйста, следуйте официальным рекомендациям по ее включению.

1.4. Запустите установщик Docker

После того, как мы загрузили установщик и включили аппаратную виртуализацию, мы можем запустить установщик. Это просто как простой другой процесс установки на основе Windows, направляемый мастером установки.

1.5. Проверка установки

Чтобы проверить установку Docker, откройте ярлык Docker Quickstart Terminal с рабочего стола или из меню «Пуск». Убедитесь, что появляется приглашение Docker, а затем протестируйте несколько основных команд. Приглашение Docker и пример команды Docker будут выглядеть следующим образом.

Учебник Docker для начинающих: Hello World Example1

1.6. Запишите IP-адрес Docker

Теперь нам нужно записать IP-адрес Docker, назначенный этому контейнеру. Мы будем использовать этот IP-адрес для доступа к приложениям, установленным внутри Docker. Чтобы узнать IP-адрес из командной строки, используйте команду docker-machine ip. Вот пример вывода команды. Обратите внимание, что этот IP-адрес будет разным для разных M/C.

Учебник Docker для начинающих: Hello World Example2
вывод ip-адреса docker-machine

2. Создание образа Docker

Сначала мы создадим REST API на основе Spring Boot, добавим специфичную для Docker конфигурацию, а затем создадим образ Docker.

2.1. Создание приложения Spring Boot

Разработайте один простой hello world Microservice для тестирования. Мы использовали spring boot и Maven и Eclipse в качестве IDE. Добавьте конечные точки REST, чтобы после развертывания этого приложения в Docker мы могли протестировать его, обратившись к конечной точке rest.

package com.example.howtodoinjava.hellodocker;import java.util.Date;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@SpringBootApplicationpublic class HelloDockerApplication {public static void main(String[] args) {SpringApplication.run(HelloDockerApplication.class, args);}}@RestControllerclass HelloDockerRestController {@RequestMapping("/hello/{name}")public String helloDocker(@PathVariable(value = "name") String name) {String response = "Hello " + name + " Response received on : " + new Date();System.out.println(response);return response;}}

Обновите resources/application.properties, указав информацию о порте сервера.

server.port = 9080

Теперь протестируйте этот микросервис, запустив проект как приложение Spring Boot.

2.2 Добавить Dockerfile

Теперь создайте файл с именем Dockerfile в корневом каталоге и добавьте следующие строки в качестве конфигураций Docker.

FROM openjdk:8-jdk-alpineVOLUME /tmpADD target/hello-docker-0.0.1-SNAPSHOT.jar hello-docker-app.jarENV JAVA_OPTS=""ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hello-docker-app.jar" ]

Это используется Docker при создании образа. По сути, это объявление информации о среде выполнения Java и целевых дистрибутивах. Для получения более подробной информации см. справку по docker builder.

2.3. Добавьте плагины Maven Docker

Добавьте два плагина maven в файл pom.xml, чтобы мы могли использовать команды maven, связанные с Docker, при создании экземпляра. Эти плагины — dockerfile-maven-plugin и maven-dependency-plugin.

Мы использовали минимальные конфигурации, необходимые для реализации проекта.

<plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.3.4</version><configuration><repository>${docker.image.prefix}/${project.artifactId}</repository></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>unpack</id><phase>package</phase><goals><goal>unpack</goal></goals><configuration><artifactItems><artifactItem><groupId>${project.groupId}</groupId><artifactId>${project.artifactId}</artifactId><version>${project.version}</version></artifactItem></artifactItems></configuration></execution></executions></plugin>

2.4. Создать образ Docker

Теперь используйте команду maven mvn clean install dockerfile:build для создания образа Docker.

mvn clean install dockerfile:build
Учебник Docker для начинающих: Hello World Example3
Сборка образа Docker из терминала Docker

Убедитесь, что локальное приложение не запущено во время сборки образа. В этом случае может произойти сбой сборки Maven, так как на чистом шаге не удастся удалить целевую папку, поскольку jar-файл используется процессом Java.

Вот последние несколько строк выходного журнала Maven, где происходит сборка образа.

[INFO] Image will be built as hello-howtodoinjava/hello-docker:latest[INFO][INFO] Step 1/5 : FROM openjdk:8-jdk-alpine[INFO] Pulling from library/openjdk[INFO] Digest: sha256:2b1f15e04904dd44a2667a07e34c628ac4b239f92f413b587538f801a0a57c88[INFO] Status: Image is up to date for openjdk:8-jdk-alpine[INFO] ---> 478bf389b75b[INFO] Step 2/5 : VOLUME /tmp[INFO] ---> Using cache[INFO] ---> f4f6473b3c25[INFO] Step 3/5 : ADD target/hello-docker-0.0.1-SNAPSHOT.jar hello-docker-app.jar[INFO] ---> ce7491518508[INFO] Removing intermediate container c74867501651[INFO] Step 4/5 : ENV JAVA_OPTS ""[INFO] ---> Running in f7cd27710bf3[INFO] ---> 086226135205[INFO] Removing intermediate container f7cd27710bf3[INFO] Step 5/5 : ENTRYPOINT sh -c java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /hello-docker-app.jar[INFO] ---> Running in 9ef14a442715[INFO] ---> bf14919a32e2[INFO] Removing intermediate container 9ef14a442715[INFO] Successfully built bf14919a32e2[INFO] Successfully tagged hello-howtodoinjava/hello-docker:latest[INFO][INFO] Detected build of image with id bf14919a32e2[INFO] Building jar: F:\Study\Technical Writings\docker\hello-docker\target\hello-docker-0.0.1-SNAPSHOT-docker-info.jar[INFO] Successfully built hello-howtodoinjava/hello-docker:latest[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------

3. Развертывание и запуск образа Docker

Итак, мы создали образ Docker(то есть hello-docker-0.0.1-SNAPSHOT-docker-info.jar). У нас также есть установленный контейнер Docker, работающий на нашей локальной машине.

Теперь, чтобы запустить образ Docker внутри установленного контейнера Docker, мы воспользуемся следующей командой.

docker run -p 8080:9080 -t hello-howtodoinjava/hello-docker --name hello-docker-image

Здесь важна опция -p 8080:9080. Она говорит, что нужно открыть порт 8080 для внутреннего порта 9080. Помните, что наше приложение работает на порту 9080 внутри образа Docker, и мы будем получать к нему доступ на порту 8080 извне контейнера Docker.

Теперь войдите в приложение с URL http://192.168.99.100:8080/hello/sajal. Обратите внимание, что вывод браузера такой же, как вывод автономного REST API на локальном хосте.

Вывод локального хоста Docker
Вывод локального хоста Docker

4. Остановить Docker-контейнер

Мы можем вывести список всех контейнеров Docker с помощью команды docker ps в терминале, а также мы можем использовать команду docker stop <name>

docker stop <name>
Учебник Docker для начинающих: Hello World Example5
Остановить Docker-контейнер

5. Резюме

Мы научились устанавливать Docker в ОС Windows. Мы также научились создавать проект Spring Boot с одной конечной точкой REST и собирать образ Docker для него. Затем мы научились запускать образ Docker внутри контейнера Docker и тестировать конечную точку REST внутри образа Docker.

Docker — очень крутой инструмент для решения очень старой проблемы разработчиков, которая заключается в том, что «это работает на моей локальной машине». Теперь, если что-то работает на вашей машине, вы наверняка сможете запустить это и на другой машине.

Приятного обучения!!!

Загрузить исходный код

Прокрутить вверх