Рубрики
Uncategorized

Как с легкостью построить изображения Docker в AWS

Веду мою последнюю тему реализации как можно большего количества автоматизации в AWS. Сегодня я иду … Tagged с AWS, Docker, DevOps, Node.

Веду мою последнюю тему реализации как можно большего количества автоматизации в AWS. Сегодня я собираюсь поделиться тем, как мы можем создать изображения Docker в нашем конвейере CI/CD в AWS. В частности, мы собираемся исследовать:

  • Расширение нашего шаблона Terraform, который предоставляет наш трубопровод CI/CD для предоставления реестра эластичных контейнеров AWS (ECR).
  • Создание простого Dockerfile для API Barebones ExpressJS.
  • Использование Docker сборка , тег и push Внутри нашего buildspec.yml Файл для публикации нашего последнего изображения в ECR.
  • Вытаскивая новейшее изображение из нашего реестра и запустить его на местном уровне.

Теперь, когда у нас есть земля, давайте поговорим о том, как мы можем расширить Наш обычный шаблон Terraform CI/CD Для поддержки здания Docker Images.

Включение ECR в наш трубопровод CI/CD

Чтобы начать, нам сначала нужно создать наш шаблон Terraform, который обеспечивает наш шаблон CI/CD. Мы можем сделать это с помощью Terraform-aws-codecommit-cicd модуль, который мы видели в предыдущем посте.

Полный шаблон можно найти здесь .

variable "image_name" {
  type = "string"
}

module "codecommit-cicd" {
  source                    = "git::https://github.com/slalompdx/terraform-aws-codecommit-cicd.git?ref=master"
  repo_name                 = "docker-image-build"                                                             # Required
  organization_name         = "kylegalbraith"                                                                  # Required
  repo_default_branch       = "master"                                                                         # Default value
  aws_region                = "us-west-2"                                                                      # Default value
  char_delimiter            = "-"                                                                              # Default value
  environment               = "dev"                                                                            # Default value
  build_timeout             = "5"                                                                              # Default value
  build_compute_type        = "BUILD_GENERAL1_SMALL"                                                           # Default value
  build_image               = "aws/codebuild/docker:17.09.0"                                                   # Default value
  build_privileged_override = "true"                                                                           # Default value
  test_buildspec            = "buildspec_test.yml"                                                             # Default value
  package_buildspec         = "buildspec.yml"                                                                  # Default value
  force_artifact_destroy    = "true"                                                                           # Default value
}

Вверху мы видим, что мы объявили переменную, image_name , это будет передано в шаблон. Далее мы видим, что мы создаем наш CodeCommit-CICD модуль. Это немного отличается от того, что мы видели в прошлом.

  1. Во -первых, build_image свойство установлено на AWS/Codebuild/Docker: 17.09.0 Анкет Это изображение AWS, предоставленное Codebuild, которое позволяет нам создавать собственные изображения Docker.
  2. Во -вторых, build_privileged_override Собственность новая. Это свойство сообщает Codebuild, что мы будем создавать изображения Docker, поэтому предоставьте нам доступ к ней.

Это единственные две вещи, которые нам нужно изменить в нашем трубопроводе CI/CD, чтобы поддержать создание изображений Docker в кодовой строительстве AWS. Давайте посмотрим на следующие два ресурса, определенные ниже.

resource "aws_ecr_repository" "image_repository" {
  name = "${var.image_name}"
}

