1.7 私有镜像仓库

1.7 私有镜像仓库 #

在离线环境里,可以自己搭建私有仓库。私有镜像仓库有很多现成的解决方案,最简单的是 Docker Registry,也有功能更完善的 CNCF Harbor。

1.7.1 registry #

可以在 Docker Hub 网站上搜索 “registry”,找到官方页面 https://registry.hub.docker.com/_/registry/

首先,需要使用 docker pull 命令拉取镜像:

docker pull registry

然后,需要做一个端口映射,对外暴露端口,这样 Docker Registry 才能提供服务。它的容器内端口是 5000,可以再容器外也使用同样的 5000 端口,运行命令是

docker run -d -p 5000:5000 registry :docker run -d -p 5000:5000 registry

启动 Docker Registry 之后,可以使用 docker ps 查看运行状态,可以看到它确实把本机的 5000 端口映射到了容器内的 5000 端口。

可以使用 docker tag 命令给镜像打标签再上传了。因为上传的目标不是默认的 Docker Hub,而是本地的私有仓库,所以镜像的名字前面还必须再加上仓库的地址(域名或者 IP 地址都行),形式上和 HTTP 的 URL 相似。

下面示例中,把 “nginx:alpine” 改成了 “127.0.0.1:5000/nginx:alpine”:

docker tag nginx:alpine 127.0.0.1:5000/nginx:alpine

现在,这个镜像有了一个附加仓库地址的完整名字,就可以用 docker push 推上去了:

docker push 127.0.0.1:5000/nginx:alpine

为了验证是否已经成功推送,可以把刚才打标签的镜像删掉,再重新下载:

docker rmi  127.0.0.1:5000/nginx:alpine
docker pull 127.0.0.1:5000/nginx:alpine

API #

Docker Registry 没有图形界面,但提供了 RESTful API,可以发送 HTTP 请求来查看仓库里的镜像,具体的信息可以参考官方文档 https://docs.docker.com/registry/spec/api/,下面的这两条 curl 命令就分别获取了镜像列表和 Nginx 镜像的标签列表:

curl 127.0.0.1:5000/v2/_catalog
curl 127.0.0.1:5000/v2/nginx/tags/list

https 服务 #

要搭建 https 协议的 docker registry 首先需要证书。

要生成免费的 SSL/TLS 证书,可以使用 OpenSSL 工具。下面是使用 OpenSSL 生成自签名证书的基本步骤:

  1. 安装 OpenSSL:

根据你的操作系统,安装适用于 OpenSSL 的软件包或使用系统自带的 OpenSSL。

在终端或命令提示符中,运行 openssl version 命令,确认 OpenSSL 是否成功安装。

  1. 生成自签名证书:

使用以下命令生成自签名证书:

openssl req -x509 -days 365 -out registry.test.crt -keyout registry.test.key \
  -newkey rsa:2048 -nodes -sha256 \
    -subj '/CN=registry.test' -extensions EXT -config <( \
       printf "[dn]\nCN=registry.test\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:registry.test\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
  • openssl req: 使用 OpenSSL 工具中的 req 子命令,用于生成证书请求或自签名证书。
  • -x509: 指定生成自签名证书而不是证书请求。
  • -days 365: 指定证书的有效期为 365 天。
  • -out registry.test.crt: 指定生成的证书文件名为 registry.test.crt,并将其保存在当前目录下。
  • -keyout registry.test.key: 指定生成的私钥文件名为 registry.test.key,并将其保存在当前目录下。
  • -newkey rsa:2048: 创建一个新的 RSA 密钥对,密钥长度为 2048 位。
  • -nodes: 在生成私钥时不加密密钥文件,这样私钥文件不会有密码保护。
  • -sha256: 使用 SHA-256 哈希算法签名证书。
  • -subj '/CN=registry.test': 设置证书的主题字段,这里指定 Common Name (CN) 为 registry.test,即证书的通用名称。
  • -extensions EXT -config <(printf "[dn]\nCN=k8s.test\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:k8s.test\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth"): 配置扩展字段,用于指定主题备用名称 (Subject Alternative Name, SAN)、密钥用途和扩展密钥用途。这里将 SAN 设置为 DNS:registry.test,表示证书可以用于 registry.test 主机名的验证。

对于开发、测试或个人用途,自签名证书是一个方便且免费的选项。自签名证书不会被信任的证书颁发机构(CA)认可,因此在生产环境中可能会被浏览器或其他客户端视为不受信任。在生产环境中,可能需要使用受信任的 CA 颁发的证书。

当有了证书,就可以使用 docker run 命令启动 registry 容器,并将配置文件和证书、私钥挂载到容器中:

docker run -d \
--name registry \
-p 5000:5000 \
--restart always \
-v /home/weibin/cert.d:/etc/cert.d \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/cert.d/registry.test.crt \
-e REGISTRY_HTTP_TLS_KEY=/etc/cert.d/registry.test.key \
registry

/home/weibin/cert.d 目录是宿主机的目录,里面有证书文件:

可以看到,容器可以正常启动:

测试请求正常:

权限 #

TODO ...

参考 #