zoukankan      html  css  js  c++  java
  • FW 配置一个私有的Docker仓库

     

    思维思维 66 3月1日 发布

    我们在本地开发时,如果内网能部署一台Docker服务器,无疑会极大的方便镜像的分享发布,有些私有镜像就是可以直接放到内网服务器上,省去了不必要的网络下载。

    本课程需要配两个虚拟机,一台作为私有仓库部署,一台作为工作机。

    //Docker仓库部署-虚拟机
    docker-machine create -d virtualbox registry
    //Docker工作机
    docker-machine create -d virtualbox default

    Setup1 安装并配置Registry

    mkdir ~/docker-registry && cd $_
    mkdir data
    

    mate docker-compose.yml

    registry:
     image: registry
     ports:
      - 127.0.0.1:5000:5000
     environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
     volumes:
      - ./data:/data

    执行

    docker-compose up

    Setp2配置Nginx容器

    mkdir ~/docker-registry/nginx

    mate docker-compose.yml

    nginx:
     image: "nginx"
     ports:
      - 443:443
     links:
      - registry:registry
     volumes:
      - ./nginx/:/etc/nginx/conf.d:ro
    
    registry:
     image: registry
     ports:
      - 5000:5000
     environment:
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
     volumes:
      - ./data:/data

    mate ~/docker-registry/nginx/registry.conf

    upstream docker-registry {
      server registry:5000;
    }
    
    server {
      listen 443;
      server_name registry.51yixiao.com;
    
      # SSL
      # ssl on;
      # ssl_certificate /etc/nginx/conf.d/domain.crt;
      # ssl_certificate_key /etc/nginx/conf.d/domain.key;
    
      # disable any limits to avoid HTTP 413 for large image uploads
      client_max_body_size 0;
    
      # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
      chunked_transfer_encoding on;
    
      location /v2/ {
        # Do not allow connections from docker 1.5 and earlier
        # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
        if ($http_user_agent ~ "^(docker/1.(3|4|5(?!.[0-9]-dev))|Go ).*$" ) {
          return 404;
        }
    
        # To add basic authentication
        # auth_basic "registry.localhost";
        # auth_basic_user_file /etc/nginx/conf.d/registry.password;
        # add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
    
        proxy_pass                          http://docker-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;
      }
    }

    执行

    docker-compose up
    //测试
    curl http://www.registry.com:443
    curl http://www.registry.com:5000

    Setup3 设置HTTP验证

    cd ~/docker-registry/nginx
    
    htpasswd -c registry.password USERNAME
    //USERNAME替换自己想添加的用户名,比如:markthink,如果要继续添加其他用户 
    //htpasswd registry.password USERNAME

    mate ~/docker-registry/nginx/registry.conf

     #To add basic authentication
     auth_basic "registry.localhost";
     auth_basic_user_file /etc/nginx/conf.d/registry.password;
     add_header 'Docker-Distribution-Api-Version' 'registry' always;
    

    执行

    cd ~/docker-registry
    docker-compose up

    curl http://www.registry.com:443/

    <html>
    <head><title>401 Authorization Required</title></head>
    <body bgcolor="white">
    <center><h1>401 Authorization Required</h1></center>
    <hr><center>nginx/1.9.11</center>
    </body>
    </html>
    

    //使用HTTP验证访问-用上面配置的用户名和密码 
    curl http://markthink:123456a@www.registry.com:443/

    Setup4设置SSL验证

    使用HTTP验证并不安全,因为连接没有加密传输,下面启用SSL配置

    mate ~/docker-registry/nginx/registry.conf

      # SSL
      ssl on;
      ssl_certificate /etc/nginx/conf.d/domain.crt;
      ssl_certificate_key /etc/nginx/conf.d/domain.key;
    

    为我们的域名购买一个证书或申请一个免费SSL证书

    Setup5申请免费证书

    沃通CA(WoSign CA) 
    https://buy.wosign.com/free/#myorder
    https://buy.wosign.com/FreeSSL.html

    用申请好的证书更新nginx配置文件

    Setup6配置域名

    mate /etc/hosts
    //宿主机添加
    192.168.99.100 registry.51yixiao.com

    Setup7测试

    docker-machine start default
    //重新分配IP
    docker-machine regenerate-certs default
    
    docker-machine ssh default
    sudo -i
    vi /etc/hosts
    192.168.99.100 registry.51yixiao.com
    
    docker login https://registry.51yixiao.com
    //输入前面配置的用户和密码 登陆成功

    Setup8从工作机推送镜像至服务器

    eval $(docker-machine env default)
    docker images
    //为本地镜像打标签
    docker pull busybox
    docker tag busybox registry.51yixiao.com/busybox
    
    //登陆服务器
    docker login https://registry.51yixiao.com
    
    //向服务器推送镜像
    docker push registry.51yixiao.com/busybox
    
    curl https://markthink:123456a@registry.51yixiao.com/v2/
    //网页直接访问
    https://markthink:123456a@registry.51yixiao.com/v2/
    //退出服务器
    docker logout https://registry.51yixiao.com
    
    //查看镜像仓库已有的镜像
    https://markthink:123456a@registry.51yixiao.com/v2/_catalog
    

    Setup9从镜像服务器下载镜像至工作机

    docker-machine start default
    docker-machine regenerate-certs default
    docker-machine ssh default
    sudo -i
    vi /etc/hosts
    //添加IP地址
    192.168.99.100 registry.51yixiao.com
    //登陆服务器
    docker login https://registry.51yixiao.com
    //下载镜像
    docker pull registry.51yixiao.com/busybox
    //镜像改名
    docker tag registry.51yixiao.com/busybox busybox

    制作自己的证书

    由于Dokcer目前不允许使用自签名的SSL证书,这一步比平时更加复杂,我们必须建立自己的系统,对我们自己的证书签名授权。

    1.生成根密钥

    cd ~/docker-registry/nginx
    //生成新的根密钥
    openssl genrsa -out devdockerCA.key 2048

    2.生成根证书-Common Name填写证书签发者的域名 比如:www.trjcn.com

    openssl req -x509 -new -nodes -key devdockerCA.key -days 10000 -out devdockerCA.crt

    3.为nginx生成ssl密钥

    //生成nginx域名的SSL证书
    openssl genrsa -out domain.key 2048

    我们的CA中心与要申请证书的服务器是同一个,否则应该是在另一台需要用到证书的服务器上生成

    4.为nginx生成证书签署请求

    //生成ssl_certificate_key证书 
    openssl req -new -key domain.key -out dev-docker-registry.com.csr

    需要注意的是Common Name必须输入我们要授予证书的服务器IP或域名

    5.私有CA根据请求来签发证书

    //签署证书申请
    openssl x509 -req -in dev-docker-registry.com.csr -CA devdockerCA.crt -CAkey devdockerCA.key -CAcreateserial -out domain.crt -days 10000
    ``
    此过程用到了前两步生成的根密钥和根证书
    
    至此SSL证书制作完成,但是我们生成的证书没有已经的证书颁发机构验证,因此需要在Docker Registry中注册。
    
    下面是基于centsos的部署过程
    

    scp ./devdockerCA.crt registry:/home/docker/
    docker-machine ssh registry
    sudo -i
    mkdir /usr/local/share/ca-certificates/docker-dev-cert
    mv /home/docker/devdockerCA.crt /usr/local/share/ca-certificates/docker-dev-cert/
    //update-ca-certificates

    重启Docker daemon守护进程
    

    docker-machine restart registry
    //service docker restart

     
  • 相关阅读:
    广义后缀自动机模板
    HDU 5852 Intersection is not allowed! ( 2016多校9、不相交路径的方案、LGV定理、行列式计算 )
    BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )
    WHU 583 Palindrome ( 回文自动机 && 本质不同的回文串的个数 )
    HDU 5527 Too Rich ( 15长春区域赛 A 、可贪心的凑硬币问题 )
    HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
    HDU 5544 Ba Gua Zhen ( 2015 CCPC 南阳 C、DFS+时间戳搜独立回路、线性基 )
    HDU 5734 Acperience ( 数学公式推导、一元二次方程 )
    hihocoder 1251 Today is a rainy day ( 15年北京 C、暴力 )
    HDU 5113 Black And White ( 2014 北京区预赛 B 、搜索 + 剪枝 )
  • 原文地址:https://www.cnblogs.com/SZLLQ2000/p/5481664.html
Copyright © 2011-2022 走看看