首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在aws上部署码头集装箱而不使用弹性豆杆或ec2集装箱服务

如何在aws上部署码头集装箱而不使用弹性豆杆或ec2集装箱服务
EN

Stack Overflow用户
提问于 2015-10-08 07:50:00
回答 2查看 2.1K关注 0票数 5

我想使用码头集装箱,而不必使用弹性豆杆或ec2集装箱服务。我想上传一个描述容器的.zip文件(就像您使用弹性豆茎一样),并让一个通用的ec2实例使用docker运行它。

当查看运行码头容器的豆茎创建的user data实例的ec2部分时,我看到一个云init脚本,它下载执行所有设置(示例)的大型shell脚本。我假设弹性豆茎所做的一切也可以通过使用ec2实例和user data脚本手动实现。

我的问题是:有人能为user data脚本提供一个最小的示例吗?

  1. 安装/配置码头
  2. 下载.zip文件
  3. 运行我的码头形象

我熟悉自动缩放组等,我希望在不使用豆茎或ec2容器服务魔术的情况下运行这个设置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-12 15:43:08

基本上,您需要在EC2实例中安装Docker和nginx (作为web代理)。然后,下载web应用存档并部署它。这就是橡皮筋豆茎的作用。

对于基本的/最小的用户数据,为了部署单个码头容器web应用程序:

代码语言:javascript
复制
#!/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

在ElasticBean秸秆中,有一个监听更新请求的代理。但是,为了简单起见,我们可以调用上面的脚本,通过SSH部署一个新的web应用程序版本:

代码语言:javascript
复制
ssh ubuntu@ec2-107-123-123-123.compute-1.amazonaws.com 'sudo /opt/deployer.sh https://s3.amazonaws.com/your-bucket-app/myapp-201510122341.tar.gz'

注意:我在Ubuntu14.04中使用了EC2实例。

票数 5
EN

Stack Overflow用户

发布于 2015-10-08 19:43:55

用户数据基本上只是一个bash脚本,在实例第一次启动时运行。

如果您想在创建实例时从头开始设置一个实例,我建议您了解一下CloudInit以及如何在CloudFormation中使用它。http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-init.html

使用CloudInit,您可以描述要放置的文件、要安装的包和在启动时启用的服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33009731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档