背景
- 场景:
docker.io
网络访问不通畅,服务器难以拉取镜像- 多个服务器拉取相同镜像时,外网连接负载较重
- 目的:
- 当存在能够访问
docker.io
的客户端时,可通过该客户端上传镜像至内网仓库,回避网络问题 - 通过搭建内网docker仓库,令服务器直接从内网拉取镜像,缓解外网负载
- 当存在能够访问
- 条件:
- 能够获取
Registry
镜像 - 可选:具有Nginx服务,具有内网域名,具有内网域名对应的SSL证书
- 能够获取
准备
- 若具有Nginx服务,具有内网域名,具有内网域名对应的SSL证书,则可进一步优化使用方式:
- 在Nginx中新建转发服务,
<自定义分配的url>
指向<服务器端ip>:<Registry端口号>
- 配置对应的SSL
- 将签发该证书的CA证书添加至客户端
/etc/docker/certs.d/<自定义分配的url>/ca.crt
- 在Nginx中新建转发服务,
- 若不具有SSL证书且无法解决http安全问题,则在客户端修改
/etc/docker/daemon.json
,添加如下内容
{"insecure-registries": ["<服务器端ip>:<Registry端口号>"]
}
- 重启docker
执行
- 服务器端
docker-compose.yml
配置如下
version: '3'services:registry-docker:image: registry:2restart: unless-stoppedenvironment:REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io#REGISTRY_PROXY_USERNAME: <dockerhub username>#REGISTRY_PROXY_PASSWORD: <dockerhub password>REGISTRY_STORAGE_DELETE_ENABLED: "true"REGISTRY_HTTP_SECRET: "<通过openssl rand -hex 32生成的随机密钥>"# 每个客户端都需要认证才能访问#REGISTRY_AUTH: htpasswd#REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm#REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswdports:- 5000:5000volumes:- <Registry的数据目录>:/var/lib/registry#- <Registry的认证文件目录>:/auth # 挂载认证文件
- 备注:
- 如果认为该服务可能受到恶意攻击,可以启用Registry的认证配置
- 取消掉
docker-compose.yml
中关于认证的注释 - 服务器端需执行
docker run --rm --entrypoint htpasswd httpd:2 -Bbn <username> <password> >> /path/to/registry/auth/htpasswd
- 将客户端的认证文件添加至服务器端
- 客户端的docker在进行pull前,需要先进行登录:
docker login <自定义分配的url>
,输入账号密码 - 除非执行
docker logout
,否则会一直登录
- 取消掉
- 如果认为该服务可能受到恶意攻击,可以启用Registry的认证配置
测试
在客户端进行测试
# 拉取测试镜像并打标签
docker pull hello-world
docker tag hello-world <服务器ip>:<Registry端口>/my-hello-world# 尝试推送至服务器端的Registry
# 不进行Nginx转发时,执行这一行,会出现http安全问题
docker push <服务器ip>:<Registry端口>/my-hello-world
# 进行Nginx转发时,执行这一行
docker push <自定义分配的url>/my-hello-world# 删除本地镜像
docker rmi <服务器端ip>:<Registry端口号>/my-hello-world
docker rmi hello-world# 尝试从服务器端拉取镜像
# 不进行Nginx转发时,执行这一行
docker pull <服务器ip>:<Registry端口>/my-hello-world
# 进行Nginx转发时,执行这一行
docker pull <自定义分配的url>/my-hello-world
Registry的API
- 查询镜像目录:
curl -u <username>:<passwd> -X GET <自定义分配的url>/v2/_catalog
- 查询指定镜像的版本:
curl -u <username>:<passwd> -X GET <自定义分配的url>/v2/<image>/tags/list
参考
https://bitseqtech.com/archives/a12w1Mbg