zoukankan      html  css  js  c++  java
  • docker registry 2 with tls and basic authentication

    今天安装docker registry, 并且加上tls证书和用户名密码登录

    0. 准备两个vm:   node1, node2

        两个vm的 /etc/hosts加上   192.168.x.x  node1.org

        node1.org就是registry用的域名。

    2020.6.27

    node1上操作

    1. 新建两个目录:  /opt/registry/certs, opt/registry/auth, 分别存放证书和用户密码文件

        取registry image: 

        # docker pull registry:2

    2. 下载htpasswd

        因为新的registry没有htpasswd命令(是指运行的registry的容器里没有htpasswd,或许我没有找到),所以自己下载,这个不是在容器里运行,是在vm。

        然后用htpasswd生成用户名和密码文件

        # yum install httpd-tools -y

    3. 生成htpasswd:
       # htpasswd -Bbn tom 12345678 > htpasswd
       前一个htpasswd是命令,后面一个htpasswd是生成的用户名密码文件,然后把这个密码文件htpasswd, 放到 /opt/registry/auth里

       (网上有很多是这样的: docker run --entrypoint htpasswd registry:2 -Bbn testuser password > auth/htpasswd

       这个命令行是指运行docker容器里的 htpasswd命令。但在我的vm上报错: "exec: "htpasswd": executable file not found in $PATH": unknown.

       或许原先的registry版本有这个命令,现在没有了。)


    4. 生成证书和key:
       # openssl req -newkey rsa:4096 -nodes -sha256 -keyout registry.key -x509 -days 99999 -out registry.crt
       。。。
       common name: node1.org

       。。。

       不能只写node1, 最好后面加上.org, .com之类。不然docker push node1/alpine, 会认为往docker.io 上推。即使docker login node1也不行。

       但如果是docker push node1.org/alpine, 在docker login的情况下,就会往私有仓库上推。

       可以用这个命令查看证书:

        openssl x509 -in registry.crt -noout -text

        然后要将registry.key registry.crt 挪到 /opt/registry/certs

     


    5. 启动registry

    docker run -d -p 443:443
    --restart=always
    --name registry
    -v /opt/registry/certs:/certs
    -v /opt/registry/auth:/auth
    -e REGISTRY_HTTP_ADDR=0.0.0.0:443
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt
    -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key
    -e REGISTRY_AUTH=htpasswd
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
    registry:2


    想要登录registry的docker(也就是node2):
    1. 新建/etc/docker/certs.d/node1.org, 把node1的registry.crt copy到这个文件夹。
    2. docker login node1.org
    3. docker pull alpine
       docker tag alpine node1.org/alpine
       docker push node1.org/alpine
    4. 其它的vm,也要有/etc/docker/certs.d/node1.org/registry.crt, 就可以 docker pull了。

    浏览器访问:  https://192.168.x.x/v2/_catalog

    总结一下:

    域名要和证书的common name一样, 域名也要在/etc/hosts 解析。域名要有.com, .org之类的。

    htpasswd 只要知道里面的用户名和密码,可以管别人要一个,或按上面的说明自己做一个。

    ** 防火墙要开 443

    2020.9.12 加:

    在华为云有个ecs, 想着用公网体验一下docker registry, 结果按上面弄,访问不了。网上又查了一遍,解决如下:

    (核心思想就是证书里要加上registry的所在服务器的 IP)

    生成私钥
    # openssl genrsa -out registry.key 4096  

    生成证书签名请求 Certificate Signing Request (CSR)
    使用了 -subj, 就不会一行一行地问你了,CN: Common Name
    # openssl req -new -key registry.key -subj "/CN=119.3.234.x" -out registry.csr  (119.3.234.x换成你自己的ip),

    生成自签名证书:
    要先准备一个extfile.cnf, 里面就一行内容:
    subjectAltName = IP:119.3.234.x    (119.3.234.x换成你自己的ip),

    # openssl x509 -req -days 9999 -in registry.csr -signkey registry.key -out registry.crt -extfile extfile.cnf
     

    客户端docker:
    同样,要在client边的docker下建一个目录/etc/docker/certs.d/119.3.234.x  (119.3.234.x换成你自己的ip),
    把自签名的证书registry.crt放在里面才能问题。

  • 相关阅读:
    Python中文乱码
    Python读写Excel
    Image File Execution Options(2)
    Image File Execution Options(转)
    IndentationError: unexpected indent python
    java中class.forName和classLoader加载类的区分
    vi 新建编辑文件时报错 E212 can’t open file for writing
    JAVA NIO 之ByteBuffer的mark、position、limit、flip、reset,get方法介绍
    从0x00到0xFF的含义以及二进制到10进制的转换(转)
    java匿名内部类之RocketMQ中的应用
  • 原文地址:https://www.cnblogs.com/bear129/p/13197083.html
Copyright © 2011-2022 走看看