Docker 配置私有仓库
TIP
阿里云购买的 2 核 2GiB 的服务器,由于内存过小,构建比较大的镜像时机器就会卡死
可以通过在服务器配置私有仓库,本地打包再推送到私有仓库的形式
其实也可以本地打包镜像后,导出通过 rsync 等方式传到服务端,再由服务端的 docker daemon load 这个镜像文件。但这种方式没有推送 registry 快。如果镜像是 1g,每次都要推送 1g;而 registry 可以缓存 layer 提升后续的传输速度
1. 安装启动 Docker Registry
略
2. 测试 registry 服务是否正常
访问http://<ip>:<port>/v2/_catalog,一般会得到如下响应:
{
"repositories": []
}port默认是5000- 记得配置服务器的安全组开放该端口
3. 构建推送第一个镜像
构建 docker build -t <ip>:<port>/<image-name>,tag 的组成参见:Docker 入门 - 给镜像打 Tag
推送 docker push <ip>:<port>/<image-name>
此时访问http://<ip>:<port>/v2/_catalog,得到如下响应:
{
"repositories": ["<image-name>"]
}TIP
一开始推送,会报如下错误:
The push refers to repository [<ip>:<port>/<image-name>]
Get "https://<ip>:<port>/v2/": http: server gave HTTP response to HTTPS client需要配置daemon.json,将私有仓库的地址追加进insecure-registries中(非 https 访问的可视为不安全的地址)
"insecure-registries": [
"<ip>:<port>"
]4. 服务端运行镜像
提前做两个步骤:
- 1panel - 容器 - 仓库,配置私有仓库地址(主要指定协议和用户名、密码,这样拉取时就不需要询问)
- 1panel - 容器 - 配置 - 私有仓库,它对应
daemon.json中的insecure-registries
任意位置创建docker-compose.yaml文件,image指定为127.0.0.1:<port>/<image-name>,然后执行docker compose up
5. 加入用户认证
按照Deploy a registry server -> Native basic auth的前两条警示,要实现用户名和密码登录,必须先配置 TLS。因为不能以明文来传递这些数据
5.1 配置 TLS
根据Deploy a registry server -> Get a certificate的描述,我们需要做两步:
- 获得证书,即
.crt文件和.key文件 - 通过
docker run运行容器,主要传递REGISTRY_HTTP_TLS_CERTIFICATE、REGISTRY_HTTP_TLS_KEY这俩变量
这里参考使用 1panel 申请/续签 HTTPS 证书和使用 1panel 创建 HTTPS 服务做一个 https 代理即可。没有必要从 registry 层面配置
5.2 配置用户名、密码
前置条件:当前处于 docker registry 的编排目录/opt/1panel/apps/docker-registry/docker-registry

此时运行:
docker run \
--entrypoint htpasswd \
httpd:2 -Bbn testuser testpassword > auth/htpasswd生成一个auth文件夹,其下有个htpasswd文件,文件中有一个:用户名:testuser、密码:testpassword 的账号
这里不用docker run运行,而是编排的形式。因此参考Deploy your registry using a Compose file,对 registry 的 compose 文件增加如下内容:
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
volumes:
- ./auth:/auth- 由于把
auth目录创建在了和 compose 文件同级的目录下,所以 volume 的挂载路径就是./auth
重启 compose,此时访问https://<domain-name>/v2/_catalog就需要输入账号密码了
5.3 试试推送和拉取
直接运行docker push <domain-name>/<image-name>,会报no basic auth credentials的错误,此时只需要执行docker login <domain-name>,输入用户名、密码,即可登录成功。之后就能正常推送了
如果该 registry 服务是通过 openresty 或 nginx 代理的,推送的镜像某个 layer 过大会报:
413 Request Entity Too Large的错误,此时需要在 openresty 或 nginx 的配置文件中增加一行:
server {
client_max_body_size 1024M;
}对于服务器内部想要拉取镜像,先通过docker login 127.0.0.1:<port>登录,或是直接在 1panel -> 容器 -> 仓库 来配置用户名、密码
PS:不建议自签名证书方案
按照文档Test an insecure registry - Use self-signed certificates所述,你需要做:
- 首先通过
openssl生成一个自己的证书文件 - 重新运行 registry,指向证书文件
- 根据你的操作系统,配置 docker daemon 去信任该证书
- [可选]使用身份认证时,某些 Docker 还要求信任操作系统级别的证书
与其这样麻烦,在有域名的前提下,不如申请证书走正规配置,能省去 3、4 以及后续步骤
附:配置 registry
一种是部分配置,比如REGISTRY_AUTH、REGISTRY_AUTH_HTPASSWD_PATH
一种是全量覆盖配置
文档里都有详尽说明该如何配置
其它
也可以通过该方式实现镜像加速:https://www.wanpeng.life/2826.html