在 Amazon Linux 上安装 Docker 的终极指南:从零到部署

在现代云原生应用的开发与运维中,容器化技术已经成为了不可或缺的标准。你是否曾经遇到过这样的困扰:代码在本地开发环境中运行完美,但一旦部署到服务器就因为环境差异而报错?这正是 Docker 旨在解决的核心问题。通过将应用程序及其依赖项打包到一个轻量级、可移植的容器中,Docker 消除了“在我机器上能跑”的借口。

Amazon Linux 作为 AWS 云平台上优化程度极高的操作系统,与 Docker 的集成可谓是天作之合。在本文中,我们将以第一人称的视角,一起深入探索如何在 Amazon Linux EC2 实例上一步步安装和配置 Docker。我们不仅会涵盖基础的安装步骤,还会融入 2026 年的最新技术趋势,深入探讨容器安全、AI 辅助运维以及企业级最佳实践。无论你是 DevOps 新手还是希望巩固知识的老手,这篇文章都将为你提供详尽的指导。

前置准备

在开始我们的容器化之旅之前,我们需要确保手中的工具已经准备就绪。这就像做饭前要准备好食材一样重要。为了顺利完成接下来的步骤,你需要具备以下条件:

  • AWS 账户:你需要有一个活跃的 AWS 账户。如果你还没有,可以注册一个 AWS 免费套餐账户,这足以让我们完成本次的实验。
  • 运行中的 EC2 实例:我们需要一个基于 Amazon Linux(推荐使用 Amazon Linux 2023,它是通往 2026 年标准的基石)的 EC2 实例。请确保该实例已经启动,并且你拥有连接它的权限(通常通过密钥对)。对于生产环境,我们建议选择实例类型时考虑 Arm 架构,这在能效比上更具优势。
  • 基础 Linux 知识:虽然我们会详细讲解每一步,但熟悉终端命令行操作会让你更加得心应手。

第一步:登录并访问 AWS 控制台

首先,让我们打开浏览器,导航到 AWS 管理控制台并登录。进入控制台后,你会看到繁多的服务列表。别担心,在顶部的搜索栏中输入 EC2(Elastic Compute Cloud),点击进入服务界面。

在这里,你将看到你的实例列表。请确保你的实例状态显示为 Running(正在运行)。如果实例处于停止状态,请先启动它。这个控制台是我们管理云服务器的指挥中心,虽然大部分操作我们将通过命令行完成,但在这里我们可以直观地看到服务器的健康状态。

第二步:通过 SSH 连接到你的 Linux 实例

为了安装软件,我们需要获得服务器的终端访问权限。选择你的正在运行的实例,点击上方的 Connect(连接)按钮。

AWS 提供了多种连接方式,比如 EC2 Instance Connect(浏览器直接连接)、SSH 客户端或 Session Manager。为了方便快捷,我通常首选 EC2 Instance Connect。只需确保你的实例安全组允许入站 SSH 流量(端口 22),然后点击连接按钮,一个基于浏览器的终端窗口就会弹出来。

现在,你已经置身于 Amazon Linux 的命令行环境中了。如果一切顺利,你应该能看到类似 [[email protected] ~]$ 的提示符。这就是我们将要执行所有“魔法”的地方。

第三步:系统更新与依赖管理(关键步骤)

在安装任何新软件之前,有一个铁律我们需要遵守:始终保持系统更新。这不仅能确保我们安装最新的软件版本,还能修补已知的安全漏洞。不更新系统直接安装软件,往往会导致依赖冲突或安装失败。

让我们运行以下命令来更新系统的软件包缓存和已安装的软件:

# 更新系统所有软件包,-y 参数表示自动确认所有提示
sudo dnf update -y

深入解析

