1. Docker私有仓库使用域名和限制登录
  2. AuthorLiNing

Docker私有仓库一般使用Host:Port形式来代表仓库名称,如果有域名指向这个Host:Port,那么我们可以使用域名来代表仓库名称,这样一方面比较容易记忆,另一方面不会轻易暴露Registry使用的IP和端口。

1. 使用域名登录:

前提:假设域名 myregistrydomain.com 指向 xxx.xxx.xxx.xx:5000,如果不想花钱的话,改本地host。

在Registry服务端:

  • 从CA提供商获取证书:

首先,你需要从一个CA提供商获取证书,如果在信任区域内,可以使用自签名证书,使用openssl生成。

其中,证书文件和秘钥文件分别为crt和key文件,分别拷贝到/opt/data/certs/domain.crt和/opt/data/certs/domain.key

  1. mkdir -p /opt/data/certs
  2. openssl req -newkey rsa:4096 -nodes -sha256 \
  3. -keyout /opt/data/certs/domain.key -x509 -days 365 \
  4. -out /opt/data/certs/domain.crt

官网上这么说的

image

使用自签名证书需要注意的一点就是,在设置CN(Common Name)的时候,把要配置的域名写上。

  • 运行Docker服务:
  1. docker run -d --name registry -p 5000:5000 --restart=always \
  2. -v /opt/data/certs:/certs \
  3. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  4. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  5. registry

在Registry客户端:

同样需要将服务端的证书domain.crt复制到客户端/etc/docker/certs.d/myregistrydomain.com:5000目录下,命名文件为ca.crt,其中myregistrydomain.com:5000为你注册的域名和使用的端口。

可以使用域名来代表仓库,进行push和pull操作,如:

  1. docker tag hello-world myregistrydomain.com:5000/myfirstimage
  2. docker push myregistrydomain.com:5000/myfirstimage
  3. docker rmi myregistrydomain.com:5000/myfirstimage
  4. docker pull myregistrydomain.com:5000/myfirstimage

2. 限制登录:

在Registry服务端:

  • 设置用户名和密码。

image

  1. 这里,设置用户名为testuser,密码为testpassword.
  2. 可以看到在生成的htpasswd中,保存了用户名和密码的相关信息。
  • 运行Docker服务:
  1. docker run -d --name registry -p 5000:5000 --restart=always \
  2. -v /opt/data/auth:/auth \
  3. -e "REGISTRY_AUTH=htpasswd"
  4. -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  5. -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  6. registry

image

可以看到服务已经在Linux后台运行,并且服务器的5000端口指向了registry容器的5000端口,这样就可以通过“IP+端口”的方式进行访问了。

在Registry客户端:

采用与登录Docker Hub一样的命令即可,如在服务器上看到的IP为192.168.142.148,则

image

输入命令:

  1. docker login 192.168.142.148:5000

会提示输入用户名和密码,输入正确则登录成功,接下来就可以进行push和pull操作了。

image