docker registry私有化docker仓库服务(二)

这篇文章介绍一下使用docker registry的ssl通信的配置方法。

首先要为registry服务创建用于ssl通信的数字证书,先准备名为certs的目录如下:

$ mkdir certs

然后再certs目录下使用openssl命令生成证书。命令如下:

$ openssl req \
    -new \
    -newkey rsa:4096 \
    -days 365 \
    -nodes \
    -x509 \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=Personal/CN=myregistry.io" \
    -keyout registry.key \
    -out registry.crt

生成证书过程如下:

可以看到我们生成了registry.crt证书文件和对应的私钥文件registry.key

此外可以看到我们生成的证书的CNmyregistry.io,因此我们registry对外提供服务的时候要使用这个域名。

注:如果是私有化部署,那么我们可以使用「自签名证书」和「手工解析的域名」。但是如果是在公网环境部署,开放给外部用户使用,那么就要申请正式的域名,并且要将域名对应的证书找权威机构进行正式的签名。

有了证书文件以后,接下来就可以让`registry`服务以ssl方式启动,所使用的`docker`命令如下:

docker run -d \
  --restart=always \
  --name registry \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
  -p 443:443 \
  registry:2

如上所示,我们把certs目录映射进了容器内部,并且让容器内的registry服务使用生成的证书文件。此外我们从容器映射出来的端口是443端口,也就是说registry使用443端口来和客户端进行ssl通信。下面是命令的运行结果:

可以看到这个容器已经运行,并且映射出来的端口是443。这样容器这边的工作就准备完成了。接下来可以使用客户端的docker命令来使用这个registry服务。

为了使用这个服务,我们首先要手工配置域名解析,编辑/etc/hosts文件如下:

这样,myregistry.io就对应localhost的ip地址,因为我们的docker服务跑在localhost,因此上面的解析就可以将域名对应docker在服务的地址。

接下来是试着把image给push进这个registry。首先是从docker的默认仓库pull一个image :

$ docker pull alpine

然后是tag这个下载好的image:

$ docker tag alpine myregistry.io:443/alpine

最后是把这个image给push到我们自己的registry里面:

$ docker push myregistry.io:443/alpine

执行上面的命令会看到下面的输出:

可以看到没办法push到我们自己的registry,并且给出的错误提示为:

no basic auth credentials

这是由于我们还没有配置registry的认证方式造成的。这篇文章就先到这里,下一篇文章介绍docker认证的配置方法。

Powered by Jekyll and Theme by solid