AWS 容器注册表服务 ECR
- [AWS ECR 是什么](#AWS ECR 是什么)
- [ECR 使用场景](#ECR 使用场景)
- [Docker 镜像](#Docker 镜像)
-
- [Docker 镜像的核心概念](#Docker 镜像的核心概念)
- [Docker 镜像 vs 容器](#Docker 镜像 vs 容器)
- [示例 EC2 上部署一个 Python 应用程序](#示例 EC2 上部署一个 Python 应用程序)
-
- [ECR 典型工作流](#ECR 典型工作流)
- 部署步骤
-
- [准备 Python 应用程序](#准备 Python 应用程序)
- [编写 Dockerfile](#编写 Dockerfile)
- [创建 ECR 仓库](#创建 ECR 仓库)
- [构建和推送 Docker 镜像到 ECR](#构建和推送 Docker 镜像到 ECR)
- [部署到 EC2 实例](#部署到 EC2 实例)
- [设置 EC2 实例自动启动容器](#设置 EC2 实例自动启动容器)
AWS ECR 是什么
Amazon Elastic Container Registry (ECR) 是 AWS 提供的完全托管的 Docker 容器镜像存储服务,旨在帮助用户存储、管理和部署容器镜像。ECR 集成了 Amazon Elastic Container Service (ECS)、Elastic Kubernetes Service (EKS) 以及 AWS Lambda,提供了安全的、高可用性的容器镜像托管。
核心功能
-
镜像存储:ECR 支持存储 Docker 容器镜像,并为其提供弹性存储空间。你可以上传、下载和管理 Docker 镜像。
-
安全性
IAM 权限控制:通过 AWS Identity and Access Management (IAM),你可以精确控制谁可以访问哪些镜像仓库。
加密:所有存储在 ECR 中的镜像默认通过 AWS KMS 进行加密,传输中的镜像使用 HTTPS 加密。
镜像扫描:ECR 提供自动化的镜像扫描功能,可以检测已知的漏洞,帮助确保部署的镜像安全。
-
与 ECS 和 EKS 集成:ECR 深度集成了 ECS 和 EKS,可以轻松将镜像部署到这些平台上。此外,ECR 还与 AWS Lambda 集成,用于存储和运行容器化的 Lambda 函数。
-
高可用性和可扩展性:ECR 是全托管的,AWS 负责底层基础设施的维护,包括高可用性、弹性扩展、备份和灾难恢复等。
-
镜像复制:你可以使用 ECR 跨 AWS 区域复制镜像,这对于支持全球部署和提高应用程序的可靠性非常有用。
-
生命周期管理:ECR 支持镜像的生命周期策略,你可以自动化管理镜像的保留和过期策略,减少存储空间浪费。
-
私有/公共仓库:ECR 提供私有和公共镜像库。私有仓库适用于存储企业内部使用的镜像,而公共库可以公开分享镜像给社区。
ECR 使用场景
- 应用程序的容器化部署:通过 ECR 存储和管理你的应用程序镜像,并与 ECS/EKS 集成,实现容器化的应用部署。
- 自动化 CI/CD:你可以使用 AWS CodeBuild、Jenkins 等工具,将 ECR 作为容器镜像的注册表,并结合 CI/CD 流程,自动构建、测试、发布镜像。
- 跨区域部署:利用 ECR 的镜像复制功能,可以轻松实现全球范围的应用部署。
Docker 镜像
Docker 镜像是一个轻量级的、独立的、可执行的软件包,它包含了运行应用程序所需的所有内容,包括代码、运行时环境、库、依赖项和配置文件。它可以看作是应用程序的只读快照。Docker 镜像是 Docker 容器的基础,当镜像启动后,容器就是它的运行实例。
Docker 镜像的核心概念
-
层 (Layers):Docker 镜像由多个只读层组成,每一层都是镜像文件系统的一部分。这些层是基于镜像的创建历史记录而生成的,意味着每一次对镜像的修改(如安装新的软件包或更改配置文件)都会形成一个新的层。Docker 使用分层文件系统来优化存储和效率,共享和重用层,以减少冗余。
-
基础镜像 (Base Image):基础镜像是没有父镜像的 Docker 镜像,通常用于操作系统(如 Ubuntu、Alpine 等)或语言运行时环境(如 Node.js、Python 等)。从基础镜像开始,用户可以创建自定义的镜像。
-
自定义镜像:开发人员可以在基础镜像的基础上,安装依赖软件或添加应用程序代码,生成自己的自定义镜像。这个过程通常通过 Dockerfile 来完成。
-
Dockerfile:Dockerfile 是一个文本文件,定义了构建 Docker 镜像的步骤。它包含了一系列指令,如指定基础镜像、安装依赖包、复制文件、设置环境变量等。Docker 引擎通过读取 Dockerfile 来自动构建镜像。
-
可移植性:由于 Docker 镜像包含了应用运行所需的所有内容,任何 Docker 宿主机都可以运行该镜像,无论操作系统或底层硬件如何。这大大提高了应用程序在不同环境中的一致性和可移植性。
Docker 镜像 vs 容器
Docker 镜像 是应用的静态构建物,包含应用和其依赖项的所有内容。镜像是只读的,不能被修改。
Docker 容器 是镜像的一个运行实例,包含镜像的内容以及可写的层。每个容器在运行时都可以对自己的可写层进行修改,而不会影响原始镜像。
使用场景
开发与测试环境一致性:开发人员可以通过 Docker 镜像确保开发、测试和生产环境完全一致,避免"在我的电脑上运行没问题"的问题。
持续集成与持续部署 (CI/CD):镜像可以被自动构建并推送到仓库,然后在部署时拉取并运行,极大地提高了软件交付的速度和质量。
应用打包与分发:通过 Docker 镜像,开发人员可以将应用程序及其所有依赖项打包在一起,便于在不同的机器或云平台上快速分发和运行。
示例 EC2 上部署一个 Python 应用程序
要在 AWS EC2 上部署一个使用 AWS ECR 存储的简单 Python 应用程序,可以按照以下步骤进行。这个流程会演示如何将 Python 应用容器化,推送到 ECR 并使用 EC2 进行部署。
ECR 典型工作流
构建镜像:开发者本地使用 Docker 构建容器镜像。
推送镜像:使用 AWS CLI 将镜像推送到 ECR 仓库。
部署镜像:通过 ECS 或 EKS 将容器镜像部署到集群中,运行容器化应用。
ECR 提供了与 AWS 服务的无缝集成、灵活的安全管理以及全球可用性,非常适合大规模、分布式的容器化应用部署。
部署步骤
准备 Python 应用程序
首先,创建一个简单的 Python 应用程序。比如一个 Flask 应用。
文件结构如下
bash
myapp/
│
├── app.py
├── requirements.txt
└── Dockerfile
app.py (Flask 应用)
python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
requirements.txt (Python 依赖)
txt
Flask==2.0.1
编写 Dockerfile
创建一个 Dockerfile,用于定义如何构建 Python 应用的 Docker 镜像。
Dockerfile
Dockerfile
# 使用官方的 Python 3 基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 5000
# 启动应用
CMD ["python", "app.py"]
创建 ECR 仓库
- 登录 AWS 管理控制台,进入 ECR (Elastic Container Registry) 页面。
- 创建仓库:
点击 Create repository 按钮。
给仓库命名,比如 my-python-app,保持其他设置默认。 - 记下仓库 URL,例如:123456789012.dkr.ecr.us-west-2.amazonaws.com/my-python-app。
构建和推送 Docker 镜像到 ECR
- 登录 AWS CLI: 确保你在本地安装并配置了 AWS CLI,执行以下命令登录到 ECR。
bash
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
用你的 AWS 账户 ID 和区域替换 <aws_account_id> 和 。
- 构建 Docker 镜像: 在应用根目录下运行以下命令构建 Docker 镜像。
bash
docker build -t my-python-app .
- 标记 Docker 镜像: 将 Docker 镜像标记为 ECR 仓库的镜像。
bash
docker tag my-python-app:latest <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest
- 推送镜像到 ECR:
bash
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest
现在你的 Python 应用镜像已经推送到 ECR。
部署到 EC2 实例
步骤:
- 启动 EC2 实例:
- 在 AWS 控制台中,进入 EC2 页面,点击 Launch Instance。
- 选择适合的 Amazon Linux 2 或 Ubuntu AMI 镜像,并选择实例类型(如 t2.micro)。
- 在 Configure Security Group 中,确保开启 HTTP (80) 或你需要的端口(如 5000),以允许流量访问应用。
- 启动实例并记下公有 IP 地址。
- 连接到 EC2 实例: 使用 SSH 连接到你的 EC2 实例。
bash
ssh -i "your-key.pem" ec2-user@<ec2-public-ip>
- 安装 Docker: 在 EC2 实例上安装 Docker。
bash
sudo yum update -y
sudo yum install docker -y
sudo service docker start
sudo usermod -a -G docker ec2-user
注销并重新登录 EC2 实例,以便让 ec2-user 加入 Docker 组。
- 登录 ECR: 登录到你的 ECR 仓库。
bash
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
- 拉取 Docker 镜像: 从 ECR 仓库拉取你之前推送的 Python 应用镜像。
bash
docker pull <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest
- 运行容器: 使用以下命令运行 Docker 容器:
bash
docker run -d -p 5000:5000 <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest
- 访问应用: 在浏览器中输入 http://:5000,你应该能看到页面显示 Hello, World!。
设置 EC2 实例自动启动容器
为确保容器在 EC2 实例重新启动后自动启动,你可以创建一个 systemd 服务来管理 Docker 容器。
创建 systemd 服务文件:
bash
sudo vim /etc/systemd/system/myapp.service
在文件中添加以下内容:
ini
[Unit]
Description=My Python App
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/bin/docker run -d -p 5000:5000 <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest
ExecStop=/usr/bin/docker stop $(/usr/bin/docker ps -q --filter ancestor=<aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest)
[Install]
WantedBy=multi-user.target
启动并启用服务:
bash
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp