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
。
此外可以看到我们生成的证书的CN
是myregistry.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认证的配置方法。