优雅地暴露Docker远程API

起因

最近在使用 portainer 管理多个机器上的 Docker 的时候,需要开启 docker 的远程 api 访问,但是如果直接开启的话会直接暴露到公网,容易被扫端口然后入侵机器,而自己生成 tls 证书什么的又比较麻烦,于是在 Google 搜索中发现了一个项目,https://github.com/kekru/docker-remote-api-tls

简介

简单看了一下项目的介绍,其实就是通过容器内部的 nginx 对挂载进容器的docker.sock做了反代,并且提供了自动生成证书的功能,还不错,虽然只有几十颗星,不过正是我想要的。

部署

项目本身是一个 docker 项目,使用docker-compose就可以启动,并且项目里面也提供了示例。

version: "3.4"
services:
  remote-api:
    image: kekru/docker-remote-api-tls:v0.4.0
    ports:
      - 2376:443
    environment:
      - CREATE_CERTS_WITH_PW=supersecret
      - CERT_HOSTNAME=remote-api.example.com
    volumes:
      - <local cert dir>:/data/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro
  • CREATE_CERTS_WITH_PW: 证书密码,随便设置一个就行。
  • CERT_HOSTNAME:证书的域名,需要和 portainer 里面的域名保持一直,不过好像不支持 ip,只能用域名。

然后执行docker compose up -d就启动了。

证书

启动后会在<local cert dir>生成证书文件,使用client子目录下面的文件就可以通过 api 连接了。

目录结构大概是这样:

❯ tree certs/
certs/
├── ca-cert.pem
├── ca-key.pem
├── client
│   ├── ca.pem
│   ├── cert.pem
│   └── key.pem
├── server-cert.pem
└── server-key.pem

1 directory, 7 files