设为首页 收藏本站
查看: 1104|回复: 0

[经验分享] Docker Registry V2(distribution) & Proxy(nginx) 的搭建经历

[复制链接]

尚未签到

发表于 2018-5-29 14:27:38 | 显示全部楼层 |阅读模式
  Docker Registry V2 问世后,简单实用的确不错,不过等将端口5000更改成其他后,或者使用域名绑定后就错误百出。这里详细的将自己的经历过程做一个记录。
  

  一、Docker Registry V2(distribution) 的安装。
  这里我选择了使用官方提供的镜像去进行安装,也许你会感觉这很EASY,不屑一顾。不过,对一个运维人员来说,注重的是应用,注重的是registry中的镜像。而不是注重花哨的搭建过程。而我们注重的,registry 镜像都能满足我们的需求。
  

# docke pull registry:2
# docker run -d -p 5000:5000 --restart=always --name registry -v /data/:/var/lib/registry -v /etc/registry/config.yml:/etc/docker/registry/config.yml registry:2  以上两个注重点:
  (1)、确保所管理的镜像文件的安全,若使用本地磁盘存储镜像,则一定将其挂在到宿主机中。
  (2)、registry 的配置文件管理,若你想有自己的定制效果,请不要使用registry的默认配置,请将其    进行覆盖。
  以下是我使用的配置文件:
# cat /etc/registry/config.yml
version: 0.1
log:
    level: debug
    formatter: text
    fields:
        service: registry
        environment: staging
storage:
    delete:
        enabled: true
    cache:
        layerinfo: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
http:
    addr: :5000
    secret: admin  配置文件为YAML 格式。其中指定了镜像的存储位置、缓存类型、监听端口等。
  其中 secret: admin 这个要额外注意。这回在下一步的安全认证中使用到。
  

  基于以上的东西,registry 能做些什么呢?
  

  它能做这些:
  Example:
# docker pull ubuntu && docker tag ubuntu localhost:5000/ubuntu  then....
# docker push localhost:5000/ubuntu  

  当然,你可能不会满足这些,你想对你的registry 起一个响亮的名字。假如叫:registry.test.com
  暂时做上本地DNS绑定,再重复一下上面的步骤,看看效果如何。
# docker pull ubuntu && docker tag ubuntu registry.test.com:5000/ubuntu  then....
# docker push registry.test.com:5000/ubuntu  你会发现并不理想,甚至连一个友好的错误提示都没有在终端上看到。但当你使用 docker logs 命令
  去查看registry 里面的日志时,会发现有关认证的错误提示。
  

  此时,我们有可能按照官方的文档:
  https://github.com/docker/distribution/blob/master/docs/insecure.md
  

  去做一些配置.............
  

  再次重新PUSH
# docker push registry.test.com:5000/ubuntu  如果你真是按照官方文档配置,你会发现你成功了。
  

  后来,你更贪心,打算将5000端口去掉。换成默认的80端口,registry服务,毕竟是HTTP服务。我们没有必要那么矫形。将registry 的 config.yml 的 监听端口更改为80
http:
    addr: :80
    secret: admin  重启后,发现根本就不是那么一回事。 细心的同学会发现,还是认证问题。
  

  那要解决这个问题,怎么破?
  用代理试试吧。毕竟docker registry v1 的时候,前面就可以设置代理的。呵呵
  且上一步还遗留这证书的问题,所有这个代理恐怕要配置成https 了。那就配置代理吧。
  

  二、配置Docker Registry 的代理服务器
  (1)、先生成证书吧(模仿docker 官方更改了一下路径。呵呵)。
mkdir -p /etc/nginx/ssl && openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout ssl/domain.key \
  -x509 -days 365 -out ssl/domain.crt  这里要注意CN 的名字,必须是你的registry 的域名,否则你的事情就大了。

  Example:
Country Name (2 letter code) [AU]:China
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [AU]:CH
State or Province Name (full name) [Some-State]:BeiJing
Locality Name (eg, city) []:BeiJing      
Organization Name (eg, company) [Internet Widgits Pty Ltd]:BeiJing
Organizational Unit Name (eg, section) []:BeiJing  
Common Name (e.g. server FQDN or YOUR name) []:registry.test.com
Email Address []:BeiJing@beijing.com  (2)、安装NGINX 及调整配置。
  安装nginx 的时候注意,add_header 命令有可能会提示不认。你最好用 1.7.5 这个版本或以      上(这个命令中使用了 always 这个东西,只有在1.7.5 及以上才OK的)。
   另外,nginx 配置文件的详细细节,最本文最后贴出。
(3)、设置registry 的登录用户名和密码
# htpasswd -cb /opt/nginx/conf/.htpasswd admin admin想想,当初我们的registry 中也设置了一个admin 的东西。两个必须都存在的。。否则会有问题的。


(4)、去掉当初直接对registry 设置的认证。比如如下的设置:
docker run -d -p 5000:5000 --restart=always --name registry \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2请去掉 认证相关的东西吧。回到本文最开始启动registry的形式上。所有一切的认证。我们将在nginx 去处理的....


(5)、最后,列举出nginx 的配置文件,一切全部了然:
user  www www;
worker_processes  auto;
error_log   /var/log/nginx/error.log error;
pid        logs/nginx.pid;
worker_rlimit_nofile 51200;
events {
    use epoll;
    worker_connections  51200;
    multi_accept on;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$http_host $remote_user [$time_local] $request '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" $remote_addr $request_time $upstream_response_time';
    access_log  /var/log/nginx/access.log  main;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    upstream registry {
        server 127.0.0.1:5000;
    }   
    server {
        listen       443;
        server_name  registry.chanjet.com;
        ssl          on;
        ssl_certificate /etc/nginx/ssl/domain.crt;
        ssl_certificate_key /etc/nginx/ssl/domain.key;
        client_max_body_size 0;
        chunked_transfer_encoding on;
        location /v2/ {
  auth_basic "Registry realm";
          auth_basic_user_file /opt/nginx/conf/.htpasswd;
          add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
          proxy_pass                          http://registry;
          proxy_set_header  Host              $http_host;   # required for docker client's sake
          proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
          proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
          proxy_set_header  X-Forwarded-Proto $scheme;
          proxy_read_timeout                  900;
        }
    }
}

三、最后验证:
配置是否好用,还需要通过适当的方法进行验证。
(1)、连通性验证:
# curl -i -k -v https://admin:admin@registry.test.com/v2/(2)、身份验证(最好登录另外一台服务器)。
# docker login registry.chanjet.com # 会提示你输入用户名、密码、邮箱等.验证通过后,你就可以往这上面push东西了。如果没有这一步操作,你会发现验证失败的相关提示
# docker pull busybox && docker tag busybox registry.chanjet.com/test/busybox
# docker push registry.chanjet.com/test/busybox(3)、查看上传的镜像信息:
# curl -i -k -v https://admin:admin@registry.test.com/v2/_catalog参考文档:


https://github.com/docker/distribution/blob/master/docs/configuration.md
https://github.com/docker/distribution/blob/master/docs/insecure.md
http://www.dockone.io/article/684
https://docs.docker.com/registry/nginx/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-482705-1-1.html 上篇帖子: Centos7中docker无法从非官方库中pull镜像的解决方法 下篇帖子: CentOS 搭建docker私有仓库实践
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表