如何在 AWS EC2 实例上安装并配置 Docker:从零开始的实战指南

在当今的云计算和 DevOps 领域,容器化技术已经成为不可或缺的标准。你是否想过如何在云端快速搭建一个隔离、轻量且易于扩展的应用环境?在这篇文章中,我们将深入探讨如何在 AWS Elastic Compute Cloud (EC2) 实例上安装和配置 Docker,并结合 2026 年最新的云原生开发理念,为你呈现一套从开发到生产的全流程实战指南。

什么是 Docker?

Docker 不仅仅是一个工具,它实际上是一种操作系统级的虚拟化技术。与传统虚拟机(VM)不同,传统 VM 需要模拟完整的硬件并运行一个完整的操作系统,而 Docker 共享宿主机的内核,并将应用程序及其依赖项打包在独立的“容器”中。

为什么 Docker 如此重要?

想象一下,你在本地开发了一个应用,环境是 Python 3.8,依赖了特定的库。当你把这个应用部署到服务器时,如果服务器环境不一致,应用可能会崩溃。这就是著名的“在我的机器上能跑”问题。Docker 通过将代码和运行环境一起打包(镜像),彻底解决了这个问题。

什么是 Amazon EC2?

Amazon Elastic Compute Cloud (EC2) 是亚马逊 Web Services (AWS) 提供的核心计算服务。简单来说,它为你提供了云端的服务器资源。你可以把它想象成一台在云端永远在线、且配置可以随时调整的电脑。

为什么选择 EC2 + Docker?

结合 EC2 的弹性计算能力和 Docker 的轻量级容器化特性,我们可以构建出极具伸缩性的系统。当流量增加时,我们可以快速启动更多的 EC2 实例并运行 Docker 容器来应对压力;当流量减少时,我们也可以释放资源以节省成本。

准备工作:创建并启动 EC2 实例

在开始之前,请确保你拥有一个 AWS 账号。如果没有,你需要先注册一个。接下来,让我们一步步启动一台虚拟机。

第一步:访问 EC2 控制台

登录 AWS 管理控制台,在顶部的搜索框中输入“EC2”,并点击进入服务页面。

第二步:启动实例

在左侧导航栏中,找到“Instances”(实例),然后点击橙色的“Launch Instance”(启动实例)按钮。这一步就像是在电脑商城下单了一台裸机。

第三步:命名与选择 AMI

  • Name(名称):给你的实例起一个容易识别的名字,例如“Docker-Playground-2026”。
  • AMI 选择:为了应对 2026 年的安全需求和性能标准,我们强烈推荐选择 Amazon Linux 2023 (AL2023)。它基于 Fedora,提供最新的 Linux 内核,针对 AWS Graviton 处理器(ARM 架构)进行了深度优化,且预装了 AWS 支持的许多常用工具。

第四步:选择实例类型

在“Instance Type”(实例类型)下拉菜单中,INLINECODE8ca8f278 适合尝鲜,但如果你计划运行一些稍微重量级的应用(比如本地运行小型的 LLM 推理),我们建议选择 INLINECODEdee5d5f4 或者基于 ARM 架构的 t4g.micro,后者性价比更高。

第五步:创建密钥对(关键步骤)

这是你登录服务器的“钥匙”。点击“Create new key pair”(创建新密钥对)。

  • Key pair name:输入名称,如“my-aws-key-2026”。
  • Type:选择 RSA。
  • Private key file format:选择 .pem

点击“Create key pair”后,浏览器会自动下载密钥文件。请务必妥善保管此文件。建议将其移动到安全目录并设置权限(在 Mac/Linux 上运行 chmod 400 your-key.pem)。

第六步:配置网络与安全

在生产环境的最佳实践中,我们不会直接开放 22 端口给全世界(0.0.0.0/0)。但为了本次学习的便捷性,请在“Network settings”中勾选“Create security group”,并确保“Allow SSH traffic”来源为“My IP”。

注意:如果你打算部署 Web 服务,务必现在就添加 HTTP (80) 和 HTTPS (443) 端口的规则。

