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),所以最好还是按照前文写的方法来吧。

浙公网安备 33010602011771号