如果访问 Docker 官方 registry 慢,有这些办法:
- 使用国内的 Docker Hub 镜像
- 使 Docker daemon 走 HTTP 代理
使用国内的 Docker Hub 镜像
由于 Docker Hub 镜像服务非常烧带宽和流量(也就是非常烧钱),各厂商并不愿意免费对公众提供这类服务。很多厂商一开始提供,但是后面服务慢慢劣化或者不再对公众提供,比如 Azure 只允许自己机房的 IP 访问,Docker CN 提供的不再可用,七牛也要下架它的镜像服务。
目前推荐使用的是阿里云的服务。阿里云的镜像服务地址并不是公开的,需要用户注册成为阿里云用户,登陆到它的容器镜像服务的 控制台 去开启,然后会生成一个专属的镜像地址。我的地址放在了 Enpass 中。
不推荐使用的:
应用上国内源有几个办法:
- 修改 Docker daemon 配置文件
- 修改 Dockerfile / 部署配置中的镜像地址为国内源
修改 Docker daemon 配置文件
对于使用 systemd Linux 发行版,在配置文件 /etc/docker/daemon.json
中加入:
{
"registry-mirrors": ["https://<id>.mirror.aliyuncs.com"]
}
其他 Linux 发行版及 Windows、macOS 看 USTC 维护的 文档。
对于 Minikube,参考这个 issue:
minikube ssh
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<id>.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
还可以使用阿里云修改过的 minikube,会把默认的 registry 设成阿里云的镜像,参考 这个说明。
修改 Dockerfile / 部署配置中的镜像地址为国内源
对于 Dockerfile,可以把:FROM python:3
改为 FROM <id>.mirror.aliyuncs.com/library/python:3
。
在各种部署配置中(比如 Kubernetes 的 deployment)定义的 image,也可以改成国内镜像的 image 地址。比如:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: details-v1
spec:
template:
metadata:
labels:
app: details
version: v1
spec:
containers:
- name: python
image: python:3
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
可以把其中的 image
,从 python:3
改为 <id>.mirror.aliyuncs.com/library/python:3
。
使 Docker daemon 走 HTTP 代理
Docker daemon 会 respect HTTP_PROXY
, HTTPS_PROXY
及 NO_PROXY
环境变量。你需要在 daemon 启动时设置它们。对于 systemd 启动的 Docker daemon,参考 Docker 官方文档,通过 systemd 的 service 文件将环境变量设置好。
对于 minikube,启动时通过 --docker-env
传 http_proxy
https_proxy
环境变量进去,但是要注意网络访问的连通性,参考 这里。
其他流行 registry 的国内镜像
除了 Docker Hub 之外,还有一些流行的 Docker registry 服务:
- gcr.io:Google 的服务。Istio 框架托管在这上面;k8s 的一些组件也托管在上面
- quay.io:未调研
- mcr.microsoft.com:未调研
这些 registry 有些访问慢、有些被墙。日常可能会用到的是 gcr.io,中科大有提供 反代,但不一定稳定。使用方法是修改镜像地址:
原地址 | 修改后 |
---|---|
gcr.io/xxx/yyy:zzz | gcr.mirrors.ustc.edu.cn/xxx/yyy:zzz |
k8s.gcr.io/xxx:yyy | gcr.mirrors.ustc.edu.cn/google-containers/xxx:yyy |