背景介绍:因为NAS使用的CPU Xeon W-2140B没带集显,主板集成的显卡ASPEED性能可以忽略,因此没法在jellyfin里使用硬解。虽然测试了一下,靠CPU软解可以支持一路4K到4K重编码流畅观看,但此时CPU使用率已经接近100%。于是还是决定把jellykin放到装有Core i3 8100T的ESXi虚拟出的Ubuntu上。为了方便管理两台机器上的Docker,想让运行在NAS上的Portainer连接到新的Docker Daemon上。

实际上,Docker于18.09版本开始已经支持SSH连接,奈何Portainer明确表示不会支持,还是只能用TCP+TLS保护的连接方式。配置本身不算复杂,本文就是做个简单的记录。先放出参考资料:

生成证书

通常别的教程这一步会用OpenSSL,我这里推荐一个工具XCA,这是一个图形化界面的证书管理工具,用来管理小范围使用的秘钥和证书很方便,我已经用了几年了。

需要生成的秘钥和证书有:

  • CA证书,Docker Daemon和Portainer都需要
  • 服务器使用的密钥和证书,配置在Docker Daemon上
  • 客户端认证使用的密钥和证书,配置在Portainer上

服务器证书和客户端证书均需使用CA证书签名。服务器证书的SAN需要和使用到的DNS或者IP匹配。

配置Docker Daemon

编辑/etc/docker/daemon.json

{
    "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
    "tls": true,
    "tlscacert": "/opt/container-data/docker-certs/ca.crt",
    "tlscert": "/opt/container-data/docker-certs/server-cert.crt",
    "tlskey": "/opt/container-data/docker-certs/server-key.pem",
    "tlsverify": true
}

这里踩了个坑,当使用systemd管理Docker时,默认的Unit启动是带有-H参数的,而官方文档里明确写了:

If you use a daemon.json file and also pass options to the dockerd command manually or using start-up scripts, and these options conflict, Docker fails to start with an error such as: …

因此还需要编辑/lib/systemd/system/docker.service,将其中的启动参数-H fd://删去,然后重启服务:

sudo systemctl daemon-reload
sudo systemctl start docker

服务器端配置完成。

配置Portainer

Portainer的配置就很简单了,Settings -> Environments -> Add Environment,选择Docker Directly connect to the Docker API。后面都是图形操作,上传CA证书,客户端秘钥和证书,就好了。