在 Amazon Linux 2023 及未来的版本中,INLINECODEb8c1a2ee(Dandified YUM)已经取代了 INLINECODEec21b2c6 成为默认的包管理器。虽然 INLINECODEebcd8fa3 命令通常作为向后兼容的符号链接仍然存在,但作为拥抱新技术的开发者,我们习惯直接使用 INLINECODE47e7361f。上面的命令会连接到 AWS 的配置软件源,检查所有已安装包的版本,并将它们升级到最新版。在这个过程中,你可能会看到大量的文字滚动,这是系统在下载和安装补丁,请耐心等待直到提示“Complete!”。

第四步:安装 Docker 引擎

系统更新完毕后,我们的环境已经准备就绪。接下来,就是本次教程的重头戏——安装 Docker。

虽然我们也可以从 Docker 的官方源安装,但在 Amazon Linux 上,最推荐、最简单的方法是直接使用 Amazon 维护的软件源。这确保了 Docker 版本与系统的完美兼容性。

执行以下命令来安装 Docker:

# 从 Amazon Linux 软件源安装 Docker
sudo dnf install -y docker

发生了什么?

当你按下回车键后,INLINECODEb283513c 会解析依赖关系。Docker 引擎依赖于特定的容器库和工具。这个命令会自动处理所有复杂的依赖关系(如 INLINECODE02fe3d0a),并将它们下载、安装到你的系统中。屏幕上会列出即将安装的包,确认无误后,系统会自动完成安装。

2026 新实践:配置 Docker 守护进程(Daemon.json)

在旧式的教程中,安装完直接启动是标准操作。但在 2026 年,我们需要考虑 安全性可观测性。在启动 Docker 之前,我们要创建一个配置文件来设定一些关键参数。

让我们编辑 /etc/docker/daemon.json 文件:

# 创建 Docker 配置目录(如果不存在)
sudo mkdir -p /etc/docker

# 使用 nano 或 vi 编辑配置文件
sudo nano /etc/docker/daemon.json

请将以下内容复制进去。这是我们在生产环境中使用的标准配置,融合了日志驱动、数据目录规划以及为了兼容 Buildx 而启用的 cgroup 管理器:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "data-root": "/var/lib/docker",
  "default-runtime": "runc",
  "features": {
    "containerd-snapshotter": true
  }
}

配置详解

  • log-driver: 我们将日志驱动设置为 json-file,并限制了单个日志文件大小为 10MB,最多保留 3 个文件。这可以防止日志撑爆你的磁盘——这是我们在无数个深夜排障中总结出的血泪教训。
  • containerd-snapshotter: 启用此特性可以显著加快镜像构建和拉取的速度,这是利用现代容器存储技术的关键。

第五步:启动并启用 Docker 服务

配置完成后,现在我们可以正式启动 Docker 了。在 Linux 系统中,我们通过 systemd 来管理服务。

我们需要执行两个关键操作:

  • 启动服务:让 Docker 立即在后台运行。
  • 启用服务:让 Docker 在服务器重启后自动运行,无需人工干预。

让我们依次执行以下命令:

# 重新加载 systemd 配置,读取我们刚才的 daemon.json
sudo systemctl daemon-reload

# 启用 Docker 开机自启
sudo systemctl enable docker.service

# 立即启动 Docker 服务
sudo systemctl start docker.service

实用见解

使用 INLINECODE950f1dfe 命令非常重要。想象一下,如果你的 EC2 实例因为维护意外重启了,但你忘记手动启动 Docker,那么你的容器化应用将无法运行,导致服务中断。INLINECODE15197386 命令通过创建符号链接将 Docker 服务添加到启动目标中,完美解决了这个问题。

第六步:验证安装与权限配置

现在,让我们检查一下 Docker 是否真的听话地运行起来了。

# 查看 Docker 服务状态
sudo systemctl status docker

如果一切正常,你会看到绿色的 Active: active (running) 字样,并且有一串日志显示服务已成功启动。

接下来,让我们尝试运行第一个 Docker 命令来检查版本:

# 检查 Docker 版本信息
sudo docker --version

你可能会看到类似 Docker version 25.x.x, build xxxxxxx 的输出(到 2026 年版本号可能会更高)。这说明安装成功了!

