Docker for CentOS 安装方法


CentOS 系统下 Docker 的详尽安装与配置指南

引言

在现代软件开发和运维领域,容器化技术已成为不可或缺的一部分。Docker 作为目前最流行、应用最广泛的容器化平台,提供了一种轻量级、可移植、自包含的应用打包和部署方式。它允许开发者将应用程序及其所有依赖(库、系统工具、代码、运行时)打包到一个称为容器的标准化单元中,确保应用在任何环境中都能以相同的方式运行,极大地简化了开发、测试和部署流程。

CentOS(Community ENTerprise Operating System)作为一个稳定、可靠且广泛应用于服务器环境的 Linux 发行版,是运行 Docker 的理想平台之一。在 CentOS 上部署 Docker,可以充分利用其企业级的稳定性和社区支持,结合 Docker 的灵活性和效率,为各种规模的应用提供强大的支撑。

本文将为您提供一份极其详尽的指南,涵盖在 CentOS 7、CentOS Stream 8/9 等主流版本上安装 Docker Engine(社区版,Docker CE)的各种方法、必要的先决条件、详细的步骤说明、安装后的配置、基础使用示例以及常见问题的排查,旨在帮助您从零开始,全面掌握在 CentOS 环境下部署和使用 Docker 的技能。本文篇幅较长,力求覆盖所有关键细节,确保您能够顺利完成安装并有效使用。

一、 安装 Docker 的先决条件

在开始安装 Docker 之前,请确保您的 CentOS 系统满足以下基本要求:

  1. 操作系统版本:

    • Docker CE 官方明确支持以下 CentOS 版本(维护中):
      • CentOS 7
      • CentOS Stream 8
      • CentOS Stream 9
    • 官方已停止对 CentOS 8(非 Stream)的支持,因为 CentOS 8 已于 2021 年底 EOL。虽然可能仍能找到安装方法,但不推荐在生产环境中使用。
    • 更早的 CentOS 版本(如 CentOS 6)不被官方支持,无法直接安装最新版的 Docker CE。
    • 您可以通过运行 cat /etc/os-releasecat /etc/redhat-release 来检查您的 CentOS 版本。
  2. 系统架构:

    • Docker CE 主要支持 x86_64(或称为 amd64)架构。本文主要针对此架构进行说明。
    • 对其他架构(如 arm64 / aarch64)的支持也日益完善,安装步骤类似,但需要确保使用的仓库和软件包是针对相应架构的。
  3. 内核要求:

    • Docker 依赖于 Linux 内核的特定功能(如 Cgroups 和 Namespaces)。通常,满足上述操作系统版本要求的 CentOS 系统,其内核版本已经足够支持 Docker。
    • 对于 CentOS 7,建议内核版本至少为 3.10 或更高。可以通过 uname -r 查看内核版本。
  4. 系统资源:

    • 虽然 Docker 本身资源占用相对较小,但运行容器会消耗资源。建议至少拥有 1GB 的 RAM(推荐 2GB 或更多)和足够的磁盘空间用于存储 Docker 镜像、容器和卷。具体需求取决于您计划运行的应用负载。
  5. 用户权限:

    • 安装 Docker 及后续管理操作(如启动/停止服务、管理镜像和容器)通常需要 root 权限或具有 sudo 权限的用户。
  6. 网络连接:

    • 安装过程中需要从 Docker 官方或镜像源下载软件包,因此需要确保您的 CentOS 服务器能够访问互联网。如果服务器位于防火墙后或使用代理,请确保相应的网络策略允许访问 Docker 仓库地址(download.docker.com)。
  7. 卸载旧版本(重要):

    • 如果您的系统上之前安装过旧版本或其他非官方的 Docker 相关软件包(如 docker, docker-engine, docker.io, docker-common, container-selinux 等),强烈建议在安装新版 Docker CE 之前将它们彻底卸载,以避免潜在的冲突。
    • 执行以下命令尝试卸载旧版本:
      bash
      sudo yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engine \
      docker-selinux \
      docker-engine-selinux
    • 注意: 执行此命令不会删除 /var/lib/docker 目录下的镜像、容器、卷和自定义配置文件。如果您需要彻底清理,可以在卸载后手动删除该目录(sudo rm -rf /var/lib/docker),但这会丢失所有 Docker 数据,请谨慎操作。

