搞定Linux环境下的Docker安装:常见问题与解决方案 – wiki词典


搞定Linux环境下的Docker安装:常见问题与解决方案

Docker 已经成为现代软件开发和运维的基石。它通过容器化技术,将应用程序及其依赖打包在一起,实现了“一次构建,处处运行”的理想。然而,对于许多初学者来说,在 Linux 系统上成功安装并配置 Docker 并非总是一帆风顺。本文将详细介绍在 Linux 环境下安装 Docker 的标准流程,并重点剖析安装过程中可能遇到的常见问题及其解决方案。

一、为什么选择 Docker?

在深入安装细节之前,我们先简单回顾一下 Docker 的核心优势:

  • 环境一致性:确保开发、测试和生产环境拥有一致的运行环境,彻底告别“在我机器上能跑”的尴尬。
  • 快速部署与扩展:秒级启动容器,轻松实现应用的弹性伸缩。
  • 资源隔离与高效利用:容器共享宿主机内核,相比虚拟机更轻量、资源占用更少。
  • 简化依赖管理:将所有依赖打包进一个镜像,简化了复杂应用的部署过程。

二、安装前的准备工作

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

  1. 64位操作系统:Docker 官方不再支持 32 位系统。
  2. Linux 内核版本:建议使用 3.10 或更高版本。你可以通过 uname -r 命令查看当前内核版本。
  3. 移除旧版本:如果系统上曾安装过旧版本的 Docker(如 docker, docker.io, docker-engine),建议先彻底卸载它们,以免产生冲突。

bash
sudo apt-get remove docker docker-engine docker.io containerd runc
# 或者在 CentOS/RHEL 上
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

三、Docker 标准安装流程

官方推荐使用 Docker 的官方软件仓库进行安装,这样可以确保你获得最新的稳定版本,并且易于后续的更新和维护。

1. 针对 Debian / Ubuntu 系统

步骤一:设置 Docker 的 APT 仓库

“`bash

1. 更新 apt 包索引并安装必要的工具,以允许 apt 通过 HTTPS 使用仓库

sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release

2. 添加 Docker 的官方 GPG 密钥

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg

3. 设置稳定版的仓库

echo \
“deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
“`

步骤二:安装 Docker 引擎

“`bash

1. 再次更新 apt 包索引

sudo apt-get update

2. 安装最新版本的 Docker Engine, containerd 和 Docker Compose

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
“`

2. 针对 CentOS / RHEL / Fedora 系统

步骤一:设置 Docker 的 YUM 仓库

“`bash

1. 安装 yum-utils 包,它提供了 yum-config-manager 工具

sudo yum install -y yum-utils

2. 设置 Docker 仓库

sudo yum-config-manager \
–add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
“`

步骤二:安装 Docker 引擎

“`bash

安装最新版本的 Docker Engine, containerd 和 Docker Compose

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

3. 验证安装

安装完成后,启动 Docker 服务并进行验证。

“`bash

启动 Docker

sudo systemctl start docker

设置开机自启

sudo systemctl enable docker

运行 hello-world 镜像来验证 Docker 是否正确安装

sudo docker run hello-world
“`

当你看到终端输出 “Hello from Docker!” 的欢迎信息时,恭喜你,Docker 已经成功安装并运行!

四、常见问题与解决方案

即使严格按照官方文档操作,也可能遇到各种问题。下面是一些最常见的“拦路虎”及其解决方法。

问题一:permission denied while trying to connect to the Docker daemon socket

原因分析:这是最常见的问题。默认情况下,Docker 守护进程绑定的是一个 Unix 套接字(/var/run/docker.sock),而不是 TCP 端口。这个套接字的所有者是 root 用户,并且其他用户只能通过 sudo 来访问。

解决方案:将当前用户添加到 docker 用户组,这样就无需每次都输入 sudo 了。

“`bash

1. 创建 docker 用户组(如果尚不存在)

sudo groupadd docker

2. 将当前用户添加到 docker 组

注意:${USER} 是一个环境变量,它会自动替换为你的用户名

