Ubuntu 上 Docker 的配置及代理

Ubuntu 上 Docker 的配置及代理

前言

真的感觉有很久没有写过博客了,距离上一次发博客居然都已经过去快 5 年了。

  • 重新想起发一篇博客主要是因为最近忙着给香橙派配置 Docker 以及拉取镜像时的代理(众所周知因为魔法的原因国内的镜像站貌似都不能用了,Docker 的拉取又是走的自己后台的 dockerd 守护进程执行的,所以给终端配置代理也没作用,所以只能给 Docker 守护进程单独配置代理),踩了不少坑而且感觉还怪麻烦的,所以想给未来的自己或者其他人记录一下。

Docker 的安装

对于 Ubuntu 甚至 Linux 来说,大多数软件都是通过 apt 来安装并且管理的。

1. 前置准备

如果之前安装过 Docker 的话得先卸载,避免冲突。可以去 Docker 官网找卸载的指令,或者直接运行:

sudo apt remove docker docker-engine docker.io containerd runc

如果之前没安装过就跳过这一步即可。

2. 导入 Docker 官方密钥

这一步主要是将 Docker 官方的密钥下载保存到 /usr/share/keyrings/docker-archive-keyring.gpg,防止下载的软件被恶意篡改。在终端运行:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

其中 curl 下载选项的含义是:

  • 不显示进度条、连接日志(-s),但如果遇到下载失败的情况,比如网络断了、链接失效,会明确输出错误(-S)。
  • 若链接返回 4xx/5xx 错误,直接返回失败状态(-f),不会把错误页面传给 gpg,避免 gpg 解析无效内容报错。
  • 若 Docker 官方的 GPG 密钥链接有重定向,自动跟随到最终地址(-L),确保下载到完整的密钥文件。

3. 配置 Docker 官方仓库

这一步是最重要的,因为要将 Docker 的官方仓库添加到 apt 的下载源中,从而保证能通过 apt 下载 Docker:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • signed-by=/usr/share/keyrings/docker-archive-keyring.gpg 就是刚刚导入的软件包签名验证密钥,如果没有这个密钥,apt 会提示签名无效,拒绝安装。
  • stable 的含义是仓库的分支,Docker 的仓库分 stable(稳定版)、edge(测试版)等,这里选稳定版。
  • sudo tee /etc/apt/sources.list.d/docker.list 的含义是写入配置文件。不用 sudo echo ... > 文件名 是因为 > 重定向是 shell 处理的,sudo 只给 echo 提权,不给 shell 提权,会提示权限不足,而 tee 是在 sudo 权限下执行,能正常写入系统目录。
  • /etc/apt/sources.list.d/docker.list 是目标配置文件路径,其中文件名必须以 .list 结尾并且放在 sources.list.d 文件夹下。因为 /etc/apt/sources.list 是主配置文件,里面是系统默认的软件源,比如 Ubuntu 官方的基础软件仓库。而 /etc/apt/sources.list.d/ 是扩展目录,用于存放自定义的软件源配置文件,所有 .list 后缀的文件都会被 apt 自动读取。

4. 安装 Docker

首先先更新 apt 索引:

sudo apt update

然后直接安装最新版 Docker 即可:

sudo apt install -y docker-ce docker-ce-cli containerd.io

5. 验证安装

运行官方的 hello-world 容器,测试 Docker 是否正常工作:

sudo docker run hello-world

若输出以下信息,说明安装成功:

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Docker 代理的配置

当我们执行 docker pull ... 想要去拉取镜像的时候会发现提示连接超时,这是因为一些不可言说的原因导致的。之前还能够通过国内的一些镜像站去拉取,但是 24 年 6 月之后国内比较大的镜像站都不能正常访问了,小的镜像站感觉稳定性一般,所以最终的方法就只有自己配置代理了。因为 Docker 的拉取是走的自己后台的 dockerd 守护进程,所以给终端配置代理也没作用,只能给 Docker 守护进程单独配置代理。

1. 创建 Docker 代理配置文件

Docker 的代理配置文件路径是 /etc/systemd/system/docker.service.d/proxy.conf。我当时配置的时候甚至连 system 文件夹都没有,但是没关系,自己创建对应的文件夹和文件就行了。

# 先创建目录(如果目录已经存在就不用了)
# -p 的作用是确保目标目录及其所有缺失的父目录都能被创建,且如果目录已存在也不会报错。
sudo mkdir -p /etc/systemd/system/docker.service.d

# 创建并编辑代理配置文件
sudo vim /etc/systemd/system/docker.service.d/proxy.conf

2. 写入代理配置

在打开的 proxy.conf 文件中,粘贴以下内容(代理地址和端口替换成自己的):

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
  • 替换说明:把 http://127.0.0.1:7890 改成实际代理地址。
  • 若代理需要认证(比如用户名:密码),格式是:http://用户名:密码@代理地址:端口(例:http://user:pass123@127.0.0.1:7890)。

3. 重启 Docker 服务,让代理配置生效

运行:

# 重新加载systemd配置(识别新的proxy.conf文件)
sudo systemctl daemon-reload

# 重启Docker守护进程
sudo systemctl restart docker

然后重新 docker pull 一下看是否生效。

4. 一点小坑

因为一开始懒得创建新的文件夹,所以有尝试过在 /etc/docker/daemon.json 文件里面直接配置 proxy 字段尝试代理。但是显而易见失败了,貌似是 Docker 最新版本不支持在 daemon.json 里面这样配置(我的 Docker 版本好像是 29.1.1),所以最好还是按照前文写的方法来吧。

posted @ 2025-11-30 19:55  pycr  阅读(3)  评论(0)    收藏  举报