二、 选择 Docker 安装方法

在 CentOS 上安装 Docker CE,主要有以下几种方法:

  1. 使用 Docker 官方 YUM 仓库(推荐):

    • 优点: 这是官方推荐的最佳实践。易于安装和更新,可以确保获取到稳定、经过测试的版本。可以通过标准的 yum (或 dnf 在 CentOS 8/9 Stream) 命令管理 Docker 包。
    • 缺点: 需要网络连接到 Docker 官方仓库。
    • 适用场景: 大多数标准安装场景,尤其是需要保持 Docker 更新的生产和开发环境。
  2. 使用便捷安装脚本 (Convenience Script):

    • 优点: 安装过程非常简单快捷,只需执行一个从 get.docker.com 下载的脚本即可。适用于快速测试或开发环境。
    • 缺点:
      • 安全风险: 直接从 URL 下载并以 root 权限执行脚本存在潜在安全风险,无法预先审查脚本内容(除非手动下载并检查)。
      • 不够透明: 脚本会自动检测系统并执行一系列操作,可能不如手动设置仓库那样可控和清晰。
      • 不推荐用于生产环境: Docker 官方明确指出此脚本不应用于生产环境。
    • 适用场景: 临时测试、快速原型开发、个人学习环境。
  3. 手动下载 RPM 包安装:

    • 优点: 适用于无法直接访问互联网(离线/Air-gapped 环境)的服务器。可以精确控制安装的 Docker 版本。
    • 缺点: 安装过程相对繁琐,需要手动下载 Docker CE 及其所有依赖的 RPM 包,并手动处理依赖关系。无法通过 yum update 自动更新 Docker。
    • 适用场景: 离线环境、对特定版本有严格要求的场景。

本文将重点详细介绍第一种方法(使用官方仓库),并简要说明第二和第三种方法。

三、 方法一:使用 Docker 官方 YUM 仓库安装 Docker CE (推荐)

这是最常用且推荐的方法。步骤如下:

步骤 1: 更新系统软件包

在安装任何新软件之前,保持系统是最新状态是一个好习惯。这有助于确保所有基础软件包和库都是最新的,减少潜在的依赖冲突。

```bash
sudo yum update -y

或者在 CentOS Stream 8/9 上,也可以使用 dnf

sudo dnf update -y

```

-y 参数表示自动确认所有提示,无需手动输入 yes

步骤 2: 安装必要的依赖包

Docker 的安装和运行需要一些辅助工具。yum-utils 提供了 yum-config-manager 工具,用于管理 YUM 仓库。device-mapper-persistent-datalvm2devicemapper 存储驱动所需的依赖(虽然现代 Docker 默认倾向于使用 overlay2 存储驱动,但安装这些依赖是官方推荐的步骤,以确保兼容性)。

```bash
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

或者在 CentOS Stream 8/9 上

sudo dnf install -y dnf-utils device-mapper-persistent-data lvm2

```

步骤 3: 设置 Docker 官方稳定版 YUM 仓库

使用 yum-config-manager(由 yum-utils 提供)添加 Docker 的官方 YUM 仓库配置文件。这个仓库包含了 Docker CE 的稳定版本。

bash
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

执行该命令后,会在 /etc/yum.repos.d/ 目录下创建一个名为 docker-ce.repo 的文件,其中包含了访问 Docker 官方仓库所需的信息。

可选:启用测试 (Test) 或每夜构建 (Nightly) 仓库

如果您想尝试最新的测试版或开发版 Docker(不推荐用于生产),可以启用相应的仓库。默认情况下它们是禁用的。

```bash

启用 Nightly 仓库

sudo yum-config-manager --enable docker-ce-nightly

启用 Test 仓库

sudo yum-config-manager --enable docker-ce-test

禁用 Nightly 或 Test 仓库

sudo yum-config-manager --disable docker-ce-nightly

sudo yum-config-manager --disable docker-ce-test

```

通常情况下,我们只使用稳定的 docker-ce-stable 仓库(默认已启用)。

步骤 4: 安装 Docker Engine

