5

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

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

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

  1. устанавливающего/конфигурирует Docker
  2. загружает файл .zip
  3. работает мой докер изображения

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

ответ

5

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

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

#!/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.

+0

Спасибо за тщательный ответ! Мне очень нравится бонус с обновлением через SSH! Несколько вопросов: (1) в 'prepare_instance' вы загружаете deployer.sh из фиксированного IP. Какой IP это или как получить скрипт пользовательских данных, который в настоящее время работает? (2) Необходима ли часть nginx для причин, связанных с AWS, или я могу пропустить эту часть и запустить веб-сервер * в * контейнере? –

+0

И (3) почему вы устанавливаете докер, используя 'curl' и pipe, а не через' apt-get'? –

+0

(1) AWS предоставляет [метаданные данных и службу пользовательских данных] (http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html).Услуга находится в http://169.254.169.254 и может быть доступна из вашего экземпляра. –

0

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

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

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

+0

Спасибо за подсказку, чтобы взглянуть на CloudInit с CouldFormation, но я действительно ищу способ самостоятельно выполнить настройку, то есть минимальный пример, который запускает мой .zip в контейнере докеров на стандартной машине ec2 , –