【问题标题】:HOWTO deploy a docker container on aws without using elastic beanstalk or ec2 container service如何在不使用弹性 beanstalk 和 ec2 容器服务的情况下在 aws 上部署 docker 容器
【发布时间】:2016-01-05 17:13:56
【问题描述】:

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

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

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

  1. 安装/配置 docker
  2. 下载 .zip 文件
  3. 运行我的 docker 镜像

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

【问题讨论】:

    标签: amazon-ec2 docker amazon-elastic-beanstalk cloud-init amazon-ecs


    【解决方案1】:

    基本上,您需要在您的 EC2 实例中安装 Docker 和 nginx(作为 Web 代理)。然后,下载 Web 应用存档并进行部署。这就是 Elastic Beanstalk 所做的。

    对于基本/最少的用户数据,以便部署单个 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-app 版本:

    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 实例。

    【讨论】:

    • 感谢您的详尽回复!我真的很喜欢通过 SSH 更新带来的好处!几个问题:(1)在prepare_instance你从固定IP下载deployer.sh。那是哪个 IP 或如何获取当前正在运行的用户数据脚本? (2) nginx 部分是否因 AWS 相关原因而必需,或者我可以跳过这部分并在容器 in 中运行 webserver?
    • 还有 (3) 为什么你使用curl 和管道而不是通过apt-get 安装docker?
    • (2) 您可以将 Nginx 替换为任何其他代理(例如:HAProxy)。 Web 代理用于实现零停机部署。我更喜欢使用 Nginx。 Elastic Beanstalk 还在单 docker 环境中使用 Nginx。
    • (3) 该脚本由Docker提供,用于帮助我们通过单行命令安装docker。当然你也可以使用apt-get来安装docker。
    • 顺便说一句,我刚刚更新了 docker 安装脚本。我以为get.docker.com/ubuntu 没有更新,改用get.docker.comget.docker.com 是一些 Linux 发行版的安装程序。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您使用CoulFormation查看CloudInit的提示,但我真的在寻找一种自己进行设置的方法,即在docker容器中运行我的.zip的最小示例一台标准的 ec2 机器。
    猜你喜欢
    • 2021-07-19
    • 2015-05-01
    • 2015-08-22
    • 1970-01-01
    • 2014-04-11
    • 2021-12-30
    • 2017-02-06
    • 2014-01-21
    • 2017-09-16
    相关资源
    最近更新 更多