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 生成自签名证书的基本步骤:
- 安装 OpenSSL:
根据你的操作系统,安装适用于 OpenSSL 的软件包或使用系统自带的 OpenSSL。
在终端或命令提示符中,运行 openssl version
命令,确认 OpenSSL 是否成功安装。
- 生成自签名证书:
使用以下命令生成自签名证书:
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 目录是宿主机的目录,里面有证书文件:
可以看到,容器可以正常启动:
测试请求正常: