基于操作系统:CentOS 8.4

  1. 更换为阿里云的镜像加速器。
    https://ve6vojmd.mirror.aliyuncs.com

  2. 修改/etc/docker/daemon.json文件:

    vim /etc/docker/daemon.json

    以下内容:

    {
    "log-driver":"json-file",
    "log-opts": {"max-size":"50m", "max-file":"3"},
    "registry-mirrors": ["https://ve6vojmd.mirror.aliyuncs.com"]
    }
  3. Docker开启远程API:

    用vim编辑器修改docker.service文件:

    vim /usr/lib/systemd/system/docker.service
需要修改的部分:
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的部分:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
  1. 重启docker:

    sudo systemctl daemon-reload
    sudo systemctl restart docker
  2. 下载registry:2.5镜像

    docker pull registry:2.5
  3. 创建用于持久化保存仓库中的镜像目录及相关配置。

    mkdir -p /data/registry
    mkdir -p /data/registry/auth
    mkdir -p  /data/registry/config
  1. 生成账号密码:

    docker run --entrypoint htpasswd registry:2.5 -Bbn name password  >> /data/registry/auth/htpasswd
  2. 设置配置文件:

    vim  /data/registry/config/config.yml

    以下内容:

    version: 0.1
    log:
      fields:
        service: registry
    storage:
      delete:
        enabled: true
      cache:
        blobdescriptor: inmemory
      filesystem:
        rootdirectory: /var/lib/registry
    http:
      addr: :5000
      headers:
        X-Content-Type-Options: [nosniff]
    health:
      storagedriver:
        enabled: true
        interval: 10s
    threshold: 3
  3. 启动镜像:

    docker run -d -p 5000:5000 --restart=always  --name=registry \
      -v /data/registry/config/:/etc/docker/registry/ \
      -v /data/registry/auth/:/auth/ \
      -e "REGISTRY_AUTH=htpasswd" \
      -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
      -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
      -v /data/registry/:/var/lib/registry/ \
    registry:2.5
  4. 开启 http 形式访问私有仓库模式:

    vim /etc/docker/daemon.json

    加入以下内容:127.0.0.1换成你自己的IP。

     {"insecure-registries":["127.0.0.1:5000"]}
  1. 重启docker:

    sudo systemctl daemon-reload
    sudo systemctl restart docker

    由于端口暴露在外网,考虑安全性增加ca证书验证。

  2. 创建存放证书的目录:

    mkdir /data/docker-ca && cd /data/docker-ca
  3. 创建CA证书私钥,期间需要输入两次用户名和密码,生成文件为ca-key.pem;

    openssl genrsa -aes256 -out ca-key.pem 4096
  4. 根据私钥创建CA证书,期间需要输入上一步设置的私钥密码,生成文件为ca.pem;

    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
  5. 创建服务端私钥,生成文件为server-key.pem;

    openssl genrsa -out server-key.pem 4096
  6. 创建服务端证书签名请求文件,用于CA证书给服务端证书签名,生成文件server.csr;

    openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
  7. 创建CA证书签名好的服务端证书,期间需要输入CA证书私钥密码,生成文件为server-cert.pem;

    openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
  8. 创建客户端私钥,生成文件为key.pem;

    openssl genrsa -out key.pem 4096
  9. 创建客户端证书签名请求文件,用于CA证书给客户证书签名,生成文件client.csr;

    openssl req -subj "/CN=client" -new -key key.pem -out client.csr
  10. 为了让秘钥适合客户端认证,创建一个扩展配置文件extfile-client.cnf;

    echo extendedKeyUsage = clientAuth > extfile-client.cnf
  11. 创建CA证书签名好的客户端证书,期间需要输入CA证书私钥密码,生成文件为cert.pem;

    openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
  12. 删除创建过程中多余的文件;

    rm -rf ca.srl server.csr client.csr extfile-client.cnf
  13. 最终生成文件如下,有了它们我们就可以进行基于TLS的安全访问了。

    ca.pem CA证书
    ca-key.pem CA证书私钥
    server-cert.pem 服务端证书
    server-key.pem 服务端证书私钥
    cert.pem 客户端证书
    key.pem 客户端证书私钥
  14. 配置Docker支持TLS,用vim编辑器修改docker.service文件;

    vim /usr/lib/systemd/system/docker.service
  15. 修改以ExecStart开头的配置,开启TLS认证,并配置好CA证书、服务端证书和服务端私钥,修改内容如下;

    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/data/docker-ca/ca.pem --tlscert=/data/docker-ca/server-cert.pem --tlskey=/data/docker-ca/server-key.pem -H unix://var/run/docker.sock --data-root /data/docker
  16. 重启Docker服务,这样我们的Docker服务就支持使用TLS进行远程访问了!

    systemctl daemon-reload
    systemctl restart docker
  17. 下载证书:

    ca.pem CA证书
    cert.pem 客户端证书
    key.pem 客户端证书私钥

    代码中已集成
    使用docker-maven-plugin来打包Docker镜像:
    注意:一定要加https。开启TLS不再支持http了,需要改用https,修改配置为https。否则报: HTTP 400 Bad Request

    <dockerHost>https://192.168.3.101:2375</dockerHost>
    <dockerCertPath>D:\docker-ca</dockerCertPath>    #本机存放证书密码的目录
文档更新时间: 2024-01-23 11:01   作者:随商信息技术(上海)有限公司