现在仓库已经配置好,可以安装 Docker Engine 了。Docker Engine 包现在包含了 Docker 守护进程 (dockerd)、Docker CLI 客户端、containerd 运行时、以及一些插件(如 buildx 和 compose)。

```bash
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

或者在 CentOS Stream 8/9 上

sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

```

  • docker-ce: Docker 引擎本身(守护进程)。
  • docker-ce-cli: Docker 命令行界面(客户端工具)。
  • containerd.io: 一个独立的容器运行时,Docker 依赖它来管理容器生命周期。
  • docker-buildx-plugin: 提供 docker buildx 命令,支持更高级的构建功能(如多平台构建)。
  • docker-compose-plugin: 提供 docker compose 命令(注意与旧的 docker-compose 独立工具的区别),用于定义和运行多容器 Docker 应用程序。

安装特定版本的 Docker Engine:

如果您需要安装特定版本的 Docker CE,而不是最新的稳定版,可以先列出仓库中所有可用的版本,然后选择一个进行安装。

  1. 列出可用版本:
    bash
    yum list docker-ce --showduplicates | sort -r
    # 或 dnf list docker-ce --showduplicates | sort -r

    输出会显示类似 docker-ce.x86_64 3:20.10.17-3.el7 这样的格式。第一列是包名,第二列是版本字符串(VERSION_STRING),第三列是仓库名。

  2. 安装指定版本:
    选择一个版本字符串(例如 3:20.10.17-3.el7),然后使用以下格式安装:
    bash
    # 格式: sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io ...
    # 示例 (请替换为实际需要的版本号):
    sudo yum install -y docker-ce-3:20.10.17-3.el7 docker-ce-cli-3:20.10.17-3.el7 containerd.io docker-buildx-plugin docker-compose-plugin

    确保所有相关组件(docker-ce, docker-ce-cli 等)都指定了兼容的版本号。

步骤 5: 启动 Docker 服务

安装完成后,Docker 服务不会自动启动。需要手动启动它。

bash
sudo systemctl start docker

systemctl 是 CentOS 7 及更新版本中用于管理系统服务(Systemd)的命令。

步骤 6: 设置 Docker 开机自启(可选但推荐)

如果您希望 Docker 服务在系统启动时自动运行(这在服务器环境中通常是期望的行为),请启用该服务。

bash
sudo systemctl enable docker

如果之后想禁用开机自启,可以使用:

bash
sudo systemctl disable docker

步骤 7: 验证 Docker 安装

验证 Docker 是否已成功安装并正在运行。

  1. 检查 Docker 服务状态:
    bash
    sudo systemctl status docker

    如果服务正在运行,您应该看到 active (running) 的状态信息。按 q 退出状态查看。

  2. 检查 Docker 版本:
    bash
    sudo docker --version
    # 或者更详细的信息
    # sudo docker version

    这将显示已安装的 Docker 客户端和服务器(引擎)的版本信息。

  3. 运行 hello-world 镜像进行测试:
    这是最经典的验证方法。Docker 会尝试在本地查找 hello-world 镜像,如果找不到,会自动从 Docker Hub 下载该镜像,并运行一个简单的容器来打印一条确认消息。
    bash
    sudo docker run hello-world

    如果您看到类似以下的输出,说明 Docker 安装成功并且可以正常工作:
    ```
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    ... (镜像下载信息) ...
    Digest: sha256:...
    Status: Downloaded newer image for hello-world:latest

    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    ... (更多说明信息) ...
    ```

至此,通过 Docker 官方 YUM 仓库安装 Docker CE 的过程已全部完成。

四、 方法二:使用便捷安装脚本安装 Docker CE

再次强调:此方法仅推荐用于开发和测试环境,绝不应用于生产系统!

该脚本会检测您的发行版并安装 Docker CE 的最新稳定版本。

步骤 1: 下载脚本

使用 curlget.docker.com 下载安装脚本。

bash
curl -fsSL https://get.docker.com -o get-docker.sh

* -f: 当服务器错误时不显示 HTTP 错误信息。
* -s: 静默模式,不显示进度条。
* -S: 当 -s 启用时,如果发生错误,仍然显示错误信息。
* -L: 跟随重定向。
* -o get-docker.sh: 将下载的内容保存到 get-docker.sh 文件。

步骤 2: (可选但强烈建议) 检查脚本内容

