wslhs 发表于 2018-5-29 14:27:38

Docker Registry V2(distribution) & Proxy(nginx) 的搭建经历

  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) :China
string is too long, it needs to be less than2 bytes long
Country Name (2 letter code) :CH
State or Province Name (full name) :BeiJing
Locality Name (eg, city) []:BeiJing      
Organization Name (eg, company) :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 的配置文件,一切全部了然:
userwww www;
worker_processesauto;
error_log   /var/log/nginx/error.log error;
pid      logs/nginx.pid;
worker_rlimit_nofile 51200;
events {
    use epoll;
    worker_connections51200;
    multi_accept on;
}
http {
    include       mime.types;
    default_typeapplication/octet-stream;
    log_formatmain'$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.logmain;
    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_timeout0;
    keepalive_timeout65;
    #gzipon;
    upstream registry {
      server 127.0.0.1:5000;
    }   
    server {
      listen       443;
      server_nameregistry.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_headerHost            $http_host;   # required for docker client's sake
          proxy_set_headerX-Real-IP         $remote_addr; # pass on real client's IP
          proxy_set_headerX-Forwarded-For   $proxy_add_x_forwarded_for;
          proxy_set_headerX-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]
查看完整版本: Docker Registry V2(distribution) & Proxy(nginx) 的搭建经历