最后,点击右下角的“Launch instance”。几分钟后,你的服务器就会在云端跑起来了。

第七步:连接到实例

在实例列表中,勾选该实例,点击“Connect”。AWS 会提供 SSH 连接命令。

对于 Mac/Linux 用户,命令如下:

# SSH 连接命令格式
ssh -i "my-aws-key-2026.pem" [email protected]

核心实战:安装 Docker 与现代容器工具

现在我们进入了服务器的命令行界面。虽然 2026 年的技术栈在快速演变,但底层的安装逻辑依然稳固。为了确保我们使用的是最新版本并理解整个过程,我们将手动进行安装,并引入更现代的替代方案。

第一步:更新系统软件包

在安装任何新软件之前,最佳实践是先更新系统的软件包索引和已安装的软件。这能确保我们使用的是最新的安全补丁。

# 更新所有已安装的软件包和仓库缓存
sudo dnf update -y

注:Amazon Linux 2023 使用 INLINECODE432b2407 作为包管理器(它是 INLINECODE9de7f981 的下一代),虽然兼容 INLINECODEde3bcdd3 命令,但 INLINECODEa73948dc 性能更好。

第二步:安装 Docker

我们将安装 Docker CE(社区版)。以下脚本包含了一个完整的检查和安装流程,适用于 Amazon Linux 2023。

# --- Amazon Linux 2023 安装 Docker 代码示例 ---

# 1. 安装 Docker 软件包(AL2023 仓库中通常包含最新版)
sudo dnf install docker -y

# 2. 启动 Docker 守护进程
sudo systemctl start docker

# 3. 设置 Docker 为开机自启
sudo systemctl enable docker

# 4. 验证安装状态
sudo docker --version

如果你选择的是 Ubuntu 系统,流程会更加严谨一些,需要添加官方 GPG 密钥:

# --- Ubuntu 系统的安装代码示例 ---

# 1. 更新 apt 包索引
sudo apt-get update

# 2. 安装必要的依赖包,允许 apt 通过 HTTPS 使用仓库
sudo apt-get install -y ca-certificates curl gnupg

# 3. 添加 Docker 官方的 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 4. 设置仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装最新版 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

第三步:配置用户权限(免密操作)

为了避免每次运行 Docker 都输入 INLINECODE8e30e845(这在我们编写自动化脚本时尤为重要),我们将当前用户添加到 INLINECODE13d6a1ed 用户组中。

# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER

# 刷新用户组权限(无需退出登录,但新会话生效)
newgrp docker

现在,你可以直接运行 docker ps 来测试,无需 sudo 前缀。

进阶实战:容器编排与多模态应用部署

仅仅运行一个 hello-world 容器在 2026 年已经不够了。让我们思考一个更现代的场景:我们需要部署一个包含前端、后端和数据库的全栈应用,并且希望它能在一个命令下启动。

为什么需要 Docker Compose?

在微服务架构中,应用通常由多个服务组成。手动管理每个容器的网络连接和卷挂载非常痛苦。Docker Compose 允许我们通过一个 YAML 文件定义整个服务栈。

实战案例:部署一个 AI 驱动的 Web 应用

假设我们要部署一个简单的 Python Web 应用,它使用 Redis 作为缓存。我们将创建一个 docker-compose.yml 文件。

步骤 1:创建工作目录

# 在 EC2 上创建一个干净的项目目录
mkdir ai-web-project
cd ai-web-project

步骤 2:编写 Dockerfile(Python 应用)

让我们创建一个高性能的 Python 镜像。

# Dockerfile 内容
# 使用轻量级基础镜像,减少攻击面
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 安装依赖(这里假设我们使用了 Flask 和 Redis)
# 仅仅为了演示,我们添加 flask 和 redis
RUN pip install --no-cache-dir flask redis

# 复制应用代码
COPY app.py .

# 暴露端口
EXPOSE 5000

# 设置环境变量
ENV FLASK_APP=app.py

# 启动命令
CMD ["flask", "run", "--host=0.0.0.0"]

