AWS 容器注册表服务 ECR

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,提供了安全的、高可用性的容器镜像托管。

核心功能

  1. 镜像存储:ECR 支持存储 Docker 容器镜像,并为其提供弹性存储空间。你可以上传、下载和管理 Docker 镜像。

  2. 安全性

    IAM 权限控制:通过 AWS Identity and Access Management (IAM),你可以精确控制谁可以访问哪些镜像仓库。

    加密:所有存储在 ECR 中的镜像默认通过 AWS KMS 进行加密,传输中的镜像使用 HTTPS 加密。

    镜像扫描:ECR 提供自动化的镜像扫描功能,可以检测已知的漏洞,帮助确保部署的镜像安全。

  3. 与 ECS 和 EKS 集成:ECR 深度集成了 ECS 和 EKS,可以轻松将镜像部署到这些平台上。此外,ECR 还与 AWS Lambda 集成,用于存储和运行容器化的 Lambda 函数。

  4. 高可用性和可扩展性:ECR 是全托管的,AWS 负责底层基础设施的维护,包括高可用性、弹性扩展、备份和灾难恢复等。

  5. 镜像复制:你可以使用 ECR 跨 AWS 区域复制镜像,这对于支持全球部署和提高应用程序的可靠性非常有用。

  6. 生命周期管理:ECR 支持镜像的生命周期策略,你可以自动化管理镜像的保留和过期策略,减少存储空间浪费。

  7. 私有/公共仓库:ECR 提供私有和公共镜像库。私有仓库适用于存储企业内部使用的镜像,而公共库可以公开分享镜像给社区。

ECR 使用场景

  1. 应用程序的容器化部署:通过 ECR 存储和管理你的应用程序镜像,并与 ECS/EKS 集成,实现容器化的应用部署。
  2. 自动化 CI/CD:你可以使用 AWS CodeBuild、Jenkins 等工具,将 ECR 作为容器镜像的注册表,并结合 CI/CD 流程,自动构建、测试、发布镜像。
  3. 跨区域部署:利用 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 仓库

  1. 登录 AWS 管理控制台,进入 ECR (Elastic Container Registry) 页面。
  2. 创建仓库:
    点击 Create repository 按钮。
    给仓库命名,比如 my-python-app,保持其他设置默认。
  3. 记下仓库 URL,例如:123456789012.dkr.ecr.us-west-2.amazonaws.com/my-python-app。

构建和推送 Docker 镜像到 ECR

  1. 登录 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> 和 。

  1. 构建 Docker 镜像: 在应用根目录下运行以下命令构建 Docker 镜像。
bash 复制代码
docker build -t my-python-app .
  1. 标记 Docker 镜像: 将 Docker 镜像标记为 ECR 仓库的镜像。
bash 复制代码
docker tag my-python-app:latest <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest
  1. 推送镜像到 ECR:
bash 复制代码
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest

现在你的 Python 应用镜像已经推送到 ECR。

部署到 EC2 实例

步骤:

  1. 启动 EC2 实例:
  • 在 AWS 控制台中,进入 EC2 页面,点击 Launch Instance。
  • 选择适合的 Amazon Linux 2 或 Ubuntu AMI 镜像,并选择实例类型(如 t2.micro)。
  • 在 Configure Security Group 中,确保开启 HTTP (80) 或你需要的端口(如 5000),以允许流量访问应用。
  • 启动实例并记下公有 IP 地址。
  1. 连接到 EC2 实例: 使用 SSH 连接到你的 EC2 实例。
bash 复制代码
ssh -i "your-key.pem" ec2-user@<ec2-public-ip>
  1. 安装 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 组。

  1. 登录 ECR: 登录到你的 ECR 仓库。
bash 复制代码
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
  1. 拉取 Docker 镜像: 从 ECR 仓库拉取你之前推送的 Python 应用镜像。
bash 复制代码
docker pull <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest
  1. 运行容器: 使用以下命令运行 Docker 容器:
bash 复制代码
docker run -d -p 5000:5000 <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-python-app:latest
  1. 访问应用: 在浏览器中输入 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
相关推荐
FGGIT3 小时前
使用Docker快速本地部署RSSHub结合内网穿透访问RSS订阅源
运维·docker·容器
li3714908903 小时前
生产k8s 应用容器内存溢出OOMKilled问题处理
docker·容器·kubernetes
SelectDB3 小时前
飞轮科技携手观测云亮相云栖大会,全方位展示阿里云数据库 SelectDB 版核心优势
数据库·云原生·云计算
久绊A4 小时前
AWS 管理控制台
aws
API199701081104 小时前
深度探索与实战编码:利用Python与AWS签名机制高效接入亚马逊Product Advertising API获取商品详情
数据库·python·aws
大鹅i4 小时前
AWS Network Firewall - 配置只应许白名单域名出入站
aws
莫得等待5 小时前
k8s的一些命令
docker·容器·kubernetes
程序那点事儿5 小时前
CentOS 7 中安装 docker 环境
运维·docker·容器
Sundayday476 小时前
tomcat的安装,管理与配置
java·运维·服务器·nginx·tomcat·云计算