在执行任何从互联网下载的脚本之前,尤其是需要 root 权限的脚本,最好先检查其内容,确保它不会执行任何恶意操作。

```bash
less get-docker.sh

或者使用其他编辑器如 vim, nano 等打开查看

```

步骤 3: 执行脚本进行安装

确认脚本内容无误后,使用 sudo 权限执行它。

bash
sudo sh get-docker.sh

该脚本会自动完成添加仓库、安装 Docker CE 及其依赖等步骤。

步骤 4: 后续步骤

脚本执行完毕后,Docker 通常已经安装并启动。但最好还是按照方法一中的 步骤 6 (设置开机自启)步骤 7 (验证安装) 来确认 Docker 服务状态并进行测试。

此外,使用此脚本安装后,还需要进行重要的 后期配置,特别是将用户添加到 docker 组(详见下一章节)。

五、 方法三:手动下载 RPM 包安装 Docker CE

此方法适用于无法访问互联网的离线环境。

步骤 1: 在有网络的机器上下载所需 RPM 包

  1. 访问 Docker CE 的 RPM 包下载地址:https://download.docker.com/linux/centos/
  2. 导航到您的 CentOS 版本对应的目录(如 7/, 8-stream/, 9-stream/)。
  3. 进入 x86_64/stable/Packages/x86_64/test/Packages/ (根据需要选择稳定版或测试版)。
  4. 您需要下载以下核心软件包的特定版本 RPM 文件:
    • containerd.io-<VERSION>.rpm
    • docker-ce-cli-<VERSION>.rpm
    • docker-ce-<VERSION>.rpm
    • docker-buildx-plugin-<VERSION>.rpm (可选,但推荐)
    • docker-compose-plugin-<VERSION>.rpm (可选,但推荐)
  5. 关键:处理依赖关系。 除了 Docker 自身的包,您可能还需要下载它们依赖的其他 RPM 包(例如 docker-scan-plugin, libcgroup, libseccomp 等特定版本)。确定所有依赖项可能比较复杂。一个可行的方法是:
    • 在一台联网且配置了 Docker YUM 仓库的相同版本 CentOS 系统上,使用 yumdownloaderdnf download 命令下载 Docker CE 及其所有依赖:
      ```bash
      # 在联网机器上安装 yumdownloader (如果需要)
      # sudo yum install yum-utils

      创建一个目录用于存放下载的 RPMs

      mkdir docker-rpms
      cd docker-rpms

      下载 Docker CE 及其依赖 (以 CentOS 7 为例)

      sudo yumdownloader --resolve docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

      对于 CentOS 8/9 Stream, 使用 dnf download

      sudo dnf download --resolve docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

      ``--resolve` 参数会同时下载所有必需的依赖包。

步骤 2: 将所有下载的 RPM 包传输到目标离线服务器

使用 U 盘、内部网络共享或其他方式,将 docker-rpms 目录下的所有 .rpm 文件复制到目标 CentOS 服务器上的某个目录(例如 /tmp/docker-rpms)。

步骤 3: 在离线服务器上安装 RPM 包

进入存放 RPM 包的目录,然后使用 yumdnf 进行本地安装。使用 yum localinstalldnf installrpm -ivh 更好,因为它们可以更好地处理本地 RPM 包之间的依赖关系。

```bash
cd /tmp/docker-rpms
sudo yum localinstall *.rpm

或者在 CentOS Stream 8/9 上

sudo dnf install *.rpm

``
确保命令是在包含所有必要 RPM 文件的目录下执行。安装过程可能会提示确认,输入
y` 继续。

步骤 4: 后续步骤

安装完成后,同样需要按照方法一中的 步骤 5 (启动服务), 步骤 6 (设置开机自启), 和 步骤 7 (验证安装) 来完成安装过程。

六、 Docker 安装后的重要配置

无论使用哪种方法安装了 Docker,通常都需要进行以下配置:

1. 将用户添加到 docker 用户组(推荐)

默认情况下,Docker 守护进程绑定到 Unix 套接字 (/var/run/docker.sock),该套接字的所有者是 root 用户,并且其他用户需要 sudo 才能访问。为了避免每次执行 docker 命令都需要输入 sudo,可以将您的普通用户添加到 docker 组。Docker 在安装时通常会自动创建这个组。

