在CentOS 8/Stream上完美部署Docker的终极指南

当你第一次在CentOS 8或CentOS Stream上安装Docker时,可能会遇到各种令人头疼的问题,尤其是那个著名的"Error creating default 'bridge' network"错误。作为一名长期在Linux环境下工作的开发者,我完全理解这种挫败感——你按照官方文档一步步操作,结果却在最后一步卡住,看着红色的错误信息不知所措。

这个问题在新版CentOS上尤为常见,主要是因为系统从传统的iptables转向了nftables,而Docker的网络组件还没有完全适应这种变化。更复杂的是,CentOS 8默认启用的firewalld服务与Docker的网络配置也存在兼容性问题。不过别担心,经过多次实践和调试,我总结出了一套完整的解决方案,能够让你一次性搞定所有问题。

1. 系统准备与环境检查

在开始安装Docker之前,我们需要确保系统环境完全符合要求。CentOS 8/Stream虽然是最新的稳定版本,但某些默认配置可能需要调整。

首先,检查你的系统版本:

cat /etc/redhat-release
uname -r

CentOS 8/Stream应该运行在Linux内核4.18或更高版本上。如果你的系统是全新安装的,建议先进行基础更新:

sudo dnf update -y
sudo reboot

关键注意事项

  • 确保系统是64位架构
  • 内核版本不低于4.18
  • 系统已安装基本开发工具

接下来,我们需要处理一个常见障碍——SELinux。虽然SELinux提供了强大的安全保护,但它经常与Docker产生冲突。对于开发环境,我们可以将其设置为宽容模式:

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

2. 安装Docker及其依赖

CentOS 8默认的软件仓库不包含Docker,我们需要先添加Docker的官方仓库。这里有一个小技巧:使用国内镜像源可以显著提高下载速度。

sudo dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装必要的依赖包:

sudo dnf install -y device-mapper-persistent-data lvm2 containerd.io

现在可以安装Docker CE了:

sudo dnf install -y docker-ce docker-ce-cli

安装完成后,不要立即启动服务,我们需要先进行一些关键配置。这是避免"bridge网络创建失败"错误的关键步骤。

3. 解决网络与防火墙冲突

CentOS 8的网络栈变化是导致Docker网络问题的主要原因。我们需要调整几个关键配置来确保兼容性。

首先,创建或编辑Docker的daemon.json配置文件:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "iptables": false
}
EOF

重要参数说明

  • iptables: false:禁用Docker自带的iptables管理
  • native.cgroupdriver=systemd:使用systemd作为cgroup驱动
  • storage-driver: overlay2:指定存储驱动

接下来,我们需要配置firewalld以允许Docker网络正常工作:

sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --permanent --zone=trusted --add-port=2376/tcp
sudo firewall-cmd --permanent --zone=trusted --add-port=2377/tcp
sudo firewall-cmd --permanent --zone=trusted --add-port=7946/tcp
sudo firewall-cmd --permanent --zone=trusted --add-port=7946/udp
sudo firewall-cmd --permanent --zone=trusted --add-port=4789/udp
sudo firewall-cmd --reload

4. 启动Docker并验证安装

现在,我们可以安全地启动Docker服务了:

sudo systemctl enable docker
sudo systemctl start docker

验证Docker是否正常运行:

sudo docker run hello-world

如果一切顺利,你应该能看到Hello World的消息。但如果你仍然遇到"bridge网络创建失败"的错误,我们还有最后的解决方案。

5. 高级故障排除技巧

对于顽固的网络问题,我们需要深入检查几个关键点。

首先,检查内核模块是否加载:

lsmod | grep br_netfilter

如果没有输出,需要手动加载模块:

sudo modprobe br_netfilter

确保系统启动时自动加载:

echo "br_netfilter" | sudo tee /etc/modules-load.d/br_netfilter.conf

另一个常见问题是cgroup v2的兼容性。检查你的系统使用的cgroup版本:

stat -fc %T /sys/fs/cgroup/

如果显示"cgroup2fs",说明你正在使用cgroup v2,这可能导致某些Docker功能异常。可以切换到cgroup v1:

sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo reboot

6. 生产环境优化建议

对于需要长期稳定运行的生产环境,我建议进行以下优化配置。

编辑/etc/docker/daemon.json,添加以下内容:

{
  "live-restore": true,
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65536,
      "Soft": 65536
    }
  },
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

然后重新加载Docker配置:

sudo systemctl daemon-reload
sudo systemctl restart docker

性能调优参数对比

参数默认值推荐值说明
storage-driveroverlay2overlay2存储驱动
log-driverjson-filejson-file日志驱动
log-opts.max-size-100m单个日志文件最大尺寸
live-restorefalsetrue允许容器在Docker重启时保持运行

7. 日常维护与管理

为了保持Docker环境的健康运行,建议定期执行以下维护任务。

清理无用资源:

docker system prune -f

查看Docker磁盘使用情况:

docker system df

更新Docker及其组件:

sudo dnf update docker-ce docker-ce-cli containerd.io

监控Docker日志:

sudo journalctl -u docker -f

记住,每次修改/etc/docker/daemon.json后,都需要重新加载服务:

sudo systemctl reload docker

经过这些步骤,你的CentOS 8/Stream系统应该能够完美运行Docker了。我在多个生产环境中使用这套配置,稳定性得到了充分验证。如果遇到特殊问题,Docker的日志和系统日志通常是排查问题的第一手资料。

更多推荐