Docker apt-get update 太慢换国内源

FreeGuideOnline 最新 2026-07-04

bash CODENAME=$(cat /etc/os-release | grep VERSION_CODENAME | cut -d= -f2) echo $CODENAME


### 1.2 备份原有源文件
无论是永久替换还是临时替换,养成备份习惯可以随时恢复:
```bash
cp /etc/apt/sources.list /etc/apt/sources.list.bak

第二部分:在 Dockerfile 中永久换源(推荐用于构建镜像)

如果你正在编写 Dockerfile,最好在 RUN apt-get update 之前就把源换成国内镜像,这样后续所有的 apt install 都会飞快。

2.1 使用 sed 命令直接替换(通用方式)

下面以 Debian 系统为例,把默认源替换为中科大镜像(可自由替换为其他国内源):

FROM debian:bullseye

# 换成中科大 Debian 源
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y your-packages

对于 Ubuntu:

FROM ubuntu:22.04

# 换成阿里云 Ubuntu 源
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y your-packages

sed 命令就是把原域名替换成国内镜像站的域名,安全且不改变源文件的其他结构。

2.2 完整写入新的 sources.list 文件

如果你想要更精确的控制,可以直接覆盖整个文件。提前写好对应版本的源配置。

Debian 12 (bookworm) 阿里云源示例:

FROM debian:bookworm

RUN echo "deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free" > /etc/apt/sources.list && \
    echo "deb https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.aliyun.com/debian-security/ bookworm-security main contrib non-free" >> /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y ...

Ubuntu 22.04 (jammy) 清华源示例:

FROM ubuntu:22.04

RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y ...

2.3 使用 --build-arg 灵活切换

你还可以在 Dockerfile 中使用 ARG 来传递域名,方便不修改 Dockerfile 的情况下切换源:

ARG APT_MIRROR="mirrors.aliyun.com"
FROM debian:bookworm

RUN sed -i "s/deb.debian.org/${APT_MIRROR}/g" /etc/apt/sources.list && \
    apt-get update && ...

构建时指定:

docker build --build-arg APT_MIRROR=mirrors.tuna.tsinghua.edu.cn -t myimage .

第三部分:在运行中的容器中临时换源

如果你正在调试一个容器,或者临时需要进去安装软件,可以直接在容器内部修改源。

3.1 快速替换命令(一行搞定)

进入容器后执行(根据实际版本调整域名):

# Debian 系统
sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
apt update

# Ubuntu 系统
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
apt update

如果是基于 Debian 但使用 security.debian.org 的,也需要替换:

sed -i 's/security.debian.org/mirrors.ustc.edu.cn\/debian-security/g' /etc/apt/sources.list

3.2 手动编辑确认细节

如果环境特殊,建议手动编辑:

vi /etc/apt/sources.list
# 或使用 nano(如果没有可以 apt install nano 前换源临时用 vi )

清空内容后粘贴国内源地址,保存退出再 apt update

3.3 使用脚本一键配置

可以写一个简单的脚本 change-apt-source.sh

#!/bin/bash
if [ -f /etc/os-release ]; then
    . /etc/os-release
    case "$ID" in
        debian)
            sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
            ;;
        ubuntu)
            sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
            ;;
    esac
    apt update
else
    echo "Unsupported system"
fi

第四部分:国内主流镜像站推荐

你可以根据速度、稳定性选择。下面列出常用镜像站及对应的替换域名(Debian 和 Ubuntu 通用方案):

镜像站 Debian 替换域名 Ubuntu 替换域名
阿里云 mirrors.aliyun.com mirrors.aliyun.com
清华大学 mirrors.tuna.tsinghua.edu.cn mirrors.tuna.tsinghua.edu.cn
中科大 mirrors.ustc.edu.cn mirrors.ustc.edu.cn
网易 mirrors.163.com mirrors.163.com
华为云 mirror.huaweicloud.com mirror.huaweicloud.com

注意:部分镜像站的 security 源路径略有不同,例如中科大的 Debian security 源是 mirrors.ustc.edu.cn/debian-security,直接替换 security.debian.org 时需要补全路径,上面的 sed 命令已经给出示例。

第五部分:验证换源后的速度

换源完成后,清除缓存并重新更新,观察下载速度:

apt clean
apt update

正常情况下,你应该能看到几十 MB/s 的下载速度(取决于你的宽带),而非之前的几 KB/s。

第六部分:常见问题与排错

Q1: 替换后仍提示 Unable to connect to ... 或超时?

  • 检查容器网络是否正常:ping mirrors.aliyun.com
  • 如果容器无法解析域名,可能是 DNS 问题,在 Docker 启动时添加 DNS:--dns 114.114.114.114
  • 确认镜像站域名书写正确,没有多余空格

Q2: sed 替换没有生效?

  • 查看原文件内容:cat /etc/apt/sources.list,确认原始域名是哪个(可能是 httpredir.debian.orgdeb.debian.org 等),针对性替换
  • 有的镜像默认使用 deb.debian.org,但主动重定向,可直接替换为 mirrors.aliyun.com

Q3: 构建镜像时换源失败,提示 sed: not found

  • 基础镜像可能极简(如 debian:stable-slim),里面没有 sed。此时可以直接用 echo 写入新源,或者先 apt-get update && apt-get install -y sed ca-certificates,不过这样第一次更新还是会慢。建议直接用写入方式覆盖源文件

Q4: 安全更新源(security)如何处理?

Ubuntu 安全源一般直接使用对应的安全域名 security.ubuntu.com,国内镜像站也已同步,通常替换主源的同时也会替换安全源,注意保持路径一致。

例如阿里云 Ubuntu 的安全源是:

deb http://mirrors.aliyun.com/ubuntu jammy-security main restricted universe multiverse