如何在不使用 Elastic beanstalk 或 ec2 容器服务的情况下在 aws 上部署 docker 容器

2024-03-13

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

当查看user data在运行 docker 容器的 beanstalk 创建的 ec2 实例的部分,我看到一个 cloud-init 脚本,它下载一个完成所有设置的大型 shell 脚本(Example https://s3-eu-central-1.amazonaws.com/elasticbeanstalk-env-resources-eu-central-1/stalks/eb_docker_4.2.1/lib/UserDataScript.sh)。我假设 elastic beanstalk 所做的一切也可以通过使用 ec2 实例和 auser data script.

我的问题是:有人可以提供一个minimal的例子user data编写脚本

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

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


基本上,您需要在 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 应用程序版本:

ssh [email protected] /cdn-cgi/l/email-protection 'sudo /opt/deployer.sh https://s3.amazonaws.com/your-bucket-app/myapp-201510122341.tar.gz'

Note:我在 Ubuntu 14.04 上使用 EC2 实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用 Elastic beanstalk 或 ec2 容器服务的情况下在 aws 上部署 docker 容器 的相关文章

随机推荐