前言

主要分两部分来讲。 - 第一部分,主要讲如何生成证书。 - 更多细节可以看 Docker 官方教程 Protect the Docker daemon socket - 第二部分,主要讲如何部署。 - 基于 Docker Image falldawn/docker-remote-api-tls

证书

  1. 使用 OpenSSL 来创建证书。
  2. 创建 CA 私钥和公钥。

    openssl genrsa -aes256 -out ca-key.pem 4096
    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
    
  3. 创建服务器证书。

    openssl genrsa -out server-key.pem 4096
    openssl req -subj "/CN=<__HOST__>" -sha256 -new -key server-key.pem -out server.csr
    echo subjectAltName = DNS:<__HOST__>,IP:<__HOST_IP__> >> extfile.cnf
    echo extendedKeyUsage = serverAuth >> extfile.cnf
    openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
    
  4. 创建客户端证书。

    openssl genrsa -out key.pem 4096
    openssl req -subj '/CN=client' -new -key key.pem -out client.csr
    echo extendedKeyUsage = clientAuth > extfile-client.cnf
    openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
    
  5. 清除配置

    rm -v client.csr server.csr extfile.cnf extfile-client.cnf
    
  6. 设置权限

    chmod -v 0400 ca-key.pem key.pem server-key.pem
    chmod -v 0444 ca.pem server-cert.pem cert.pem
    

    部署

  7. ca.pemserver-cert.pemserver-key.pem 上传至 <__CERTS_PATH__>

  8. 使用 docker 部署

    • 使用 docker run 部署。

      docker run -d --name docker-remote-api-tls \
          -p 2376:443 \
          -v <__CERTS_PATH__>:/etc/nginx/certs:ro \
          -v /var/run/docker.sock:/var/run/docker.sock:ro \
          falldawn/docker-remote-api-tls:latest
      
    • 使用 docker compose 部署。

      version: '3'
      services:
      api:
          image: falldawn/docker-remote-api-tls:latest
          container_name: docker-remote-api-tls
          ports: 
              - 2376:443
          volumes: 
              - <__CERTS_PATH__>:/etc/nginx/certs:ro
              - /var/run/docker.sock:/var/run/docker.sock:ro
      

测试

如果显示 docker version 信息,并没有产生错误。则部署成功。

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=<__HOST__>:2376 version