步骤 3:编写应用代码

# 创建 app.py
cat > app.py <<EOF
from flask import Flask
from redis import Redis, RedisError
import os
import socket

# 连接 Redis 容器(主机名即服务名)
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "cannot connect to Redis, counter disabled"

    html = "

Hello {name}!

" \ "Hostname: {hostname}
" \ "Visits: {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host=‘0.0.0.0‘, port=5000) EOF

步骤 4:编写 docker-compose.yml

# docker-compose.yml
version: "3.8"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    networks:
      - frontend
    depends_on:
      - redis

  redis:
    image: redis:alpine
    networks:
      - frontend
    # 最佳实践:添加健康检查
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

networks:
  frontend:

步骤 5:启动服务栈

# 后台运行所有服务
docker compose up -d

# 查看运行状态
docker compose ps

此时,如果你的 EC2 安全组开启了 5000 端口,访问 http://:5000,你将看到一个显示访问次数的页面。每次刷新,计数器都会增加,证明数据成功持久化在了 Redis 容器中。

生产级优化:安全与性能

作为经验丰富的开发者,我们不能止步于“能跑”。在 2026 年,安全性和可观测性是第一位的。

1. 避免特权容器

默认情况下,Docker 守护进程以 root 权限运行。这带来了巨大的安全风险。如果攻击者逃逸出容器,他们就能获得宿主机的 root 权限。

最佳实践:启用 Rootless 模式 或使用用户命名空间隔离。虽然配置稍显复杂,但在生产环境中是必须的。

2. 资源限制

如果不限制容器资源,一个失控的容器可能会耗尽 EC2 的所有内存或 CPU,导致宿主机死机(OOM Killer)。在 docker-compose.yml 中,我们应该始终添加资源限制:

services:
  web:
    # ... 其他配置
    deploy:
      resources:
        limits:
          cpus: ‘0.50‘
          memory: 512M
        reservations:
          memory: 256M

3. 日志管理

默认的 Docker JSON 驱动会无限期地写入日志文件,导致磁盘爆满。我们建议使用“local”驱动,它支持日志轮转,性能更好且更安全。

services:
  web:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

常见问题与故障排查

在实际操作中,你可能会遇到一些问题。以下是我们总结的经验和解决方案:

  • Docker 镜像拉取缓慢

* 原因:EC2 区域(如新加坡、弗吉尼亚)距离 Docker Hub 中心较远。

* 解决:配置镜像加速器。对于 AWS 中国区,可以使用由 AWS 或阿里云提供的镜像源;对于海外区,可以考虑使用 Cloudflare 的 Proxy。

  • 容器内时间不正确

* 原因:容器默认使用 UTC 时间,而你的应用可能需要东八区时间。

* 解决:在 INLINECODE360cce96 或 INLINECODE9c5c2079 中挂载宿主机的时区文件:-v /etc/localtime:/etc/localtime:ro

  • docker-compose 命令找不到

* 原因:最新的 Docker Desktop 或某些发行版不再自带独立的 docker-compose 二进制文件,而是集成了 Docker Compose V2,成为 docker 的一个子插件。

* 解决:使用新语法 INLINECODE76308591(中间无连字符),而不是旧的 INLINECODE817dbfe0。

总结与 2026 年展望

在这篇文章中,我们从零开始,学习了如何在 AWS EC2 上搭建 Docker 环境,并深入探讨了从简单的容器运行到多服务编排的全过程。

掌握 EC2 与 Docker 的结合,是你通往全栈云原生开发者的基石。在 2026 年,我们不再仅仅是在运行容器,而是在构建分布式的、智能的微服务网格。下一步,我们建议你探索 Kubernetes (EKS) 以实现大规模编排,或者尝试将 Docker 容器与 AWS Lambda 进行无服务器集成。

现在,你的云端实验室已经准备就绪。无论是构建下一个生成式 AI 应用,还是部署高性能的 API 服务,你都已经拥有了最坚实的基础。快去发挥你的创造力吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/24436.html
点赞
0.00 平均评分 (0% 分数) - 0