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
相关推荐
gsls2008081 小时前
docker打包nginx版wordpress
nginx·docker·wordpress
Hoper.J3 小时前
用两行命令快速搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),包含完整的 Docker 安装步骤
人工智能·深度学习·docker
Nue.js4 小时前
Docker中最常用的一些命令
docker·容器·eureka
dessler4 小时前
云计算&虚拟化-kvm创建网桥(bridge)
linux·运维·云计算
basic_code6 小时前
Docker部署kafka集群
docker·容器·kafka
Z y..7 小时前
记:Docker部署kafka消费者注册不到问题
docker·容器·kafka
ly49837 小时前
docker--工作目录迁移
docker·容器·eureka
落非9 小时前
Ubuntu配置阿里云docker apt源
ubuntu·阿里云·docker
Lysun0019 小时前
云服务器安装mysql8.0(阿里云或者腾讯云都可以)
阿里云·云计算·腾讯云
x2lab11 小时前
国产化 ARM 环境mysql-mariadb 部署
arm开发·mysql·docker·mariadb