自建 docker 镜像服务

由于众所众知的原因,docker pull 在国内不好使。在开发环境会影响工作学习,在生产环境会影响产品部署。

国内有一些服务商提供了 Docker 镜像服务,但出于供应链安全的考虑,我不建议使用第三方服务。好在 Docker 官方提供了搭建镜像服务的工具,自己也可以很方便的搭建一个镜像服务。下面来看如何实现。

准备服务器

准备一台境外服务器,需要能在国内直接访问,云服务商不限。

在服务器上安装 docker

启动镜像服务

为了方便管理配置,这里使用 docker compose。

在服务器上新建文件 compose.yml,内容为:

services:
  registry:
    restart: always
    image: registry:2
    ports:
      - 5000:5000
    environment:
      REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io

    volumes:
      - /data/registry:/var/lib/registry

其中 REGISTRY_PROXY_REMOTEURL 将 docker 官方 registry 设为上游源,当本地没有找到对应镜像时,会从上游源拉取并缓存镜像。

如果你需要拉取私有源,那么还要设置 REGISTRY_PROXY_USERNAMEREGISTRY_PROXY_PASSWORD,更多配置可参考官方文档

volumes 部分则设置了数据存储目录,根据你的数据盘路径不同需要自行修改。

编辑完成后,执行 docker compose up -d 启动服务。

用 caddy 提供 web 服务

docker registry 镜像本身可以提供 TLS 和身份验证等功能,但由于我对 caddy 更熟悉,所以选择使用 caddy 提供 web 服务。

首先安装 caddy server,然后在 Caddyfile 中添加配置:

registry-mirror.example.com {
  # IP 白名单
  @denied not remote_ip xx.xx.xx.xx 
  abort @denied

  reverse_proxy localhost:5000
}

由于我不打算提供公众服务,所以增加了 IP 白名单限制。如果不作限制,小心流量费爆表!

不要忘了在 DNS 添加你的域名记录。

配置完成后重启 caddy 服务。

部署服务器配置

在需要拉取镜像的部署服务器上,添加配置 /etc/docker/daemon.json

{
  "registry-mirrors": ["https://registry-mirror.example.com"]
}

保存后重启 docker 服务:

systemctl restart docker

现在测试 docker pull <image> ,顺利的话就可以正常 pull 镜像了。

1
所有评论 3
avatar

原来自建 Docker 镜像这么简单,我用 Nexus3 自建老麻烦了

avatar

谢谢,Great

1