安全警告: 将用户添加到 docker 组会授予他们等同于 root 的权限。因为 docker 组的用户可以运行容器,而容器可以被配置来访问宿主机的文件系统、网络等资源,甚至可以直接挂载宿主机的根目录。请确保只将受信任的用户添加到此组。

步骤:

  1. 检查 docker 组是否存在(通常已存在):
    bash
    grep docker /etc/group

  2. 将当前用户添加到 docker 组:
    假设您当前登录的用户是 your_username (可以使用 echo $USER 查看)。
    bash
    sudo usermod -aG docker $USER

    • -a: 追加 (append) 用户到组,而不是替换用户的主组或现有组列表。
    • -G: 指定要添加到的附加组。
    • docker: 组名。
    • $USER: 环境变量,代表当前登录的用户名。
  3. 应用组更改:
    为了让当前会话识别新的组成员身份,您需要执行以下操作之一:

    • 选项 A (推荐): 完全注销并重新登录服务器。
    • 选项 B (临时生效于新 shell): 运行 newgrp docker 命令。这会启动一个新的 shell,该 shell 具有 docker 组的权限。在此新 shell 中运行 docker 命令无需 sudo。但退出这个 shell 后,原始 shell 仍然没有权限。
      bash
      newgrp docker
      # 现在在这个新 shell 中尝试运行 docker 命令
      docker ps
  4. 验证:
    重新登录后,或者在 newgrp docker 的 shell 中,尝试运行一个不需要 sudodocker 命令:
    bash
    docker ps
    # 或者
    docker run hello-world

    如果命令成功执行而没有权限错误,说明配置成功。

2. 配置 Docker 守护进程 (daemon)

可以通过编辑 /etc/docker/daemon.json 文件来自定义 Docker 守护进程的行为。如果该文件不存在,可以创建它。常见的配置项包括:

  • 设置存储驱动 (Storage Driver): Docker 使用存储驱动来管理镜像层和容器的可写层。在现代 Linux 内核上(CentOS 7 较新内核、CentOS 8/9 Stream),overlay2 是推荐且通常是默认的驱动。可以通过 docker info | grep "Storage Driver" 查看当前驱动。如果需要显式设置:
    json
    {
    "storage-driver": "overlay2"
    }

  • 配置镜像加速器 (Registry Mirrors): 从 Docker Hub 下载镜像可能会很慢。可以配置使用国内的镜像加速器地址(如阿里云、网易云、Docker 中国官方等提供的)来加快下载速度。
    json
    {
    "registry-mirrors": [
    "https://<your-accelerator-id>.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com"
    ]
    }

    请替换 <your-accelerator-id> 为您在云服务商处获取的专属加速器地址。

  • 配置日志驱动和选项 (Logging): 控制容器日志的收集方式和大小限制。
    json
    {
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m", // 单个日志文件最大 100MB
    "max-file": "3" // 最多保留 3 个轮转的日志文件
    }
    }

  • 配置 Docker 数据目录: 默认数据存储在 /var/lib/docker。如果需要将其移动到其他磁盘分区:
    json
    {
    "data-root": "/path/to/your/new/docker/data"
    }

    注意: 更改 data-root 需要在 Docker 服务停止状态下进行,并且需要将现有 /var/lib/docker 的内容迁移到新目录,然后才能启动 Docker。

应用配置更改:

每次修改 /etc/docker/daemon.json 文件后,都需要重新加载配置并重启 Docker 服务才能生效:

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

七、 Docker 基础使用示例

