☰
解决Docker安装卡顿:Ansible优化与镜像源选择
2026/11/3 6:47:22 网站建设 项目流程

1. 问题现象与背景

那天我正在为公司的Kubernetes集群部署Docker环境,使用的是Ansible自动化工具。按照常规操作,我编写了一个标准的playbook来安装Docker CE。脚本的前两个任务(安装dnf-utils和下载docker-ce.repo)都顺利完成了,但到了关键的"Install Docker packages"这一步,终端突然就卡住了,没有任何输出,也没有报错信息。

提示:在Linux系统中,软件包管理器(如dnf/yum)卡住时,不要立即中断,先检查系统进程状态。

我最初以为是服务器网络断了,或者yum/dnf被锁了。于是做了以下检查:

  1. 使用ps aux | grep dnf查看是否有dnf进程在运行
  2. 检查/var/run/dnf.pid锁文件是否存在
  3. 直接登录到目标节点手动执行安装命令

奇怪的是,所有这些检查都显示系统状态正常,只是网络连接速度极慢。更诡异的是,当我接完一个电话回来,重新运行同样的playbook时,安装过程竟然顺利完成了!

2. 深入排查过程

2.1 网络连接诊断

为了彻底弄清楚原因,我决定进行更深入的网络诊断。首先使用curl测试Docker官方源的连接速度:

curl -o /dev/null -s -w "DNS解析: %{time_namelookup}s\n连接建立: %{time_connect}s\n首字节到达: %{time_starttransfer}s\n总时间: %{time_total}s\n" https://download.docker.com

测试结果显示DNS解析时间正常(约0.2s),但首字节到达时间长达15秒,下载速度只有几十KB/s。这说明问题确实出在网络连接上。

2.2 软件源对比测试

为了验证是否是源的问题,我设置了三个不同的测试组:

  1. 官方源(download.docker.com)
  2. 阿里云镜像源
  3. 清华大学镜像源

使用相同的playbook分别测试,结果如下:

源类型平均下载速度成功率安装耗时
官方源50KB/s70%8-15分钟
阿里云镜像2MB/s100%1-2分钟
清华镜像1.8MB/s100%1-3分钟

这个测试清楚地表明,国内镜像源在速度和稳定性上都有显著优势。

3. 问题根本原因分析

结合排查过程和测试数据,可以确定问题的根本原因:

  1. 网络波动导致:第一次执行时,恰逢国际网络连接不稳定,导致从Docker官方源下载包时速度极慢,看起来像是卡死
  2. 缓存机制影响:第一次执行虽然被中断,但update_cache: yes已经触发了元数据更新,第二次执行时无需再次更新缓存
  3. 网络自动恢复:在等待期间,网络连接质量自行改善,使得第二次执行时下载能够完成

4. 完整优化方案

4.1 推荐使用的Ansible Playbook

基于这次经验,我优化了原始的playbook,增加了以下改进:

- name: Install Docker Engine with robust configuration hosts: all become: true vars: docker_mirror: "https://mirrors.aliyun.com/docker-ce" docker_gpgkey: "https://mirrors.aliyun.com/docker-ce/linux/centos/gpg" tasks: - name: Install prerequisite packages ansible.builtin.dnf: name: - yum-utils - device-mapper-persistent-data - lvm2 state: present - name: Configure Docker CE repository (Aliyun mirror) ansible.builtin.copy: content: | [docker-ce-stable] name=Docker CE Stable - $basearch baseurl={{ docker_mirror }}/linux/centos/$releasever/$basearch/stable enabled=1 gpgcheck=1 gpgkey={{ docker_gpgkey }} dest: /etc/yum.repos.d/docker-ce.repo mode: '0644' - name: Clean expired metadata ansible.builtin.command: dnf clean all - name: Install Docker packages with retry ansible.builtin.dnf: name: - docker-ce-20.10.17 - docker-ce-cli-20.10.17 - containerd.io-1.6.6 state: present disable_gpg_check: no update_cache: yes register: docker_install until: docker_install is succeeded retries: 3 delay: 10 - name: Configure Docker daemon ansible.builtin.copy: content: | { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "storage-driver": "overlay2", "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"] } dest: /etc/docker/daemon.json mode: '0644' - name: Start and enable Docker service ansible.builtin.systemd: name: docker state: started enabled: yes daemon_reload: yes

4.2 关键优化点说明

  1. 使用国内镜像源:替换为阿里云镜像,显著提高下载速度
  2. 版本锁定:明确指定Docker和containerd版本,避免兼容性问题
  3. 重试机制:添加until-retries循环,自动重试失败的安装
  4. 完整配置:包含daemon.json配置,优化Docker运行时参数
  5. 镜像加速:配置国内registry mirror,加速镜像拉取

5. 高级排查技巧

5.1 网络问题深度诊断

当遇到类似问题时,可以使用以下命令进行更深入的诊断:

# 检查到目标域名的路由 traceroute download.docker.com # 测试TCP连接建立时间 tcping download.docker.com 443 # 监控DNS解析 dig download.docker.com +trace # 检查MTU设置 ping -M do -s 1472 download.docker.com

5.2 DNF/Yum调试技巧

启用详细日志可以帮助定位包管理器的问题:

# 在Ansible任务中添加debug参数 - name: Install Docker packages with debug ansible.builtin.dnf: name: docker-ce state: present debuglevel: 2

或者在目标节点上手动运行:

sudo dnf --verbose install docker-ce

6. 生产环境最佳实践

基于多次部署经验,总结以下生产环境建议:

  1. 版本控制:始终锁定Docker和containerd的特定版本
  2. 离线安装:在内网环境准备本地仓库或离线安装包
  3. 健康检查:部署后自动验证Docker功能
  4. 监控配置:配置Prometheus监控Docker daemon
  5. 内核调优:根据负载调整内核参数

示例健康检查任务:

- name: Verify Docker installation hosts: all become: true tasks: - name: Run test container ansible.builtin.command: docker run --rm hello-world register: docker_test changed_when: false - name: Fail if test failed ansible.builtin.fail: msg: "Docker test failed" when: docker_test.rc != 0

7. 经验总结与教训

这次"自愈"经历让我深刻认识到基础设施部署中几个关键点:

  1. 网络可靠性:国内访问国外源存在不确定性,必须准备备用方案
  2. 操作耐心:系统管理需要更多耐心,过早中断可能错过问题自愈
  3. 完整监控:部署过程应该包含完善的日志和监控
  4. 重试机制:自动化脚本必须考虑网络波动等临时性问题
  5. 版本控制:生产环境必须锁定组件版本

最关键的教训是:在基础设施自动化中,不能依赖"运气",而要通过完善的配置和健壮的脚本来保证可靠性。这次虽然问题自行解决了,但在生产环境中,我们必须做到100%可控。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询