Краткое практическое руководство

В этом проекте будет показано, как создать собственный образ NGINX Docker через AWS Cloud9 с использованием файла Dockerfile и файла docker-compose.yml. Мы отправим этот образ в реестр AWS Elastic Container Registry (ECR). Мы также отправим образ в GitLab и, наконец, настроим конвейер CI/CD в GitLab.

Предпосылки:

  • Учетная запись AWS с разрешениями IAM
  • AWS Cloud9 IDE с установленным AWS CLI
  • Аккаунт GitLab

Сначала войдите в свою консоль AWS и перейдите в сервис Cloud9. Создайте новую среду. Я назову свой Docker NGINX. В качестве платформы выберите сервер Ubuntu. Остальные настройки оставьте по умолчанию. Создайте среду.

Найдите в Интернете свой IP-адрес и скопируйте его. Вернитесь в консоль AWS и найдите сервис EC2. Выберите запущенный экземпляр Cloud9, а затем щелкните свои группы безопасности.

Далее мы собираемся отредактировать входящие правила. Добавьте весь трафик и вставьте свой IP-адрес. Выберите блок cidr с 32-битным адресом. Сохраните правила.

Вернувшись в среду Cloud9, мы настроим нашу файловую систему. Начнем с Dockerfile. Щелкните правой кнопкой мыши первую папку среды и создайте новую папку с именем Docker. В этой папке создайте новый файл. Файл должен называться Dockerfile. Теперь вы должны увидеть маленького кита Docker рядом с файлом.

Давайте продолжим создавать файлы, добавив файл index.html, где мы настроим наш образ, чтобы сообщить нам дату и время развертывания нашего контейнера. Наконец, добавьте файл docker-compose.yml, чтобы мы могли легко создать образ NGINX.

Перейдите в папку Docker. Docker, платформа контейнеризации с открытым исходным кодом, устанавливается в AWS Cloud9. Чтобы увидеть версию, введите:

docker --version

Далее мы установим docker-compose. Для этого введите:

sudo apt install docker-compose

После установки перейдите к файлу docker-compose. Мы напишем следующее, чтобы создать образ NGINX в контейнере Docker:

Давайте посмотрим, сможем ли мы создать и запустить контейнер. Мы будем использовать «-d» для запуска контейнера в автономном режиме:

docker-compose up -d

Чтобы ваш контейнер заработал, потребуется меньше минуты. Чтобы убедиться, что контейнер запущен:

docker ps

Ваш экран должен выглядеть примерно так:

Теперь давайте свернем локальный хост:

curl localhost:8080

Вы должны увидеть что-то подобное в ответ. Мы собираемся использовать html-контент и изменить его для создания пользовательского веб-сервера NGINX:

Откройте файл index.html. Я введу следующее, особо отметив дату и время создания контейнера, которые будут отображаться:

Теперь перейдем к Dockerfile. Мы добавим следующее:

  • Nginx ищет в каталоге /usr/share/nginx/html внутри контейнера файлы для обслуживания. По этой причине мы скопируем файл index.html в /usr/share/nginx/html.

Мы будем работать:

docker-compose down

Это удалит контейнер NGINX. Мы отредактируем несколько файлов, прежде чем снова запустить его. Cloud9 поставляется с предустановленными репозиториями. Если вы наберете:

docker images

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

Давайте удалим все образы, чтобы начать заново для нашего пользовательского образа NGINX. Следующая команда удалит их все:

docker rmi -f $(docker images -q)

У нас чистый лист. Давайте снова запустим docker-compose, но перед этим отредактируем файл docker-compose, чтобы он выглядел следующим образом:

Раздел «изображения» теперь заменен на «сборка». это будет действовать как наша команда сборки докера, которая получит доступ к файлу Dockerfile. Убедитесь, что вы находитесь в том же каталоге, где находятся все ваши файлы, прежде чем мы запустим docker-compose.

Выполните следующую команду, чтобы создать и запустить новый образ докера:

docker-compose up --build -d

Я могу взглянуть на запущенные контейнеры и изображения:

Теперь вместо команды curl localhost давайте посетим контейнер, используя наш IP-адрес Cloud9. Для этого найдите кнопку «Поделиться» в Cloud9 и скопируйте IP-адрес:

В новой вкладке введите в адресную строку следующее:

http://<Cloud9_IP_Address>:8080

Это должно привести вас к вашему контейнеру:

Давайте отправим наш новый образ в AWS ECR. Найдите сервис Elastic Container Registry в AWS. Создайте репозиторий. Мы оставим настройки видимости как частные. Назовите репозиторий:

Остальные настройки оставьте как есть. Создать это. Ваш репозиторий должен быть создан. Нажмите «Просмотреть push-команды».

Вернувшись в Cloud9, если у вас еще не установлен интерфейс командной строки AWS, введите следующее:

pip3 install awscli

Вам также может понадобиться настроить интерфейс командной строки AWS с помощью:

aws configure

Затем введите следующее со страницы push-команд, команда № 1:

aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com

Вы должны получить следующее:

Далее мы введем команду №3. Мы можем пропустить № 2, так как мы уже построили наш образ:

docker tag docker_nginx:latest xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/docker_nginx:latest

Наконец, мы отправим образ в AWS ECR:

docker push xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/docker_nginx:latest

Ваш экран должен выглядеть так:

Если мы вернемся к AWS ECR, нажмите на свой репозиторий, и вы должны увидеть свое изображение:

GitLab

Теперь, когда наш контейнер зарегистрирован в AWS, почему бы не отправить его в GitLab, где мы можем запустить образ Docker в конвейере.

Войдите в свою учетную запись Gitlab или создайте ее и войдите. Нажмите «Новый проект». Возможно, вам придется создать группу, прежде чем вы сможете создать проект. Моя группа называется michael_docker. Назовите свой проект и снимите флажок «Инициализировать репозиторий с помощью README».

Прежде чем делать что-либо еще, мы собираемся создать ключи SSH для нашего профиля GitLab. Для этого в Cloud9 введите следующие команды:

ssh-keygen -t rsa -b 2048 -C "<comment>"

Примите предложенное имя файла и каталог после вывода. Далее вам будет предложено ввести парольную фразу.

Чтобы просмотреть открытые SSH-ключи, введите:

cat /home/ubuntu/.ssh/id_rsa.pub

Чтобы просмотреть закрытые SSH-ключи:

cat /home/ubuntu/.ssh/id_rsa

Вернитесь в GitLab, найдите значок своего имени пользователя в правом верхнем углу страницы и нажмите «Редактировать профиль». Затем нажмите «Ключ SSH» в левом столбце. Добавьте открытый SSH-ключ, который вы сгенерировали, в свою учетную запись GitLab и сохраните закрытый SSH-ключ в безопасном месте. Добавьте ключ.

Затем нажмите на свой новый проект и перейдите в левый столбец. Наведите указатель мыши на
«Пакеты и реестры» и нажмите «Реестр контейнеров».

Вы можете увидеть некоторые команды для входа в реестр. Сначала подключим SSH к нашей учетной записи GitLab из Cloud9:

ssh -T [email protected]

Введите парольную фразу, которую вы создали с помощью ключей SSH. Ваш экран должен выглядеть так:

Совет по устранению неполадок:

  • Возможно, вам придется ввести следующую команду, чтобы создать папку хранения паролей для ваших открытых ключей SSH, чтобы иметь доступ к вашему реестру GitLab:
sudo apt install pass
pass init "<SSH_PUBLIC_KEY>

Теперь введем первую команду на странице реестра контейнеров:

docker login registry.gitlab.com

Введите свое имя пользователя, как оно отображается в GitLab, а затем пароль GitLab.

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

docker build -t registry.gitlab.com/michael_docker/docker_nginx .

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

Наконец, мы отправим образ в наш реестр GitLab:

docker push registry.gitlab.com/michael_docker/docker_nginx

Если мы вернемся в GitLab и обновим реестр контейнеров, мы увидим, что наш образ там:

Поскольку мы зашли так далеко, давайте просто покончим с этим и настроим конвейер CI/CD в GitLab.

Согласно GitLab:

GitLab CI/CD — это инструмент для разработки программного обеспечения с использованием непрерывных методологий.

Конвейеры — это компонент верхнего уровня непрерывной интеграции, доставки и развертывания.

Вот файл .gitlab-ci.yml, необходимый для создания конвейера CI/CD:

Вернувшись в Cloud9, создайте новый файл в папке Docker с именем .gitlab-ci.yml. Вставьте приведенный выше код в файл Cloud9:

Далее введите глобальные пользовательские команды из GitLab:

Далее введите команды ниже.

Если мы обновим наш репозиторий GitLab, мы должны увидеть, что конвейер создается, а затем в конечном итоге проходит!

Если мы откроем конвейер, вы увидите, как он строится, пока не добьется успеха.

Вы можете удалить свои контейнеры и образы из Cloud9. Для этого используйте следующие команды:

docker rm -f $(docker ps -a -q)
docker rmi -f $(docker images -q)

Поздравляем. Вы создали собственный образ Docker и отправили его в AWS ECR и GitLab. Вы также построили конвейер CI/CD в GitLab.