解决权限痛点(必读)

此时,如果你尝试运行 INLINECODE3215f524 这样的命令,不输入 INLINECODE8a77f350 可能会报错。

默认情况下,Docker 命令需要 root 权限。每次运行 Docker 都要输 sudo 显得很繁琐,而且也不符合安全最佳实践(我们不应该随意给予所有用户 root 权限)。

最佳实践方案

我们可以将当前用户添加到 INLINECODE65d7fff2 用户组中。这样,当前用户就可以直接运行 Docker 命令,而无需每次都输入 INLINECODE3e57ac6f。

# 将当前用户(通常是 ec2-user)添加到 docker 组
sudo usermod -a -G docker ec2-user

重要提示

这个命令执行后,权限并不会立即生效。你需要退出当前会话并重新登录,或者刷新用户组的身份信息:

# 刷新用户组权限,无需退出登录
newgrp docker

现在,试着不带 sudo 运行一下命令:

docker ps

如果列出了容器列表(即使是空的),恭喜你,权限配置成功了!

实战应用:运行一个 Nginx Web 服务器

光跑测试容器不过瘾,让我们来做点实际的。我们将使用 Docker 部署一个 Nginx Web 服务器,并使其在后台运行。这在实际生产环境中是非常常见的操作。

# 后台运行一个 Nginx 容器,并将容器的 80 端口映射到主机的 80 端口
docker run -d -p 80:80 --name my-web-server nginx:latest

命令详解

  • -d:Detached 模式,即在后台运行容器,不会占用你的终端。
  • INLINECODE7150eb2d:端口映射。格式是 INLINECODE4ce71692。这使得我们可以通过访问 EC2 实例的公网 IP 来访问 Nginx 服务。
  • --name my-web-server:给容器起个容易记的名字,方便后续管理。
  • nginx:latest:这是我们要使用的镜像名称,Docker 会自动下载最新版。

运行成功后,你会得到一长串字符串(容器 ID)。现在,打开浏览器,输入你的 EC2 实例的 公有 IPv4 地址(Public IPv4 address)。

注意:如果无法访问,请检查你的 EC2 安全组设置。你需要确保入站规则允许 HTTP (端口 80) 流量。

进阶:2026 年视角的 AI 辅助容器管理

现在我们已经安装好了 Docker,但在 2026 年,我们管理容器的方式正在发生革命性的变化。Agentic AI(自主 AI 代理) 正在成为运维的新标准。

利用 LLM 进行智能故障排查

让我们思考一个场景:你的 Nginx 容器突然退出了。在过去,你需要手动去翻阅日志,去 Google 搜索错误码。现在,我们可以借助 LLM(大语言模型)的力量。

假设我们要查看日志并进行初步诊断,我们可以结合管道命令:

# 查看最近的日志,并尝试分析(模拟 AI 工作流)
docker logs --tail 50 my-web-server

未来的工作流

在 2026 年,我们可能会使用类似 Cursor 或带有 GitHub Copilot 的终端。当你复制这些日志时,IDE 中的 AI 助手会自动提示:“检测到 502 错误,这通常是因为后端服务不可用。建议检查上游服务器配置。”

安全左移:镜像扫描

在生产环境中,拉取镜像之前进行安全扫描是必须的。虽然 Docker Hub 是公共仓库,但我们不能盲目信任。在 2026 年,集成镜像扫描工具(如 Trivy 或 AWS 的 ECR Scan)是 CI/CD 流水线中的标准步骤。

# 这是一个示例命令,展示安全意识(需要先安装扫描工具)
# trivy image nginx:latest

这种“安全左移”的理念意味着我们在开发早期就考虑安全问题,而不是等到部署上线后才去修补漏洞。

深度优化:Docker BuildKit 与多阶段构建

如果你需要在 Amazon Linux 上构建自己的镜像(不仅仅是拉取现成的),那么必须了解 BuildKit。它是下一代 Docker 构建后端,提供了更好的性能、更快的构建速度和更强大的缓存机制。

