Docker apt-get update 太慢换国内源
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.org、deb.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