1. Обзор
Docker — это открытая платформа для разработки, доставки и запуска приложений. С помощью Docker вы можете отделить свои приложения от инфраструктуры и рассматривать ее как управляемое приложение. Docker помогает быстрее доставлять код, быстрее тестировать, быстрее развертывать и сокращать цикл между написанием кода и его запуском.
Docker делает это путем объединения функций контейнеризации ядра с рабочими процессами и инструментами, которые помогают вам управлять приложениями и развертывать их.
Контейнеры Docker можно использовать непосредственно в Kubernetes, что позволяет легко запускать их в Kubernetes Engine. Изучив основы Docker, вы получите набор навыков, позволяющий начать разработку Kubernetes и контейнерных приложений.
Что вы узнаете
В этой лабораторной работе вы научитесь делать следующее:
- Создайте Dockerfile для примера приложения.
- Создайте образ
- Запустите образ как контейнер локально
- Изменить поведение контейнера
- Отправьте изображение в реестр артефактов.
Предварительные условия
Это лабораторная работа начального уровня. Предполагается, что у вас практически нет опыта работы с Docker и контейнерами. Знакомство с Cloud Shell и командной строкой желательно, но не обязательно.
Самостоятельная настройка среды
- Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .
- Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google, и вы можете обновить ее в любое время.
- Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID
), поэтому, если он вам не нравится, создайте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он «замораживается» после создания проекта. - Существует третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
- Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не платить за выставление счетов за пределами этого руководства, следуйте инструкциям по «очистке», которые можно найти в конце лаборатории кода. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
2. Образец заявления
Для облегчения этой лабораторной работы был предоставлен образец приложения. В этом разделе вы получите исходный код и создадите приложение в его собственной форме, прежде чем перейти к процессу контейнеризации.
Исходный код
Исходный код этой лабораторной работы доступен в репозитории GoogleCloudPlatform/container-developer-workshop вместе с документацией примера приложения .
Настроить git
git config --global user.name ${USER}
git config --global user.email ${USER}@qwiklabs.net
Клонируйте пример приложения Cloud Source Repository.
gcloud source repos clone sample-app ${HOME}/sample-app &&
cd ${HOME}/sample-app &&
git checkout main
Выход
Cloning into '/home/student_03_49720296e995/sample-app'... remote: Finding sources: 100% (16/16) remote: Total 16 (delta 0), reused 16 (delta 0) Receiving objects: 100% (16/16), 47.23 KiB | 681.00 KiB/s, done. warning: remote HEAD refers to nonexistent ref, unable to checkout. Project [qwiklabs-gcp-02-4327c4e03d82] repository [sample-app] was cloned to [/home/student_03_49720296e995/sample-app]. Branch 'main' set up to track remote branch 'main' from 'origin'. Switched to a new branch 'main'
Создайте пример приложения
cd ${HOME}/sample-app
./mvnw compile
Выход
[INFO] Scanning for projects... ... [INFO] Compiling 1 source file to /home/student_03_49720296e995/sample-app/target/classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 10.080 s [INFO] Finished at: 2022-02-23T17:14:30Z [INFO] ------------------------------------------------------------------------
Запустите пример приложения
cd ${HOME}/sample-app
./mvnw exec:java
Выход
[INFO] Scanning for projects... ... Listening at http://localhost:8080
Предварительный просмотр работающего приложения
- Нажмите кнопку предварительного просмотра Cloud Shell в Интернете.
- Нажмите «Просмотр» на порту 8080.
Когда ты закончишь
- Нажмите CTRL + C в Cloud Shell, чтобы остановить работающее приложение.
3. Докер-файл
Контейнеризация приложения с помощью Dockerfile
Одним из методов упаковки приложения в контейнер является использование Dockerfile. Dockerfile похож на скрипт, который инструктирует демон, как собрать образ контейнера. Дополнительную информацию см. в справочной документации Dockerfile ).
Создайте пустой Dockerfile в репозитории примера приложения.
touch ${HOME}/sample-app/Dockerfile
Откройте Dockerfile в выбранном вами редакторе.
vi ${HOME}/sample-app/Dockerfile
Выберите начальное изображение
Использование метода Dockerfile для сборки контейнера требует непосредственных знаний о приложении для сборки контейнера. Первым шагом к созданию файла Dockerfile является выбор образа, который будет использоваться в качестве основы вашего образа. Этот образ должен быть родительским или базовым изображением, поддерживаемым и публикуемым надежным источником, обычно вашей компанией.
Инструкция FROM
инициализирует новый этап сборки и устанавливает базовый образ для последующих последовательных команд. Таким образом, инструкция FROM
обычно является первой инструкцией в файле Dockerfile, и ей может предшествовать только необязательная инструкция ARG для поддержки переменных.
Синтаксис: FROM <image>[:<tag> | @<digest>] [AS <name>]
Формат изображения: <image>:<tag>
или <image>@<digest>
. Если тег или дайджест не указаны, по умолчанию используется тег :latest
. Формат <image>
зависит от реестра, используемого для хранения образа. Для реестра артефактов формат <image>
— <region>-docker.pkg.dev/<project ID>/<repository name>/<image name>:<image tag>
.
Для этой лабораторной работы мы используем общедоступный образ openjdk:11.0-jdk
, добавьте следующую строку в свой файл Dockerfile.
FROM openjdk:11.0-jdk
Установите рабочий каталог
Инструкция WORKDIR
устанавливает рабочий каталог для любых последовательных инструкций, следующих за Dockerfile. Дополнительную информацию см. в разделе WORKDIR справочной документации Dockerfile.
Синтаксис: WORKDIR <path>
В этой лабораторной работе мы используем каталог /app
в качестве WORKDIR
. Добавьте следующую строку в конец вашего Dockerfile.
WORKDIR /app
Скопируйте файлы приложения
Команда COPY
копирует каталоги или файлы из местоположения <source>
в путь <destination>
файловой системы образа. Можно указать несколько ресурсов <source>
, и все они относятся к контексту сборки. Контекст сборки будет обсуждаться далее в разделе «Сборка». Дополнительную информацию см. в разделе «КОПИЯ» справочной документации Dockerfile.
Синтаксис: COPY <source>... <destination>
Для этой лабораторной работы мы скопируем все файлы из репозитория в файловую систему образа, добавим следующую строку в конец вашего Dockerfile.
COPY . /app
Скомпилируйте приложение
Инструкция RUN
выполняет команды на новом слое изображения поверх текущего изображения и фиксирует результаты. Полученный зафиксированный образ будет использоваться для последовательных шагов в Dockerfile. Дополнительную информацию см. в разделе RUN справочной документации Dockerfile.
Синтаксис: RUN <command>
В этой лабораторной работе мы будем использовать Maven для компиляции приложения в JAR-файл. Добавьте следующую строку в конец вашего Dockerfile.
RUN ./mvnw compile assembly:single
Запустить приложение
Инструкция CMD
предоставляет команду по умолчанию для работающего контейнера. В файле Dockerfile может быть только одна инструкция CMD. Если указано более одного CMD, то вступит в силу только последний CMD. При использовании инструкций CMD и ENTRYPOINT доступны более сложные функциональные возможности, но они не рассматриваются в этой лабораторной работе. Для получения дополнительной информации см. раздел CMD справочной документации Dockerfile.
Синтаксис: CMD ["executable","param1","param2"]
Для этой лабораторной работы мы запускаем скомпилированный JAR-файл, добавляем следующую строку в конец вашего Dockerfile.
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
Окончательный файл Dockerfile
Окончательный файл Dockerfile будет
FROM openjdk:11.0-jdk
WORKDIR /app
COPY . /app
RUN ./mvnw compile assembly:single
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
Зафиксируйте Dockerfile локально
cd ${HOME}/sample-app
git add Dockerfile
git commit -m "Added Dockerfile"
4. Построить
Теперь мы создадим образ из Dockerfile с помощью команды docker build
. Эта команда дает указание демону Docker создать образ, используя инструкции из нашего Dockerfile. Дополнительную информацию см. в справочной документации по сборке Docker .
Создайте образ
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker build --tag sample-app:${IMAGE_TAG} .
Выход
Sending build context to Docker daemon 221.2kB Step 1/4 : FROM openjdk:11.0-jdk 11.0-jdk: Pulling from library/openjdk 0c6b8ff8c37e: Pull complete 412caad352a3: Pull complete e6d3e61f7a50: Pull complete 461bb1d8c517: Pull complete e442ee9d8dd9: Pull complete 542c9fe4a7ba: Pull complete 41de18d1833d: Pull complete Digest: sha256:d72b1b9e94e07278649d91c635e34737ae8f181c191b771bde6816f9bb4bd08a Status: Downloaded newer image for openjdk:11.0-jdk ---> 2924126f1829 Step 2/4 : WORKDIR /app ---> Running in ea037abb273d Removing intermediate container ea037abb273d ---> bd9b6d078082 Step 3/4 : COPY . /app ---> b9aec2b5de51 Step 4/4 : RUN ./mvnw compile jar:jar ---> Running in 3f5ff737b7fd [INFO] Scanning for projects... ... [INFO] Building jar: /app/target/sample-app-1.0.0.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 22.952 s [INFO] Finished at: 2022-02-23T18:09:08Z [INFO] ------------------------------------------------------------------------ Removing intermediate container 331443caebd3 ---> 152f65cc441e Step 5/5 : CMD ["java", "-jar", "/app/target/sample-app-1.0.0.jar"] ---> Running in 3d595a72231c Removing intermediate container 3d595a72231c ---> 0e40d7548cab Successfully built 0e40d7548cab Successfully tagged sample-app:aaa8895
5. Бегите
После успешной сборки образа контейнера мы теперь можем запустить наше приложение и убедиться, что оно работает должным образом, с помощью команды docker run. Эта команда запустит наш контейнер на переднем плане командной строки для тестирования или отладки. Дополнительную информацию см. в справочной документации по запуску Docker .
Запустите контейнер, используя образ
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-p 8080:8080 \
sample-app:${IMAGE_TAG}
Выход
Listening at http://localhost:8080
Предварительный просмотр приложения, работающего в контейнере
- Нажмите кнопку предварительного просмотра Cloud Shell в Интернете.
- Нажмите «Просмотр» на порту 8080.
- Нажмите CTRL + C в Cloud Shell, чтобы остановить контейнеры.
Изменение поведения контейнера
При выполнении Docker Run используется конфигурация по умолчанию в файле Dockerfile. Для изменения этого поведения можно добавить дополнительные инструкции и параметры.
Включить ведение журнала TRACE
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-p 8080:8080 \
sample-app:${IMAGE_TAG} \
java -Dorg.slf4j.simpleLogger.defaultLogLevel=trace -jar /app/target/sample-app-1.0.0-jar-with-dependencies.jar
Предварительный просмотр приложения, работающего в контейнере
- Нажмите кнопку предварительного просмотра Cloud Shell в Интернете.
- Нажмите «Просмотр» на порту 8080.
- Перейдите на вкладку Cloud Shell и просмотрите дополнительные журналы.
- Нажмите CTRL + C в Cloud Shell, чтобы остановить контейнер.
Изменить порт
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-e PORT=8081 \
-p 8081:8081 \
sample-app:${IMAGE_TAG}
Предварительный просмотр приложения, работающего в контейнере
- Нажмите кнопку предварительного просмотра Cloud Shell в Интернете.
- Нажмите Изменить порт.
- Введите 8081
- Нажмите «Изменить» и «Предварительный просмотр».
- Нажмите CTRL + C в Cloud Shell, чтобы остановить контейнер.
6. Нажмите
Убедившись, что образ контейнера работает правильно, и мы хотим сделать этот контейнер доступным для запуска в других средах и/или другими пользователями, нам необходимо отправить образ в общий репозиторий. Это должно происходить как часть автоматизированного конвейера сборки, но в нашей тестовой среде у нас уже настроен репозиторий, и мы можем вручную отправить наш образ.
Отправьте фиксацию Dockerfile в репозиторий примера приложения.
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
git push
Пометьте изображение для реестра артефактов
docker tag sample-app:${IMAGE_TAG} \
us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}
Настройте свои учетные данные для реестра артефактов
gcloud auth configure-docker us-central1-docker.pkg.dev
При появлении запроса Do you want to continue (Y/n)?
ответьте y
и нажмите Enter
Отправьте изображение в реестр артефактов.
docker push us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}
Выход
The push refers to repository [us-central1-docker.pkg.dev/qwiklabs-gcp-04-b47ced695a3c/apps/sample-app] 453b97f86449: Pushed e86791aa0382: Pushed d404c7ee0850: Pushed fe4f44af763d: Pushed 7c072cee6a29: Pushed 1e5fdc3d671c: Pushed 613ab28cf833: Pushed bed676ceab7a: Pushed 6398d5cccd2c: Pushed 0b0f2f2f5279: Pushed aaa8895: digest: sha256:459de00f86f159cc63f98687f7c9563fd65a2eb9bcc71c23dda3351baf13607a size: 2424
7. Поздравляем!
Поздравляем, вы завершили работу над кодом!
Что вы рассмотрели
- Создал Dockerfile для примера приложения.
- Создал образ
- Запустил образ как контейнер локально
- Изменено поведение контейнера
- Поместил образ в реестр артефактов.