安装并配置好 Docker 后,可以开始使用它了。以下是一些基本命令:

  • 搜索镜像: 从 Docker Hub 搜索可用的镜像。
    bash
    docker search nginx

  • 下载镜像: 从 Docker Hub (或配置的镜像源) 拉取一个镜像到本地。
    bash
    docker pull ubuntu:latest # 拉取最新的 Ubuntu 镜像
    docker pull redis:6.2 # 拉取特定版本的 Redis 镜像

  • 查看本地镜像: 列出已下载到本地的所有镜像。
    bash
    docker images
    # 或 docker image ls

  • 运行容器: 基于镜像创建一个新的容器并运行它。

    • 运行一个交互式 Shell (例如 Ubuntu):
      bash
      docker run -it --rm ubuntu /bin/bash

      • -i: 保持 STDIN 打开 (交互模式)。
      • -t: 分配一个伪终端 (TTY)。
      • --rm: 容器退出时自动删除该容器。
      • ubuntu: 使用的镜像名。
      • /bin/bash: 在容器内要执行的命令。
        在容器的 shell 中,您可以像在 Ubuntu 系统中一样执行命令。输入 exit 退出容器。
    • 在后台运行一个服务 (例如 Nginx):
      bash
      docker run -d -p 8080:80 --name my-nginx nginx:latest

      • -d: 在后台 (detached mode) 运行容器。
      • -p 8080:80: 将宿主机的 8080 端口映射到容器的 80 端口。
      • --name my-nginx: 给容器命名为 my-nginx
      • nginx:latest: 使用的镜像。
        现在您可以通过访问 http://<your-server-ip>:8080 来访问 Nginx 默认页面。
  • 查看正在运行的容器:
    bash
    docker ps
    # 或 docker container ls

  • 查看所有容器 (包括已停止的):
    bash
    docker ps -a
    # 或 docker container ls -a

  • 停止容器:
    bash
    docker stop my-nginx # 使用容器名
    # 或者使用容器 ID 的前几位
    # docker stop <container_id_prefix>

  • 启动已停止的容器:
    bash
    docker start my-nginx

  • 删除容器: 容器必须先停止才能删除(除非使用 -f 强制删除)。
    bash
    docker rm my-nginx

    删除所有已停止的容器:
    bash
    docker container prune -f

  • 删除镜像: 镜像没有被任何容器(包括已停止的容器)使用时才能删除。
    bash
    docker rmi nginx:latest # 使用镜像名:标签
    # 或者使用镜像 ID
    # docker rmi <image_id>

    删除所有未被使用的悬空镜像 (dangling images):
    bash
    docker image prune -f

  • 查看容器日志:
    bash
    docker logs my-nginx
    # 实时跟踪日志
    docker logs -f my-nginx

  • 进入正在运行的容器:
    bash
    docker exec -it my-nginx /bin/bash

    这会在名为 my-nginx 的运行中容器内启动一个新的 bash shell。

八、 Docker 卸载

如果您需要卸载 Docker Engine,请按以下步骤操作:

  1. 停止所有正在运行的容器 (可选,但推荐清理):
    bash
    docker stop $(docker ps -aq)

  2. 删除所有容器 (可选):
    bash
    docker rm $(docker ps -aq)

  3. 删除所有镜像 (可选):
    bash
    docker rmi $(docker images -q)

  4. 删除所有卷和网络 (可选):
    bash
    docker volume prune -f
    docker network prune -f

  5. 卸载 Docker Engine 相关的软件包:
    bash
    sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    # 或 sudo dnf remove ...

    docker-ce-rootless-extras 是用于非 root 用户运行 Docker 的包,如果安装了也一并移除。

  6. 删除 Docker 的数据目录 (警告:这将删除所有镜像、容器、卷和网络数据):
    默认情况下,数据存储在 /var/lib/docker/var/lib/containerd
    bash
    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd

  7. 删除 Docker 的 YUM 仓库配置文件 (可选):
    bash
    sudo rm /etc/yum.repos.d/docker-ce.repo

