你有一个带凭证的Docker注册表吗?

时间:2016-05-12 15:44:21

标签: docker

假设我在example.com运行docker注册表,我会通过以下方式下载图片:

docker pull example.com:5000/image:1

我如何用密码保护此注册表?它可能包含机密代码/数据。

1 个答案:

答案 0 :(得分:3)

the official documentation中提到了这一点。有几种方法可以保护Docker注册表。请注意,所有这些都只适用于受TLS保护的注册表(否则您将以纯文本形式发送密码或其他凭据,这不会增加任何安全性。)

注册表本身内的身份验证

首先以htpasswd格式创建凭证文件:

$ htpasswd -Bbn testuser testpassword > auth/htpasswd

然后将此文件装入注册表容器并传递REGISTRY_AUTH_HTPASSWD_*环境变量:

$ docker run -d -p 5000:5000 --restart=always --name registry \
  -v `pwd`/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

代理身份验证

使用在主机或其他容器上运行的反向代理(如Nginx)来处理身份验证(深入记录here):

upstream docker-registry {
    server registry:5000;
}

server {
    listen 443 ssl;
    server_name myregistrydomain.com;

    ssl_certificate /etc/nginx/conf.d/domain.crt;
    ssl_certificate_key /etc/nginx/conf.d/domain.key;

    client_max_body_size 0;

    location /v2/ {  
        auth_basic "Registry realm";
        auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

        proxy_pass                          http://docker-registry;
        proxy_set_header  Host              $http_host;
        proxy_set_header  X-Real-IP         $remote_addr;
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_read_timeout                  900;
    }
}

使用令牌服务器进行外部身份验证

正如您提到的用户名/密码保护,上述解决方案之一可能对您来说已经足够了。为了完整性,您还可以使用外部身份验证提供程序进行身份验证。令牌服务器需要实现的接口被指定为here,其中描述了必要的配置选项here