如何使用TLS SSL证书在Linux上设置安全的Docker注册表

如果要在企业的Docker注册表中创建自定义映像,则关于托管Docker映像的位置有两种选择:

  1. Docker集线器 -此注册表托管服务是免费的,由Docker Inc.提供。 他们还具有几种企业级功能,您可以在其中为组织创建多个帐户,设置自动构建等。
  2. 自包含的Docker注册表-您可以在组织中设置一个Docker注册表来托管自己的映像。

本指南说明了如何设置安全的自行编写的Docker注册表。

1.设置TLS证书和密钥

将现有证书和密钥文件复制到〜/ docker-certs目录。

# mkdir /root/docker-certs

# cd /root/docker-certs

# ls -1
andreyex.crt
andreyex.key
intermediateCA.pem

在此示例中,我使用的是证书文件andreyex.crt和为我的Apache Web服务器生成的文件andreyex.key。

有关如何创建自己的证书和密钥文件的更多信息,请参考以下指南:如何使用Let’s Encrypt在Ubuntu上安装SSL和SPDY证书。

2.中间证书文件的管理

在这种情况下,我还从CA获得了Lets Ensrypt证书。

对于Docker注册表,您必须将两个证书和中间证书合并到同一证书文件中。

那些。 如下所示,将中间证书的内容添加到证书文件中。

cd /root/docker-certs

cat intermediateCA.pem >> andreyex.crt

3.运行您的安全注册表Docker

现在如下所示启动安全的Docker。

docker run -d -p 5000:5000 --restart=always --name registry 
  -v /root/docker-certs:/certs 
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/root/docker-certs/andreyex.crt 
  -e REGISTRY_HTTP_TLS_KEY=/root/docker-certs/andreyex.key 
  registry:2

在上面的命令中:

  • Docker注册表开始在端口5000上工作
  • Docker容器名称“注册表”
  • 包含/ root / docker-cert证书的本地目录在Docker注册表容器内显示为/ certs。
  • REGISTRY_HTTP_TLS_CERTIFICATE变量指向具有完整路径的证书文件
  • REGISTRY_HTTP_TLS_KEY变量指向具有完整路径的密钥文件的名称

启动Docker注册表后,您现在将看到一个正在运行的注册表容器,如下所示:

# docker ps
CONTAINER ID  IMAGE       COMMAND                  CREATED         STATUS         PORTS                    NAMES
v347s8c5dest  registry:2  "/entrypoint.sh /etc/"   25 seconds ago  Up 1 seconds   0.0.0.0:5000->5000/tcp   registry

4.访问安全的Docker注册表

设置安全的Docker注册表后,您可以从网络上的其他服务器(或从外部)访问它,并在其上使用所有标准Docker命令。

例如,您可以如下图所示为该安全Docker注册表推送或拉取映像。

docker pull andreyex.com:5000/mongodb

docker push andreyex.com:5000/mongodb

5.设置不安全的Docker注册表

注意:如果您对Secure Docker Registry有任何问题,出于调试目的,请在没有证书的情况下启动注册表,并查看其工作方式,如下所示:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

当尝试从Docker注册表中显示图像(或执行其他任何操作)时,您可能会收到以下错误消息“接收到的记录长度过大”。

例如,当我们在远程服务器上(而不是在安装了Docker注册表的服务器上)运行以下命令时,我们收到以下错误消息:

# docker pull 192.168.51.1:5000/mongodb
Using default tag: latest
Error response from daemon: Get https://192.168.51.1:5000/v1/_ping: tls: oversized record received with length 20527

在这种情况下,192.168.51.1是运行安全docker注册表的服务器(我们没有安全证书)。

在这种情况下,必须在远程服务器上允许注册表中进行不安全的操作。 为此,必须将“ -insecure-registry”参数传递给DOCKER_OPTS环境变量。

在远程服务器上,修改此文件并添加以下行:

vi /etc/default/docker
DOCKER_OPTS="--insecure-registry 192.168.101.1:5000"

现在在远程服务器上重新启动docker。

systemctl daemon-reload
systemctl stop docker
systemctl start docker

现在,由于存在不安全的注册表调整选项,因此docker将pull(或任何其他docker命令)将正常运行。

docker pull 192.168.101.1:5000/mongodb

Sidebar