九、 常见问题与故障排查 (Troubleshooting)

  1. 执行 docker 命令时出现 permission deniedCannot connect to the Docker daemon:

    • 原因: 当前用户没有权限访问 Docker 守护进程的 Unix 套接字。
    • 解决方案:
      • 确保已将用户添加到 docker 组,并且已注销并重新登录(或使用了 newgrp docker)。
      • 检查 Docker 服务是否正在运行 (sudo systemctl status docker),如果未运行则启动 (sudo systemctl start docker)。
      • 检查 /var/run/docker.sock 文件的权限和所有权。
  2. Docker 服务启动失败:

    • 原因: 配置文件错误 (/etc/docker/daemon.json 语法错误)、端口冲突、存储驱动问题、依赖问题等。
    • 解决方案:
      • 查看详细的 Docker 服务日志:sudo journalctl -u docker.service 或检查 /var/log/messages/var/log/syslog 中的相关错误信息。
      • 验证 /etc/docker/daemon.json 文件的 JSON 格式是否正确。可以尝试暂时移除或重命名该文件,看 Docker 能否以默认配置启动。
      • 检查是否有其他服务占用了 Docker 需要的端口(如 Docker Swarm 模式可能使用的端口)。
  3. 容器无法访问外部网络:

    • 原因:宿主机防火墙 (firewalld 或 iptables) 规则阻止了 Docker 的网络流量、DNS 配置问题。
    • 解决方案:
      • 确保宿主机的 IP 转发已启用:cat /proc/sys/net/ipv4/ip_forward (应为 1)。如果不是,编辑 /etc/sysctl.conf 添加 net.ipv4.ip_forward = 1 并执行 sudo sysctl -p
      • 检查 firewalld (CentOS 7/8/9 默认) 状态和规则。Docker 通常会自动管理其所需的 firewalld 规则。如果遇到问题,可以尝试重启 firewalld (sudo systemctl restart firewalld) 和 Docker 服务。有时需要确保 firewallddocker0 接口(或自定义的 Docker 网络接口)位于受信任的区域,或者显式允许伪装 (masquerading):
        bash
        sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0 # (如果 docker0 接口存在且你想信任它)
        sudo firewall-cmd --permanent --add-masquerade
        sudo firewall-cmd --reload
      • 检查容器内的 DNS 配置 (cat /etc/resolv.conf)。Docker 默认会使用宿主机的 DNS 设置。可以在 /etc/docker/daemon.json 中设置 dns 选项指定 DNS 服务器。
  4. 镜像下载缓慢或失败:

    • 原因: 网络问题、Docker Hub 访问限制、未配置镜像加速器。
    • 解决方案: 配置国内的 Docker 镜像加速器(如前文所述)。检查服务器的网络连接和 DNS 解析。
  5. 存储空间不足 (no space left on device):

    • 原因: Docker 数据目录 (/var/lib/docker) 所在的分区空间耗尽。大量的镜像、停止的容器、日志文件、匿名卷都会占用空间。
    • 解决方案:
      • 清理不必要的 Docker 对象:
        bash
        docker system prune -a -f --volumes # 清理所有未使用的容器、网络、镜像以及构建缓存,并删除所有未使用的卷 (危险操作,请确认!)
        # 或者更安全地逐步清理:
        docker container prune -f # 清理已停止的容器
        docker image prune -a -f # 清理所有未使用的镜像 (包括悬空和非悬空)
        docker volume prune -f # 清理未使用的卷
        docker network prune -f # 清理未使用的网络
        docker builder prune -f # 清理构建缓存
      • 检查并限制容器的日志大小(通过 daemon.json 配置)。
      • 将 Docker 数据目录迁移到有更大空间的分区。

十、 总结与后续学习

恭喜您!通过本文的详细指导,您应该已经在 CentOS 系统上成功安装并配置了 Docker Engine。我们不仅介绍了推荐的官方仓库安装方法,还涵盖了便捷脚本和离线安装方式,并重点讲解了安装后的用户组配置、守护进程自定义以及基础的 Docker 命令使用。同时,也提供了卸载步骤和常见问题的排查思路。

掌握 Docker 的安装只是第一步。容器化的世界广阔而精彩,接下来您可以深入学习:

  • Dockerfile: 学习如何编写 Dockerfile 来构建自定义的应用镜像。
  • Docker Compose: 使用 docker compose (v2) 或旧版的 docker-compose (v1) 来定义和管理多容器应用。
  • Docker Volumes & Bind Mounts: 深入理解 Docker 的数据持久化机制。
  • Docker Networking: 探索 Docker 的网络模式和自定义网络。
  • Docker Swarm 或 Kubernetes: 学习容器编排工具,用于在集群环境中管理和扩展容器化应用。
  • Docker 安全: 了解 Docker 的安全特性和最佳实践。
  • 容器镜像仓库 (Registry): 使用 Docker Hub 或搭建私有镜像仓库(如 Harbor)。

希望这篇详尽的指南能为您在 CentOS 上使用 Docker 打下坚实的基础。祝您在容器化的旅程中一帆风顺!


THE END