resource "aws_iam_role_policy" "codebuild_policy" {
  name = "serverless-codebuild-automation-policy"
  role = "${module.codecommit-cicd.codebuild_role_name}"

  policy = <

Мы начнем с определения нашего реестра эластичных контейнеров AWS (ECR). Это полностью управляемый реестр контейнеров Docker внутри нашей учетной записи AWS. Мы можем хранить, управлять и развернуть наши контейнерные изображения с помощью ECR. Заметьте здесь, мы используем image_name переменная, которая была передана в наш шаблон для названия нашего репозитория ECR.

Последняя часть, которую мы видим здесь, — это дополнительная политика IAM, которая прилагается к той роли, которую предполагает наш проект CodeBuild. Эта политика предоставляет разрешение нашему проекту CodeBuild на то, чтобы выдвигать изображения в нашем репозитории изображения.

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

Чтобы начать, мы инициализируем наших поставщиков и наш шаблон с init командование

deployment-pipeline$ terraform init
Initializing modules...
- module.codecommit-cicd
- module.codecommit-cicd.unique_label

Initializing provider plugins...

Как только наш шаблон инициализирован, мы можем быстро запустить план Команда подтвердит все ресурсы, которые будут созданы.

deployment-pipeline$ terraform plan -var image_name=sample-express-app
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + aws_ecr_repository.image_repository

....
......
........

Plan: 13 to add, 0 to change, 0 to destroy.

-----------------------------------------------------------------------------

Мы, что 13 ресурсов будут созданы. Давайте продолжим и запустим наш применить Команда создать все это в нашей учетной записи AWS.

deployment-pipeline$ terraform apply -auto-approve -var image_name=sample-express-app
data.aws_iam_policy_document.codepipeline_assume_policy: Refreshing state...
module.codecommit-cicd.module.unique_label.null_resource.default: Creating...

....
......
........

module.codecommit-cicd.aws_iam_role_policy.codebuild_policy: Creation complete after 1s (ID: docker-image-build-codebuild-role:docker-image-build-codebuild-policy)
module.codecommit-cicd.aws_codepipeline.codepipeline: Creation complete after 1s (ID: docker-image-build)

Apply complete! Resources: 13 added, 0 changed, 0 destroyed.

Outputs:

codebuild_role = arn:aws:iam:::role/docker-image-build-codebuild-role
codepipeline_role = arn:aws:iam:::role/docker-image-build-codepipeline-role
ecr_image_respository_url = .dkr.ecr.us-west-2.amazonaws.com/sample-express-app
repo_url = https://git-codecommit.us-west-2.amazonaws.com/v1/repos/docker-image-build

Мы видим, что 13 ресурсов были созданы и что наш URL -адрес GIT Repo, а также наш URL -адрес ECR, был выведен. Скопируйте URL -адрес ECR где -то, чтобы он и в настоящее время понадобится, как только нам нужно настроить buildspec.yml File Codebuild будет использовать.

Давайте сделаем краткий обзор изображения Docker, которое мы собираемся построить и подтолкнуть к нашему новому репозиторию ECR.

Наше образец приложения и изображения Docker

Для нашей демонстрации я создал GitHub Repository Это имеет пример Express API, настроенный. В нем мы видим наш api.js Файл, который содержит нашу логику приложения.

const express = require('express');

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

const app = express();
app.get('/health', (req, res) => {
  res.send('The API is healthy, thanks for checking!\n');
});

app.listen(PORT, HOST);
console.log(`Running API on port ${PORT}`);

Это не делает ничего волшебного, но идеально подходит для демонстрации нашей конструкции изображения Docker. Мы настраиваем Экспресс Слушать на порту 8080 и настройка маршрута, /здоровье , чтобы вернуть простой ответ.

Чтобы пойти с нашим образцом приложения, у нас также есть образец Dockerfile Анкет

FROM node:8
WORKDIR /src/app

# Install app dependencies
COPY package*.json ./
RUN npm install

# Copy app contents
COPY . .

# App runs on port 8080
EXPOSE 8080

# Start the app
CMD [ "npm", "start"]

Быстрое изложение того, что здесь делает наш Dockerfile.

  • От Указывает базовое изображение Наше изображение будет построено. В нашем случае мы используем изображение узла 8, которое происходит от Docker Hub Анкет
  • Workdir устанавливает наш рабочий каталог для любых команд, которые появляются после.
  • Копия просто делает копию нашего Package.json файлы в наш рабочий каталог.
  • Запустить используется для запуска команд, здесь мы работаем NPM Установка Анкет
  • Разоблачить говорит Docker, что наш контейнер планирует выслушать в порту 8080.
  • CMD Указывает поведение по умолчанию для нашего контейнера. В нашем случае мы называем сценарий, старт , внутри наших Package.json Это тогда начинает наш экспресс -сервер в api.js Анкет

Смотри не плохо, верно? Есть много вещей, которые вы можете настроить внутри Dockerfile. Это фантастика для того, чтобы получить правильные изображения и позволяет вашим контейнерам запускать и делать то, что им нужно сделать, никакой дальнейшей конфигурации не требуется.

Построение наше изображение Docker внутри нашего конвейера CI/CD

У нас есть базовые ресурсы AWS для нашего обеспечения конвейера CI/CD. У нас есть образец приложения, в котором с ним связан Dockerfile. Теперь все, что осталось, — это создание нашего изображения Docker внутри нашего конвейера развертывания в AWS.

Последнее, что нам нужно сделать, чтобы начать создавать наше изображение Docker внутри AWS Codepipeline и Codebuild, — это настроить нашу buildspec.yml файл.

Снова, глядя на наш Пример репозитория Мы видим, что наш buildspec.yml Файл лежит в основе нашего репо. Взглянув на это, мы видим следующие команды.

version: 0.2
phases:
  install:
    commands:
      - echo install step...
  pre_build:
    commands:
      - echo logging in to AWS ECR...
      - $(aws ecr get-login --no-include-email --region us-west-2)
  build:
    commands:
      - echo build Docker image on `date`
      - cd src
      - docker build -t sample-express-app:latest .
      - docker tag sample-express-app:latest /sample-express-app:latest
  post_build:
    commands:
      - echo build Docker image complete `date`
      - echo push latest Docker images to ECR...
      - docker push /sample-express-app:latest

В pre_build Шаг мы выпускаем Get-login Позвоните в ECR через AWS CLI Анкет Результатом этого вызова является немедленно выполняется, но для ссылки здесь является то, что этот вызов возвращается.

docker login -u AWS -p  https://.dkr.ecr.us-west-2.amazonaws.com

Вызов возвращает Docker Вход Команда, чтобы получить доступ к нашему репозиторию ECR.

Далее, в сборка Команда мы работаем Docker Build из нашего SRC каталог, потому что именно здесь наш Dockerfile расположен. Команда сборки собирается создать изображение из этого файла и пометить его с помощью Образец-Express-App: последний Анкет

Затем мы принимаем это изображение с тегом исходного источника и добавляем целевое изображение с меткой, которое использует наш URL -адрес репозитория ECR.

Со всем этим сделано, мы запускаем Docker push командование, чтобы выдвинуть наше целевое изображение в репозиторий ECR.

Круто, верно? Теперь с каждым приверженностью овладеть в нашем репозитории наш трубопровод CI/CD запускается. Наш процесс сборки может затем взять наш код и dockerfile, чтобы создать новое изображение контейнера, которое напрямую подтолкнуто к нашему частному репозиторию изображения в ECR.

Тестирование нашей сантехники

Мы получили нашу инфраструктуру в AWS. Когда новый коммит вступает в Master, из нашего Dockerfile создается новый контейнер. Мы подталкиваем это новое изображение непосредственно к нашему частному репозиторию изображения в ECR.

Тестирование просты. Мы можем просто вытащить последнее изображение из нашего репозитория ECR.

kyleg$ $(aws ecr get-login --no-include-email --region us-west-2)
Login succeeded
kyleg$ docker pull /sample-express-app:latest
latest: Pulling from sample-express-app
kyleg$ docker run -p 8080:8080 -i /sample-express-app:latest
> docker_app_express@1.0.0 start /src/app
> node api.js

Running API on port 8080

Теперь может открыться Localhost: 8080/Health В нашем браузере или запустите запрос скручивания в нашей командной строке.

kyleg$ curl localhost:8080/health
The API is healthy, thanks for checking!

При этом мы успешно использовали наше изображение ECR для создания контейнера, который мы можем запустить локально.

Вывод

В этом посте мы погрузились в то, как мы можем создать конвейер CI/CD в AWS, чтобы постоянно создавать изображения Docker для нашего образца приложения. Мы также продемонстрировали, что мы можем опубликовать эти изображения в наш собственный репозиторий изображения с помощью реестра эластичных контейнеров.

Имея всего несколько небольших изменений в нашем модуле Terraform, мы смогли встать этот трубопровод всего за несколько минут. С основами Docker в нашем поясе мы можем начать строить более сложные изображения.

Мы могли бы исследовать, как подтолкнуть эти изображения в общественный репозиторий, как Dockerhub. Или, может быть, как развернуть контейнеры, используя эти изображения с помощью EKS или ECS. Возможности почти бесконечны.

Если у вас есть какие -либо вопросы, касающиеся этого поста, просто бросьте комментарий ниже, и я буду рад помочь.

Вы голодны, чтобы узнать больше о веб -сервисах Amazon?

Хотите узнать больше о AWS? Недавно я выпустил электронную книгу и видео, который прорезает море информации. Он фокусируется на хостинге, защите и развертывании статических веб -сайтов на AWS. Цель состоит в том, чтобы изучить услуги, связанные с этой проблемой, поскольку вы их используете. Если вы хотели выучить AWS, но вы не уверены, с чего начать, проверьте мой курс .

Оригинал: «https://dev.to/kylegalbraith/how-to-build-your-docker-images-in-aws-with-ease-3174»