要启用 BuildKit,只需在运行构建命令时设置环境变量:

# 启用 BuildKit 构建示例
DOCKER_BUILDKIT=1 docker build -t my-app:v1 .

最佳实践:多阶段构建

在我们的项目中,为了保持镜像体积小巧(这在微服务架构中至关重要),我们总是使用多阶段构建。想象一下,你在编译一个 Go 应用,你不需要把整个 Go 编译器打包进最终镜像。

# 这是一个多阶段构建的示例概念
# 第一阶段:构建
FROM golang:1.23 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o myapp

# 第二阶段:运行
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/myapp
CMD ["myapp"]

这种做法能将最终镜像从几百 MB 缩减到几十 MB,不仅节省存储空间,更能显著减少部署时间,降低被攻击面。

常见错误与性能优化建议

在安装和使用 Docker 的过程中,我们可能会遇到一些坑。这里分享几个常见的经验之谈:

1. 碰到 “Cannot connect to the Docker daemon”?

这是新手最常遇到的错误。通常是因为 Docker 服务没有启动,或者用户没有在 docker 组中。

解决方法

# 总是首先检查服务状态
sudo systemctl status docker
# 如果是 inactive,重启它
sudo systemctl start docker

2. 磁盘空间不足?

Docker 镜像和容器会占用大量磁盘空间。如果你的 EC2 根卷只有 8GB,可能很快就会填满。

实用命令

定期清理未使用的镜像、容器和网络。

# 清理“悬空”镜像(未使用的镜像层)
docker image prune

# 一键清理所有停止的容器和未使用的镜像(慎用,务必确认)
docker system prune -a --volumes

3. 生产环境安全建议:不要以 Root 运行

在生产环境中,永远不要使用 root 用户运行容器内的应用进程。虽然 Docker 容器在一定程度上隔离了环境,但如果容器被攻破,root 权限意味着黑客可以控制宿主机。在 Dockerfile 中使用 USER 指令指定非特权用户是一个好习惯。

总结

在这篇文章中,我们不仅完成了在 Amazon Linux 上安装 Docker 的基础任务,更是一起深入探讨了从系统更新、服务管理、权限配置到实际运行 Web 服务器的全过程。我们结合了 2026 年的技术视角,探讨了守护进程配置、AI 辅助运维以及安全左移的重要性。

掌握这些技能后,你已经准备好将任意应用程序容器化并部署到云端了。Docker 的强大之处在于它的可移植性,现在你可以在本地开发好应用,打包成镜像,然后直接推送到 AWS 的 Amazon Linux 服务器上运行,实现真正的一致性部署。

常见问题 (FAQs)

我是否需要 root 权限才能在 Amazon Linux 上安装 Docker?

是的,安装软件和启动系统级服务通常需要管理员权限。这就是为什么我们在命令前加上 INLINECODE59778877。它允许普通用户临时以超级用户的身份执行命令。后续我们也通过将用户加入 INLINECODEda7b7253 组来避免每次使用 Docker 时都输入 sudo,这是更优雅的做法。

除了 dnf install,还有其他安装方法吗?

当然有。为了获得 Docker 的绝对最新版本(不仅仅是 Amazon 维护的版本),你可以添加 Docker 的官方 GPG 密钥并设置官方软件仓库。这种方式通常被称为“从源安装”或“使用便捷脚本安装”。但对于追求稳定性和兼容性的 AWS 生产环境,使用 Amazon 自带的软件源通常是首选。

如何在服务器重启后自动启动我的应用容器?

仅仅启动 Docker服务(INLINECODE584cd141)是不够的,它只会启动 Docker 守护进程,而不会重启之前运行的容器。如果你希望容器随 Docker 启动而自动启动,可以在运行容器时添加 INLINECODE900f742f 策略。例如:

docker run -d --restart unless-stopped nginx

这样,除非手动停止容器,否则无论 Docker 服务重启还是服务器重启,该容器都会自动恢复运行。

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