sudo usermod -aG docker ${USER}

3. 重新登录或重启系统以使用户组更改生效

最简单的方式是执行 newgrp 命令,立即应用新的组权限

newgrp docker
``
执行完上述命令后,你就可以直接使用
docker ps等命令,而无需sudo`。

问题二:Docker 服务启动失败

原因分析
* 端口冲突:Docker 默认使用的网络地址可能与现有网络配置冲突。
* 内核或存储驱动问题:系统内核版本过低,或所选的存储驱动(如 overlay2)与当前内核不兼容。
* 配置文件错误/etc/docker/daemon.json 文件中存在语法错误。

解决方案
1. 检查日志:使用 journalctl -u docker.servicecat /var/log/syslog | grep dockerd 查看详细的错误日志,定位问题根源。
2. 检查内核版本:确保内核版本不低于 3.10。对于生产环境,推荐使用最新的稳定版内核。
3. 检查 daemon.json:确认该 JSON 文件格式正确。可以先尝试将其重命名(备份),然后重启 Docker 服务,看是否能正常启动。
4. 手动指定存储驱动:如果日志显示存储驱动有问题,可以尝试在 /etc/docker/daemon.json 中显式指定一个受支持的驱动,例如:
json
{
"storage-driver": "overlay2"
}

然后重启 Docker 服务:sudo systemctl restart docker

问题三:容器无法访问外部网络

原因分析
* DNS 解析问题:Docker 容器默认继承宿主机的 DNS 配置(/etc/resolv.conf)。如果宿主机 DNS 有问题,容器也无法解析域名。
* 防火墙策略:系统的防火墙(如 firewalld, iptables, ufw)可能阻止了 Docker 的网络转发。
* IP 转发被禁用:Linux 内核的 IP 转发功能未开启。

解决方案
1. 开启 IP 转发
bash
# 检查是否开启
sysctl net.ipv4.ip_forward
# 如果结果是 net.ipv4.ip_forward = 0,则需要开启
sudo sysctl -w net.ipv4.ip_forward=1
# 永久生效,编辑 /etc/sysctl.conf 文件,添加或修改
# net.ipv4.ip_forward = 1

2. 配置防火墙
* firewalldfirewalld 在 CentOS/RHEL 上很常见。Docker 通常能自动处理 firewalld 规则,但如果遇到问题,可以尝试将 Docker 的网络接口(默认为 docker0)加入到 trusted 区域。
bash
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --reload

* iptables:确保 FORWARD 链的默认策略不是 DROP。Docker 会自动添加 DOCKER-USERDOCKER 链来管理流量,通常无需手动干预。
3. 为 Docker 指定 DNS:如果只是 DNS 解析问题,可以在 /etc/docker/daemon.json 中为所有容器配置固定的 DNS 服务器。
json
{
"dns": ["8.8.8.8", "114.114.114.114"]
}

修改后重启 Docker 服务。

问题四:GPG error: ... InRelease: The following signatures were invalid

原因分析:在执行 apt-get update 时,系统无法验证 Docker 仓库的 GPG 签名。这通常是因为 GPG 密钥已过期、被篡改或网络问题导致下载不完整。

解决方案:重新导入 Docker 的官方 GPG 密钥。可以参照上文“安装流程”中的“步骤一:设置 Docker 的 APT 仓库”部分,重新执行添加 GPG 密钥的命令。

五、总结

成功安装 Docker 是迈向容器化世界的第一步。虽然过程中可能会遇到一些障碍,但只要我们理解其背后的原理,并学会通过查看日志来定位问题,大部分困难都能迎刃而解。

核心要点回顾
* 始终优先使用官方软件仓库进行安装。
* 遇到 permission denied,第一时间想到将用户加入 docker 用户组
* 服务无法启动或网络不通,检查日志 (journalctl) 是你的最佳帮手。
* 确保内核 IP 转发已开启,并正确配置了防火墙

希望这篇文章能帮助你顺利搞定 Linux 环境下的 Docker 安装,开启高效、愉快的容器化之旅。


滚动至顶部