如何在不使用弹性 beantalk 或 ec2 容器服务的情况下在 aws 上部署 docker 容器
HOWTO deploy a docker container on aws without using elastic beanstalk or ec2 container service
我想使用 docker 容器而不必使用弹性 beanstalk 或 ec2 容器服务。我想上传一个描述容器的 .zip
文件(就像您使用弹性 beanstalk 所做的那样)并使用 docker.
有一个通用的 ec2 实例 运行
当查看 beanstalk 创建的 ec2 实例的 user data
部分 运行 宁一个 docker 容器时,我看到一个 cloud-init 脚本下载了一个大的 shell 执行所有设置的脚本 (Example)。我假设弹性 beantalk 所做的一切也可以通过使用 ec2 实例和 user data
脚本手动实现。
我的问题是:有人可以为 user data
脚本提供 最小 示例
- installs/configures docker
- 下载 .zip 文件
- 运行我的 docker 图片
我熟悉自动缩放组等,我想在不使用 beanstalk- 或 ec2 容器服务魔法的情况下获得此设置 运行ning。
用户数据基本上只是一个 bash 脚本,当实例第一次启动时 运行。
如果您想了解在创建实例时从头开始设置实例,我建议您查看 CloudInit 以及如何在 CloudFormation 中使用它。
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-init.html
使用 CloudInit,您可以描述要放置的文件、要安装的包和要启用的服务以在启动时启动。
基本上,您需要在 EC2 实例中安装 Docker 和 nginx(作为 Web 代理)。然后,下载 web-app 存档并部署它。这就是 Elastic Beanstalk 所做的。
对于 basic/minimal 用户数据,以便部署单个 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
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 , }' | grep "${IMG_LABEL}" | awk '{print }' | 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
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'
注意:我使用 EC2 实例 Ubuntu 14.04.
我想使用 docker 容器而不必使用弹性 beanstalk 或 ec2 容器服务。我想上传一个描述容器的 .zip
文件(就像您使用弹性 beanstalk 所做的那样)并使用 docker.
当查看 beanstalk 创建的 ec2 实例的 user data
部分 运行 宁一个 docker 容器时,我看到一个 cloud-init 脚本下载了一个大的 shell 执行所有设置的脚本 (Example)。我假设弹性 beantalk 所做的一切也可以通过使用 ec2 实例和 user data
脚本手动实现。
我的问题是:有人可以为 user data
脚本提供 最小 示例
- installs/configures docker
- 下载 .zip 文件
- 运行我的 docker 图片
我熟悉自动缩放组等,我想在不使用 beanstalk- 或 ec2 容器服务魔法的情况下获得此设置 运行ning。
用户数据基本上只是一个 bash 脚本,当实例第一次启动时 运行。
如果您想了解在创建实例时从头开始设置实例,我建议您查看 CloudInit 以及如何在 CloudFormation 中使用它。 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-init.html
使用 CloudInit,您可以描述要放置的文件、要安装的包和要启用的服务以在启动时启动。
基本上,您需要在 EC2 实例中安装 Docker 和 nginx(作为 Web 代理)。然后,下载 web-app 存档并部署它。这就是 Elastic Beanstalk 所做的。
对于 basic/minimal 用户数据,以便部署单个 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
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 , }' | grep "${IMG_LABEL}" | awk '{print }' | 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
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'
注意:我使用 EC2 实例 Ubuntu 14.04.