假设我在example.com
运行docker注册表,我会通过以下方式下载图片:
docker pull example.com:5000/image: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。