Amazon ec2 如何在aws上部署docker容器而不使用elastic beanstalk或ec2容器服务

Amazon ec2 如何在aws上部署docker容器而不使用elastic beanstalk或ec2容器服务,amazon-ec2,docker,amazon-elastic-beanstalk,cloud-init,amazon-ecs,Amazon Ec2,Docker,Amazon Elastic Beanstalk,Cloud Init,Amazon Ecs,我希望使用docker容器,而不必使用elastic beanstalk或ec2容器服务。我想上传一个描述容器的.zip文件(就像使用elastic beanstalk一样),并让一个通用ec2实例使用docker运行它 当查看运行docker容器的beanstalk创建的ec2实例的user data部分时,我看到一个cloud init脚本,它下载一个完成所有设置的大型shell脚本()。我假设elastic beanstalk所做的一切也可以通过使用ec2实例和用户数据脚本手动实现 我的问

我希望使用docker容器,而不必使用elastic beanstalk或ec2容器服务。我想上传一个描述容器的
.zip
文件(就像使用elastic beanstalk一样),并让一个通用ec2实例使用docker运行它

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

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

  • 安装/配置docker
  • 下载.zip文件
  • 运行我的docker映像

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

    用户数据基本上只是实例首次启动时运行的bash脚本

    如果您想在创建实例时从头开始设置实例,我建议您看看CloudInit以及如何在CloudFormation中使用它。


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

    基本上,您需要在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
    

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

    谢谢你的提示,让我用CouldFormation查看CloudInit,但我真的在寻找一种自己进行设置的方法,即在标准EC2机器上的docker容器中运行我的
    .zip
    的最小示例。谢谢你的全面回复!我真的很喜欢通过SSH更新的好处!几个问题:(1)在
    prepare_instance
    中,您可以从固定IP下载deployer.sh。这是哪个IP,或者如何获取当前正在运行的用户数据脚本?(2) 出于AWS相关的原因,nginx部分是必需的还是我可以跳过此部分并在容器中运行Web服务器?以及(3)为什么要使用
    curl
    和pipe安装docker,而不是通过
    apt get
    ?(2)可以用任何其他代理(例如:HAProxy)替换nginx。Web代理用于实现零停机部署。我更喜欢使用Nginx。Elastic Beanstalk在单docker环境中也使用了Nginx。(3)docker提供的脚本帮助我们使用单行命令安装docker。当然,您也可以使用
    apt-get
    安装docker。顺便说一句,我刚刚更新了docker安装的脚本。我觉得没有更新,改用吧。该安装程序适用于一些Linux发行版。
    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'