给 Systemd 下的 Docker 添加 HTTP 代理

目的

写这篇文章的目的主要是为了帮助解决 Docker pull 主仓库(Docker-Hub)的镜像的网络问题。在国内的几乎是很难直接拉取的成功的(至少在我这边是如此),通常最后的结果都是超时。毕竟 Docker Hub 官方在国内是没有服务器的。
如果想在国内想正常使用 pull 功能拉去官方仓库的镜像,就需要给 Dokcer 设置网络代理了。
注意:这里的网络代理是指的给 Docker 的部分功能例如 pull 设置代理,并非给容器代理网络。

方式1:直接设置变量

这种方法其实早就已经行不通了,因为对于大部分系统现在都不支持了。如果你是旧系统:例如 CentOS 6、Ubuntu 14 之类的仍然是可以的。方式很简单:

假若你是 CentOS 系统,Docker 的配置文件在 /etc/sysconfig/docker 位置,编辑它,加上:

HTTP_PROXY=http://localhost:8118
          HTTPS_PROXY=$HTTP_PROXY
          export HTTP_PROXY HTTPS_PROXY
          

上面两个环境变量,重启 Dokcer 服务即可。但是假若你是 Ubuntu 15 或以上以及 CentOS 7 等 Systemd 作为 init 程序的系统,那么这样是无效的。如果是 OpenRC、SysV、UpStart 则是可行的。

方式2:Systemd 下的配置

这才是本文的主要目的,想让 Systemd 作为 init 管理后台服务的系统正确的配置 Docker 网络代理功能,需要单独配置服务的环境信息。而不是简单设置几个变量。

首先,创建 /etc/systemd/system/docker.service.d 目录,进入该目录并且创建配置文件(名字随意,但要以 .conf 后缀): http-proxy.conf,内容如下:

[Service]
          Environment="HTTP_PROXY=http://localhost:8118" "NO_PROXY=localhost,127.0.0.1"
          

上面配置的意义显而易见,就是网络代理地址和不代理主机地址。这个配置文件存在的意义储存就是 docker 服务的环境配置细节(flag 和变量)。

重载守护进程:

sudo systemctl daemon-reload
          

检查是否加载配置细节:

systemctl show --property=Environment docker
          

如果出现 .conf 中的配置,则成功。最后重启 Docker 服务即可,下次 pull 网络会自动走代理。

最后

需要提一下,其实国内有些公司也开放一些自家的仓库。但是我接触 Docker 非常早,早已习惯了 Docker Hub 上丰富的资源和更新频率。如果是一些常用的例如:MySql、Redis 之类的其实国内的仓库足够了,但是找很多不那么大众的软件、版本更新的或者强迫症就是得用标记为 official 的镜像等情况,建议依然使用官方仓库。