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 系统满足以下基本要求:
-
操作系统版本:
- 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-release
或cat /etc/redhat-release
来检查您的 CentOS 版本。
- Docker CE 官方明确支持以下 CentOS 版本(维护中):
-
系统架构:
- Docker CE 主要支持
x86_64
(或称为amd64
)架构。本文主要针对此架构进行说明。 - 对其他架构(如
arm64
/aarch64
)的支持也日益完善,安装步骤类似,但需要确保使用的仓库和软件包是针对相应架构的。
- Docker CE 主要支持
-
内核要求:
- Docker 依赖于 Linux 内核的特定功能(如 Cgroups 和 Namespaces)。通常,满足上述操作系统版本要求的 CentOS 系统,其内核版本已经足够支持 Docker。
- 对于 CentOS 7,建议内核版本至少为 3.10 或更高。可以通过
uname -r
查看内核版本。
-
系统资源:
- 虽然 Docker 本身资源占用相对较小,但运行容器会消耗资源。建议至少拥有 1GB 的 RAM(推荐 2GB 或更多)和足够的磁盘空间用于存储 Docker 镜像、容器和卷。具体需求取决于您计划运行的应用负载。
-
用户权限:
- 安装 Docker 及后续管理操作(如启动/停止服务、管理镜像和容器)通常需要
root
权限或具有sudo
权限的用户。
- 安装 Docker 及后续管理操作(如启动/停止服务、管理镜像和容器)通常需要
-
网络连接:
- 安装过程中需要从 Docker 官方或镜像源下载软件包,因此需要确保您的 CentOS 服务器能够访问互联网。如果服务器位于防火墙后或使用代理,请确保相应的网络策略允许访问 Docker 仓库地址(
download.docker.com
)。
- 安装过程中需要从 Docker 官方或镜像源下载软件包,因此需要确保您的 CentOS 服务器能够访问互联网。如果服务器位于防火墙后或使用代理,请确保相应的网络策略允许访问 Docker 仓库地址(
-
卸载旧版本(重要):
- 如果您的系统上之前安装过旧版本或其他非官方的 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 相关软件包(如
二、 选择 Docker 安装方法
在 CentOS 上安装 Docker CE,主要有以下几种方法:
-
使用 Docker 官方 YUM 仓库(推荐):
- 优点: 这是官方推荐的最佳实践。易于安装和更新,可以确保获取到稳定、经过测试的版本。可以通过标准的
yum
(或dnf
在 CentOS 8/9 Stream) 命令管理 Docker 包。 - 缺点: 需要网络连接到 Docker 官方仓库。
- 适用场景: 大多数标准安装场景,尤其是需要保持 Docker 更新的生产和开发环境。
- 优点: 这是官方推荐的最佳实践。易于安装和更新,可以确保获取到稳定、经过测试的版本。可以通过标准的
-
使用便捷安装脚本 (Convenience Script):
- 优点: 安装过程非常简单快捷,只需执行一个从
get.docker.com
下载的脚本即可。适用于快速测试或开发环境。 - 缺点:
- 安全风险: 直接从 URL 下载并以 root 权限执行脚本存在潜在安全风险,无法预先审查脚本内容(除非手动下载并检查)。
- 不够透明: 脚本会自动检测系统并执行一系列操作,可能不如手动设置仓库那样可控和清晰。
- 不推荐用于生产环境: Docker 官方明确指出此脚本不应用于生产环境。
- 适用场景: 临时测试、快速原型开发、个人学习环境。
- 优点: 安装过程非常简单快捷,只需执行一个从
-
手动下载 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-data
和 lvm2
是 devicemapper
存储驱动所需的依赖(虽然现代 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,而不是最新的稳定版,可以先列出仓库中所有可用的版本,然后选择一个进行安装。
-
列出可用版本:
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
),第三列是仓库名。 -
安装指定版本:
选择一个版本字符串(例如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 是否已成功安装并正在运行。
-
检查 Docker 服务状态:
bash
sudo systemctl status docker
如果服务正在运行,您应该看到active (running)
的状态信息。按q
退出状态查看。 -
检查 Docker 版本:
bash
sudo docker --version
# 或者更详细的信息
# sudo docker version
这将显示已安装的 Docker 客户端和服务器(引擎)的版本信息。 -
运行
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:latestHello from Docker!
This message shows that your installation appears to be working correctly.
... (更多说明信息) ...
```
至此,通过 Docker 官方 YUM 仓库安装 Docker CE 的过程已全部完成。
四、 方法二:使用便捷安装脚本安装 Docker CE
再次强调:此方法仅推荐用于开发和测试环境,绝不应用于生产系统!
该脚本会检测您的发行版并安装 Docker CE 的最新稳定版本。
步骤 1: 下载脚本
使用 curl
从 get.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 包
- 访问 Docker CE 的 RPM 包下载地址:
https://download.docker.com/linux/centos/
- 导航到您的 CentOS 版本对应的目录(如
7/
,8-stream/
,9-stream/
)。 - 进入
x86_64/stable/Packages/
或x86_64/test/Packages/
(根据需要选择稳定版或测试版)。 - 您需要下载以下核心软件包的特定版本 RPM 文件:
containerd.io-<VERSION>.rpm
docker-ce-cli-<VERSION>.rpm
docker-ce-<VERSION>.rpm
docker-buildx-plugin-<VERSION>.rpm
(可选,但推荐)docker-compose-plugin-<VERSION>.rpm
(可选,但推荐)
- 关键:处理依赖关系。 除了 Docker 自身的包,您可能还需要下载它们依赖的其他 RPM 包(例如
docker-scan-plugin
,libcgroup
,libseccomp
等特定版本)。确定所有依赖项可能比较复杂。一个可行的方法是:-
在一台联网且配置了 Docker YUM 仓库的相同版本 CentOS 系统上,使用
yumdownloader
或dnf 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 包的目录,然后使用 yum
或 dnf
进行本地安装。使用 yum localinstall
或 dnf install
比 rpm -ivh
更好,因为它们可以更好地处理本地 RPM 包之间的依赖关系。
```bash
cd /tmp/docker-rpms
sudo yum localinstall *.rpm
或者在 CentOS Stream 8/9 上
sudo dnf install *.rpm
``
y` 继续。
确保命令是在包含所有必要 RPM 文件的目录下执行。安装过程可能会提示确认,输入
步骤 4: 后续步骤
安装完成后,同样需要按照方法一中的 步骤 5 (启动服务), 步骤 6 (设置开机自启), 和 步骤 7 (验证安装) 来完成安装过程。
六、 Docker 安装后的重要配置
无论使用哪种方法安装了 Docker,通常都需要进行以下配置:
1. 将用户添加到 docker
用户组(推荐)
默认情况下,Docker 守护进程绑定到 Unix 套接字 (/var/run/docker.sock
),该套接字的所有者是 root
用户,并且其他用户需要 sudo
才能访问。为了避免每次执行 docker
命令都需要输入 sudo
,可以将您的普通用户添加到 docker
组。Docker 在安装时通常会自动创建这个组。
安全警告: 将用户添加到 docker
组会授予他们等同于 root
的权限。因为 docker
组的用户可以运行容器,而容器可以被配置来访问宿主机的文件系统、网络等资源,甚至可以直接挂载宿主机的根目录。请确保只将受信任的用户添加到此组。
步骤:
-
检查
docker
组是否存在(通常已存在):
bash
grep docker /etc/group -
将当前用户添加到
docker
组:
假设您当前登录的用户是your_username
(可以使用echo $USER
查看)。
bash
sudo usermod -aG docker $USER-a
: 追加 (append) 用户到组,而不是替换用户的主组或现有组列表。-G
: 指定要添加到的附加组。docker
: 组名。$USER
: 环境变量,代表当前登录的用户名。
-
应用组更改:
为了让当前会话识别新的组成员身份,您需要执行以下操作之一:- 选项 A (推荐): 完全注销并重新登录服务器。
- 选项 B (临时生效于新 shell): 运行
newgrp docker
命令。这会启动一个新的 shell,该 shell 具有docker
组的权限。在此新 shell 中运行docker
命令无需sudo
。但退出这个 shell 后,原始 shell 仍然没有权限。
bash
newgrp docker
# 现在在这个新 shell 中尝试运行 docker 命令
docker ps
-
验证:
重新登录后,或者在newgrp docker
的 shell 中,尝试运行一个不需要sudo
的docker
命令:
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 默认页面。
- 运行一个交互式 Shell (例如 Ubuntu):
-
查看正在运行的容器:
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,请按以下步骤操作:
-
停止所有正在运行的容器 (可选,但推荐清理):
bash
docker stop $(docker ps -aq) -
删除所有容器 (可选):
bash
docker rm $(docker ps -aq) -
删除所有镜像 (可选):
bash
docker rmi $(docker images -q) -
删除所有卷和网络 (可选):
bash
docker volume prune -f
docker network prune -f -
卸载 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 的包,如果安装了也一并移除。 -
删除 Docker 的数据目录 (警告:这将删除所有镜像、容器、卷和网络数据):
默认情况下,数据存储在/var/lib/docker
和/var/lib/containerd
。
bash
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd -
删除 Docker 的 YUM 仓库配置文件 (可选):
bash
sudo rm /etc/yum.repos.d/docker-ce.repo
九、 常见问题与故障排查 (Troubleshooting)
-
执行
docker
命令时出现permission denied
或Cannot connect to the Docker daemon
:- 原因: 当前用户没有权限访问 Docker 守护进程的 Unix 套接字。
- 解决方案:
- 确保已将用户添加到
docker
组,并且已注销并重新登录(或使用了newgrp docker
)。 - 检查 Docker 服务是否正在运行 (
sudo systemctl status docker
),如果未运行则启动 (sudo systemctl start docker
)。 - 检查
/var/run/docker.sock
文件的权限和所有权。
- 确保已将用户添加到
-
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 模式可能使用的端口)。
- 查看详细的 Docker 服务日志:
- 原因: 配置文件错误 (
-
容器无法访问外部网络:
- 原因:宿主机防火墙 (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 服务。有时需要确保firewalld
的docker0
接口(或自定义的 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 服务器。
- 确保宿主机的 IP 转发已启用:
-
镜像下载缓慢或失败:
- 原因: 网络问题、Docker Hub 访问限制、未配置镜像加速器。
- 解决方案: 配置国内的 Docker 镜像加速器(如前文所述)。检查服务器的网络连接和 DNS 解析。
-
存储空间不足 (
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 数据目录迁移到有更大空间的分区。
- 清理不必要的 Docker 对象:
- 原因: 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 打下坚实的基础。祝您在容器化的旅程中一帆风顺!