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

[经验分享] 金庸武功之“北冥神功”

[复制链接]

尚未签到

发表于 2018-5-28 12:41:26 | 显示全部楼层 |阅读模式
  一。拓扑环境:
  IP:192.168.93.202  docker registry服务器
  IP:192.168.93.201  docker client服务器
  关闭selinux及防火墙

  修改/etc/hosts文件

  192.168.93.202 docker.shengjing.com
  hostnamectl set-hostname docker.shengjing.com  (永久修改主机名)
  安装依赖的软件包:
  yum install gcc make pcre-devel pcre openssl-devel httpd-tools zlib-devel -y
  生成根密钥:
  先把
/etc/pki/CA/cacert.pem
/etc/pki/CA/index.txt
/etc/pki/CA/index.txt.attr
/etc/pki/CA/index.txt.old
/etc/pki/CA/serial
/etc/pki/CA/serial.old
删除掉!
  cd /etc/pki/CA
  (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
  [root@docker CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
  Generating RSA private key, 2048 bit long modulus
  ..................................................................................................................................+++
  .......................................................+++
  e is 65537 (0x10001)
  生成根证书

  openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
  Generating RSA private key, 2048 bit long modulus
  ..................................................................................................................................+++
  .......................................................+++
  e is 65537 (0x10001)
  [root@docker CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem
  You are about to be asked to enter information that will be incorporated
  into your certificate request.
  What you are about to enter is what is called a Distinguished Name or a DN.
  There are quite a few fields but you can leave some blank
  For some fields there will be a default value,
  If you enter '.', the field will be left blank.
  -----
  Country Name (2 letter code) [XX]:CN
  State or Province Name (full name) []:beijing
  Locality Name (eg, city) [Default City]:beijing
  Organization Name (eg, company) [Default Company Ltd]:sjwl
  Organizational Unit Name (eg, section) []:sjwl
  Common Name (eg, your name or your server's hostname) []:docker.shengjing.com
  Email Address []:mengxl@shengjing360.com
  

  会提示输入一些内容,因为是私有的,所以可以随便输入,最好记住能与后面保持一致,特别是"Common Name”。必须要和hostname显示的一致。mengxl@shengjing360.com要记住!
上面的自签证书cacert.pem应该生成在/etc/pki/CA下

  

  [root@docker CA]# ls
  cacert.pem  certs  crl  newcerts  private
  
为nginx web服务器生成ssl密钥
  mkdir /usr/local/nginx/ssl
  cd /usr/local/nginx/ssl
  

  
  [root@docker ssl]#(umask  077; openssl  genrsa -out  /usr/local/nginx/ssl/nginx.key  2048)
  Generating RSA private key, 2048 bit long modulus
  .....................................................+++
  ....................................................................................................................+++
  e is 65537 (0x10001)
  
查看nginx服务器的密钥
  

  [root@docker ssl]# ls
  nginx.key
  为nginx生成证书签署请求
  执行    openssl req -new -key /usr/local/nginx/ssl/nginx.key -out /usr/local/nginx/ssl/nginx.csr
  

  
  You are about to be asked to enter information that will be incorporated
  into your certificate request.
  What you are about to enter is what is called a Distinguished Name or a DN.
  There are quite a few fields but you can leave some blank
  For some fields there will be a default value,
  If you enter '.', the field will be left blank.
  -----
  Country Name (2 letter code) [XX]:CN
  State or Province Name (full name) []:beijing
  Locality Name (eg, city) [Default City]:beijing
  Organization Name (eg, company) [Default Company Ltd]:sjwl
  Organizational Unit Name (eg, section) []:sjwl
  Common Name (eg, your name or your server's hostname) []:docker.shengjing.com
  Email Address []:mengxl@shengjing360.com
  

  Please enter the following 'extra' attributes
  to be sent with your certificate request
  A challenge password []:
  An optional company name []:
  
同样会提示输入一些内容,Commone Name一定要是你要授予证书的服务器域名或主机名,challenge password不填。
  私有CA根据请求来签发证书

  [root@docker ssl]# touch /etc/pki/CA/index.txt
  [root@docker ssl]# touch /etc/pki/CA/serial
  [root@docker ssl]# echo 00 > /etc/pki/CA/serial
  执行

  [root@docker ssl]# openssl ca  -in  /usr/local/nginx/ssl/nginx.csr  -out  /etc/pki/CA/certs/nginx.crt  -days  365
  Using configuration from /etc/pki/tls/openssl.cnf
  Check that the request matches the signature
  Signature ok
  Certificate Details:
  Serial Number: 0 (0x0)
  Validity
  Not Before: Nov  7 16:28:22 2016 GMT
  Not After : Nov  7 16:28:22 2017 GMT
  Subject:
  countryName               = CN
  stateOrProvinceName       = beijing
  organizationName          = sjwl
  organizationalUnitName    = sjwl
  commonName                = docker.shengjing.com
  emailAddress              = mengxl@shengjing360.com
  X509v3 extensions:
  X509v3 Basic Constraints:
  CA:FALSE
  Netscape Comment:
  OpenSSL Generated Certificate
  X509v3 Subject Key Identifier:
  04:91:10:DD:9E:37:81:66:5E:66:E4:CE:EB:02:E0:D3:27:FC:F7:7B
  X509v3 Authority Key Identifier:
  keyid:C8:F9:00:19:C0:61:7E:71:B8:16:FD:08:43:AD:82:F7:9E:BC:20:91
  

  Certificate is to be certified until Nov  7 16:28:22 2017 GMT (365 days)
  Sign the certificate? [y/n]:y
  

  

  1 out of 1 certificate requests certified, commit? [y/n]y
  Write out database with 1 new entries
  Data Base Updated
  
同样会提示输入一些内容,选择y就可以了!

  查看nginx的证书
  [root@docker ssl]# cd /etc/pki/CA/certs/
  [root@docker certs]# ls
  nginx.crt
  

  cp  /etc/pki/CA/certs/nginx.crt /usr/local/nginx/ssl/
  

  查看证书中的信息:
  ~]# openssl  x509  -in /etc/pki/CA/certs/nginx.crt  -noout  -serial  -subject
  

  

  安装,配置,运行nginx

  (1) 添加组和用户
  [root@docker ssl]# groupadd www -g 58
  [root@docker ssl]# useradd -u 58 -g www www
  
cd /usr/local/src

  wget http://nginx.org/download/nginx-1.11.2.tar.gz
  tar -zxvf nginx-1.11.2.tar.gz
  cd  nginx-1.11.2
  [root@docker nginx-1.11.2]# ./configure --user=www --group=www --prefix=/usr/local/nginx  --with-http_ssl_module --with-http_stub_status_module  --with-pcre  --with-http_addition_module --with-http_realip_module  --with-http_flv_module
  

  [root@docker nginx-1.11.2]# make && make install
  vi /usr/local/nginx/conf/nginx.conf

  
  

  user  www;
  worker_processes  4;
  

  #error_log  logs/error.log;
  #error_log  logs/error.log  notice;
  #error_log  logs/error.log  info;
  

  pid        logs/nginx.pid;
  

  

  events {
  worker_connections  4096;
  }
  

  

  http {
  include       mime.types;
  default_type  application/octet-stream;
  

  #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  #                  '$status $body_bytes_sent "$http_referer" '
  #                  '"$http_user_agent" "$http_x_forwarded_for"';
  

  #access_log  logs/access.log  main;
  

  sendfile        on;
  #tcp_nopush     on;
  

  #keepalive_timeout  0;
  keepalive_timeout  65;
  #gzip  on;
  upstream registry {
  server 192.168.93.202:5000;
  }
  server {
  listen       80;
  server_name  localhost;
  

  #charset koi8-r;
  

  #access_log  logs/host.access.log  main;
  

  location / {
  root   html;
  index  index.html index.htm;
  }
  

  #error_page  404              /404.html;
  

  # redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
  root   html;
  }
  

  }
  

  server {
  listen       443 ;
  server_name  docker.shengjing.com;
  add_header Docker-Distribution-Api-Version registry/2.0 always;
  

  ssl on;
  ssl_certificate      /usr/local/nginx/ssl/nginx.crt;
  ssl_certificate_key  /usr/local/nginx/ssl/nginx.key;
  

  ssl_session_cache    shared:SSL:1m;
  ssl_session_timeout  5m;
  

  #    ssl_ciphers  HIGH:!aNULL:!MD5;
  #    ssl_prefer_server_ciphers  on;
  

  location / {
  

  auth_basic "registry";
  

  auth_basic_user_file /usr/local/nginx/conf/.htpasswd; #htpasswd的位置
  

  

  root   html;
  index  index.html index.htm;
  

  #proxy_pass                  http://registry;
  

  #proxy_set_header  Host           $http_host;
  

  proxy_set_header  X-Real-IP      $remote_addr;
  

  proxy_set_header  Authorization  "";
  

  

  client_body_buffer_size     128k;
  

  proxy_connect_timeout       90;
  

  proxy_send_timeout          90;
  

  proxy_read_timeout          90;
  

  proxy_buffer_size           8k;
  

  proxy_buffers               4 32k;
  

  proxy_busy_buffers_size     64k;  #如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
  

  proxy_temp_file_write_size  64k;  #proxy缓存临时文件的大小
  

  }
  

  location /_ping {
  

  auth_basic off;
  

  proxy_pass http://registry;
  

  }
  location /v1/_ping {
  

  auth_basic off;
  

  proxy_pass http://registry;
  

  }
  

  

  }
  

  

  }
  

  

  验证配置:
  /usr/local/nginx/sbin/nginx -t
  启动nginx:
  

  [root@docker conf]# /usr/local/nginx/sbin/nginx
  [root@docker conf]# ss -ntpl
  State       Recv-Q Send-Q                                                  Local Address:Port                                                                 Peer Address:Port
  LISTEN      0      128                                                                 *:22                                                                              *:*                   users:(("sshd",pid=841,fd=3))
  LISTEN      0      100                                                         127.0.0.1:25                                                                              *:*                   users:(("master",pid=1408,fd=13))
  LISTEN      0      128                                                                *:443                                                                             *:*                   users:(("nginx",pid=4796,fd=6),("nginx",pid=4795,fd=6),("nginx",pid=4794,fd=6),("nginx",pid=4793,fd=6),("nginx",pid=4792,fd=6))
  LISTEN      0      128                                                                :::22                                                                             :::*                   users:(("sshd",pid=841,fd=4))
  LISTEN      0      100                                                               ::1:25                                                                             :::*                   users:(("master",pid=1408,fd=14))
  

  [root@docker conf]# ps -ef | grep -i "nginx"
  root      4792     1  0 12:07 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
  www       4793  4792  0 12:07 ?        00:00:00 nginx: worker process
  www       4794  4792  0 12:07 ?        00:00:00 nginx: worker process
  www       4795  4792  0 12:07 ?        00:00:00 nginx: worker process
  www       4796  4792  0 12:07 ?        00:00:00 nginx: worker process
  root      4804  1994  0 12:08 pts/0    00:00:00 grep --color=auto -i nginx
  

生成htpasswd
[root@localhost]# htpasswd -cb /usr/local/nginx/conf/.htpasswd admin admin
  浏览器中:https://docker.shengjing.com
  输入用户:admin
  密码:       admin
  出现nginx测试页面
  当把这条#proxy_pass                  http://registry;的注释#去掉
  页面就报502,因为后端代理docker registry还没有启动
  至此证明https认证完成
  ###############################################################################
  搭建docker registry V2
  [root@localhost ~]# systemctl stop docker
[root@localhost ~]# vim /etc/sysconfig/docker
修改后:

  OPTIONS='--selinux-enabled --insecure-registry dockertest.shengjing.com'
添加--insecure-registry docker.shengjing.com 红色的是私有仓库的域名,更前面生成密钥时候的域名对应

配置密钥文件
mkdir -p /etc/docker/certs.d/hc.docker.io
cp /etc/pki/CA/cacert.pem  /etc/docker/certs.d//hc.docker.io/ca-certificates.crt
  cat /etc/pki/CA/cacert.pem  >> /etc/pki/tls/certs/ca-bundle.crt

[root@localhost ~]#systemctl restart docker
[root@localhost ~]#vim 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
  

  [root@localhost ~]#mkdir data
  docker run -d -p 5000:5000 --restart=always --name registry -v `pwd`/config.yml:/etc/docker/registry/config.yml -v `pwd`/data:/var/lib/registry registry:2
  这里注意如果运行时报如下错误:
  
  [root@docker ~]# docker run -d -p 5000:5000 --restart=always --name registry -v `pwd`/config.yml:/etc/docker/registry/config.yml -v `pwd`/data:/var/lib/registry registry:2
  Unable to find image 'registry:2' locally
  Trying to pull repository docker.io/library/registry ...
  Get https://registry-1.docker.io/v2/library/registry/manifests/2: net/http: TLS handshake timeout
  docker: Get https://registry-1.docker.io/v2/library/registry/manifests/2: net/http: TLS handshake timeout.
  See '/usr/bin/docker-current run --help'.
  
没别的原因,就是网络问题,因为docker hub在国外,墙很厚啊,呵呵!多试几次就行了
  

  [root@docker ~]# docker images
  REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
  docker.io/registry   2                   c9bd19d022f6        2 weeks ago         33.27 MB
  

验证
[root@localhost ~]# curl https://admin:admin@dockertest.xxxx.com/v2/
结果返回{}
登录
[root@localhost ~]docker login https://dockertest.xxxx.com
Username: admin
Password:        #admin
Email: abcd@qq.com
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
验证push镜像到私有仓库
在登录的前题下,本机验证
  

[root@localhost ~]# docker pull busybox
docker pull busybox
  Using default tag: latest
  Trying to pull repository docker.io/library/busybox ...
  latest: Pulling from docker.io/library/busybox
  56bec22e3559: Pull complete
  Digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912
  Status: Downloaded newer image for docker.io/busybox:latest
  [root@docker ~]# docker images
  REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
  docker.io/registry   2                   c9bd19d022f6        2 weeks ago         33.27 MB
  docker.io/busybox    latest              e02e811dd08f        4 weeks ago         1.093 MB
  

  [root@docker ~]# docker tag e02e811dd08f docker.shengjing.com/busybox:v1
  [root@docker ~]# docker images
  REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
  docker.io/registry             2                   c9bd19d022f6        2 weeks ago         33.27 MB
  docker.io/busybox              latest              e02e811dd08f        4 weeks ago         1.093 MB
  docker.shengjing.com/busybox   v1                  e02e811dd08f        4 weeks ago         1.093 MB
  

  

  [root@docker ~]# docker push docker.shengjing.com/busybox:v1
  The push refers to a repository [docker.shengjing.com/busybox]
  e88b3f82283b: Pushed
  v1: digest: sha256:9393222c6789842b16bcf7306b6eb4b486d81a48d3b8b8f206589b5d1d5a6101 size: 505
  [root@docker ~]# curl https://admin:admin@docker.shengjing.com/v2/_catalog
  {"repositories":["busybox"]}
  

  在client端测试
配置密钥
[root@localhost ~]#scp /etc/pki/CA/cacert.pem root@192.168.93.201:/root/
在client上(192.168.93.201)
vi    /etc/sysconfig/docker
OPTIONS='--selinux-enabled --insecure-registry docker.shengjing.com'


  mkdir -pv /etc/docker/certs.d/docker.shengjing.com
  cp /root/cacert.pem  /etc/docker/certs.d/docker.shengjing.com/
  

  cat /etc/docker/certs.d/docker.shengjing.com/cacert.pem > /etc/pki/tls/certs/ca-bundle.crt
  

  vi /etc/hosts
  192.168.93.202 docker.shengjing.com
  

  

  重启下服务器
  

  第一次我登陆时报错,如下:

  [root@localhost ~]# docker login https://docker.shengjing.com
Username: admin
Password:
Email:
Error response from daemon: invalid registry endpoint
https://docker.shengjing.com/v0/: unable to ping registry endpoint https://docker.shengjing.com/v0/
v2 ping attempt failed with error: Get
https://docker.shengjing.com/v2/: x509: certificate signed by unknown authority
v1 ping attempt failed with error: Get
https://docker.shengjing.com/v1/_ping: x509: certificate signed by unknown authority. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry docker.shengjing.com` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/docker.shengjing.com/ca.crt
  

  怎么折腾都不行,看错误说是证书问题,最后放大招,另一台client测试,没问题,出问题的服务器恢复快照后也没问题,奇了葩了。
  

  正常应该是这样:
  

  

  [root@localhost ~]# docker login https://docker.shengjing.com
  Username (admin): admin
  Password:
  WARNING: login credentials saved in /root/.docker/config.json
  Login Succeeded
  


  
  [root@localhost ~]# curl https://admin:admin@docker.shengjing.com/v2/
  {}[root@localhost ~]#
  
到此,私有基于证书的ngix + registryv2 结束,累死老子了,最郁闷的快搭建完了才发现有个更牛逼的开源企业级私有registry,还是提供界面的中文的,哈哈,各位关注我接下来的博客吧
  

  

  docker harbor
  参考博客:http://www.mamicode.com/info-detail-1181975.html
  

  

  

  

  

  

  

  

  

  

  

运维网声明 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-482227-1-1.html 上篇帖子: spark 实战 1: 基于gettyimages spark docker image 创建spark 集群 下篇帖子: Docker 1.12 实战 (一)基本部署
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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