当前位置: 首页 > 知识库问答 >
问题:

如何在不使用弹性豆茎或ec2容器服务的情况下在aws上部署docker容器

孙震博
2023-03-14

我想使用docker容器,而不必使用弹性beanstek或ec2容器服务。我想上传一个描述容器的. zip文件(就像您对弹性beanstek所做的那样),并让一个通用的ec2实例使用docker运行它。

当查看运行docker容器的beanstalk创建的ec2实例的用户数据部分时,我看到一个cloud init脚本,它下载一个完成所有设置的大型shell脚本(示例)。我假设elastic beanstalk所做的一切也可以通过使用ec2实例和用户数据脚本手动实现。

我的问题是:有没有人能为用户数据脚本提供一个简单的示例

  1. 安装/配置docker

我熟悉自动缩放组等,我希望在不使用beanstalk-或ec2容器服务魔法的情况下运行此设置。

共有2个答案

方子安
2023-03-14

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

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

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

夹谷宜民
2023-03-14

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

对于部署单个docker容器web应用程序所需的基本/最少用户数据:

#!/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部署新的web应用版本:

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'

注意:我在Ubuntu 14.04中使用EC2实例。

 类似资料:
  • 我的设置:-我在Dockerrun.aws.json文件中指定了一个多锁应用程序。-我的应用程序的图像存储在ECR上。 在Elastic Beanstalk的AWS控制台中,我可以“上传并部署”一个新的Dockerrun.AWS。json文件。然后弹性豆茎部署该版本。 是否可以通过命令行执行相同的操作(“上传和部署”)? 我找到的最接近的东西是。但这只是使用现有的Dockerrun.aws.jso

  • 假设我在Wordpress中创建了一个站点,它运行在Elastic Beanstalk上。现在,在运行的应用程序上,我将创建帖子/页面,上传图像等。也就是说,数据库中的一些数据、视频、文件和记录将被添加到运行的应用程序中。 从我在AWS控制台中看到的情况来看,我可以部署一个应用程序的不同版本--但是根据上面的场景,如果我部署了一个新版本,我会不会丢失直接上传到正在运行的应用程序中的所有文件(即文件

  • 我是AWS的新手,这个问题似乎很基本。然而,我需要看看我是否能找到解决方案。 我首先创建并启动了一个 EC2 实例,然后创建了一个弹性 Beanstalk 实例,并在该实例上部署了一个示例应用程序。默认情况下,弹性 Beanstalk 会将“默认环境”附加到此实例,我无法将其更改为我的 EC2 实例。如何将我的 EC2 实例(我之前创建的实例)附加到此弹性豆茎实例?我正在使用亚马逊免费套餐来学习。

  • 我有一个用Python 2.7/Tornado编写的服务器,我正在尝试将其部署到AWS上。我遇到了AWS弹性豆茎,它看起来是一种非常方便的方法来部署我的代码。 txt文件中有一个tornado==4.4.2的条目。 我尝试添加一些日志语句来写入外部文件,但该文件没有被创建,这可能意味着应用程序甚至没有启动。 如果有人能提供一些在AWS-EB上部署龙卷风应用程序的步骤,或者我应该如何开始解决这个问题

  • 我试图在AWS Elastic Beanstek上部署一个geodjango应用程序。配置是64位AmazonLinux2017.09 v2.6.6运行Python 3.6。尝试部署时我收到此错误: 如何安装所需的软件包?我通读了在AWS Beanstalk或EC2实例中使用GeoDjango支持设置Django,但是我仍然遇到问题。我的ebextensions目前看起来像:

  • 假设我有两个Docker容器1和2。我想使用多容器Docker映像将这些部署到AWS Elastic Beanstalk,以便我有以下EC2实例来降低成本: ELB应用程序负载平衡器(有多少?) > ELB应用程序负载平衡器(有多少?) EC2实例2 Docker容器1 EC2实例3 Docker容器1 所以我的问题是: 我需要创建多少个弹性Beanstalk应用程序?从文件中不清楚