HOWTO по развертыванию docker-контейнера на aws без использования эластичного beanstalk или контейнерной службы ec2

Я хотел бы использовать докер-контейнеры без использования эластичного бобового стебля или контейнерной службы ec2. Я хотел бы загрузить .zip файл с описанием контейнера (например, с эластичным бобовым стеблем) и запустить общий экземпляр ec2 с помощью докера.

При просмотре раздела user data созданного beanstalk экземпляра ec2, на котором запущен контейнер докеров, я вижу сценарий cloud-init, который загружает большой сценарий оболочки, который выполняет всю настройку (Пример). Я предполагаю, что все, что делает эластичный beanstalk, также может быть выполнено вручную с помощью экземпляров ec2 и user data скрипта.

Мой вопрос: может ли кто-нибудь предоставить минимальный пример для user data скрипта, который

  1. устанавливает / настраивает докер
  2. скачивает файл .zip
  3. запускает мой образ докера

Я знаком с группами автоматического масштабирования и т. Д., И я хотел бы запустить эту настройку без использования магии службы контейнеров beanstalk или ec2.


person Bastian Venthur    schedule 08.10.2015    source источник


Ответы (2)


По сути, вам необходимо установить Docker и nginx (как веб-прокси) в свой экземпляр EC2. Затем загрузите архив веб-приложения и разверните его. Это то, что делает Elastic Beanstalk.

Для базовых / минимальных пользовательских данных для развертывания одного веб-приложения контейнера докеров:

#!/bin/bash

IMG_LABEL=myapp
APP_INIT_URL=https://s3.amazonaws.com/your-bucket-app/myapp-init.tar.gz

function prepare_instance {
  apt-get -y update
  apt-get -y install nginx
  curl -sSL https://get.docker.com/ | sh
  mkdir /opt
  curl -o /opt/deployer.sh http://169.254.169.254/latest/user-data
  chmod 775 /opt/deployer.sh
}

function download_app {
  curl -o /tmp/current.tar.gz $1
  rm -rf /opt/app
  mkdir -p /opt/app
  tar zxvf /tmp/current.tar.gz -C /opt/app
  rm /tmp/current.tar.gz
}

function build_image {
  docker tag ${IMG_LABEL}:latest ${IMG_LABEL}:prev || echo "No built app"
  docker build -t ${IMG_LABEL}:latest /opt/app
}

function run_container {
  APP_CID=$(docker run -d ${IMG_LABEL}:latest)
  APP_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${APP_CID})
}

function setup_proxy {
  rm /etc/nginx/sites-enabled/*
  cat <<EOT > /etc/nginx/sites-enabled/app.conf
map \$http_upgrade \$connection_upgrade {
  default upgrade;
  ''      close;
}
upstream app.local {
  server ${APP_IP};
}
server {
  listen 80;
  location / {
    proxy_pass http://app.local;
    include /etc/nginx/proxy_params;
    proxy_http_version 1.1;
    proxy_set_header Upgrade \$http_upgrade;
    proxy_set_header Connection \$connection_upgrade;
  }
}
EOT
  service nginx reload
}

function destroy_previous {
  (docker ps -a --before="${APP_CID}" | awk '{ print $1,$2 }' | grep "${IMG_LABEL}" | awk '{print $1 }' | xargs -I {} docker stop {} | xargs -I {} docker rm {}) || echo "No previous container"
  docker rmi ${IMG_LABEL}:prev || echo "No previous image"
}

if [ ! -f /opt/deployer.sh ];
then
  prepare_instance
  download_app ${APP_INIT_URL}
else
  download_app $1
fi

build_image
run_container
setup_proxy
destroy_previous

В Elastic Beanstalk есть агент, который прослушивает запрос на обновление. Но, чтобы упростить задачу, мы можем вызвать приведенный выше скрипт для развертывания новой версии веб-приложения через SSH:

ssh [email protected] 'sudo /opt/deployer.sh https://s3.amazonaws.com/your-bucket-app/myapp-201510122341.tar.gz'

Примечание: я использую экземпляр EC2 с Ubuntu 14.04.

person Edward Samuel    schedule 12.10.2015
comment
Спасибо за обстоятельный ответ! Бонус с обновлением по SSH очень нравится! Несколько вопросов: (1) в prepare_instance вы загружаете deployer.sh с фиксированного IP. Какой это IP или как мне получить скрипт пользовательских данных, который запущен в данный момент? (2) Необходима ли часть nginx по причинам, связанным с AWS, или я могу пропустить эту часть и запустить веб-сервер в контейнере? - person Bastian Venthur; 14.10.2015
comment
И (3) почему вы устанавливаете докер, используя curl и pipe, а не через apt-get? - person Bastian Venthur; 14.10.2015
comment
(1) AWS предоставляет метаданные экземпляра и пользователя- служба передачи данных. Служба находится в 169.254.169.254, и к ней можно получить доступ из вашего экземпляра. - person Edward Samuel; 14.10.2015
comment
(2) Вы можете заменить Nginx любым другим прокси (например, HAProxy). Веб-прокси используется для достижения нулевого времени простоя при развертывании. Я предпочитаю использовать Nginx. Elastic Beanstalk также использует Nginx в среде с одним докером. - person Edward Samuel; 14.10.2015
comment
(3) Сценарий предоставляется Docker, чтобы помочь нам установить докер с помощью однострочной команды. Конечно, вы также можете установить докер, используя apt-get. - person Edward Samuel; 14.10.2015
comment
Кстати, я только что обновил скрипт для установки докера. Я думал, что get.docker.com/ubuntu не обновляется, используйте get.docker.com вместо этого. get.docker.com - это установщик для нескольких дистрибутивов Linux. - person Edward Samuel; 14.10.2015
comment
И, кроме того, я считаю, что могу пропустить часть nginx, если я не обслуживаю HTTP из этого экземпляра. ? - person Vasif; 22.11.2016

Пользовательские данные - это, по сути, просто сценарий bash, который запускается при первой загрузке экземпляра.

Если вы хотите изучить настройку экземпляра с нуля при создании экземпляра, я предлагаю вам взглянуть на CloudInit и на то, как использовать его в CloudFormation. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-init.html

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

person Elias5000    schedule 08.10.2015
comment
Спасибо за подсказку взглянуть на CloudInit с CouldFormation, но я действительно ищу способ выполнить настройку самостоятельно, то есть минимальный пример, который запускает мой .zip в контейнере докера на стандартной машине ec2. - person Bastian Venthur; 12.10.2015