Docker 开启远程连接和安全访问

by kingzcheung on September 23, 2018

通常默认的情况下,Docker是以本地的unix套接字运行的,但是假如我们需要远程连接访问呢?比如通过 Portainer 来连接多个服务器上的Docker进行统一管理。

事实上,Docker 有官方教程教你怎么去设置: https://docs.docker.com/engine/security/https/

如果我们要开启远程连接,肯定需要一种安全的验证方式,Docker 使用的是TLS 验证,我们可以使用服务器自带的openssl来生成所需要的证书,以下代码可以生成TLS所需要的证书:

mkdir server-ca && cd server-ca

openssl genrsa -aes256 -out ca-key.pem 4096

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

openssl genrsa -out server-key.pem 4096

openssl req -subj "/CN=8.8.8.8" -sha256 -new -key server-key.pem -out server.csr

echo subjectAltName = DNS:8.8.8.8,IP:10.10.10.20,IP:127.0.0.1 >> 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

  openssl genrsa -out key.pem 4096

openssl req -subj '/CN=client' -new -key key.pem -out client.csr

echo extendedKeyUsage = clientAuth >> extfile.cnf

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem  -CAcreateserial -out cert.pem -extfile extfile.cnf

rm -v client.csr server.csr

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

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

extfile.cnf 上面的脚本还穿插着extfile.cnf的编辑

  • subjectAltName: 主题名称
  • extendedKeyUsage: 扩展密钥用法

修改Docker 启动参数

有两种方式启动Docker:

指令:

dockerd  --tlsverify=true \
 --tlscacert=/home/youname/docker-ssh/ca.pem  \
 --tlscert=/home/youname/docker-ssh/server-cert.pem  \
 --tlskey=/home/youname/docker-ssh/server-key.pem  \
 --host tcp://0.0.0.0:2376  \
 --host unix:///var/run/docker.sock

daemon.json

{
 "tlsverify": true,
  "tlscacert": "/home/youname/server-ca/ca.pem",
  "tlscert": "/home/youname/server-ca/server-cert.pem",
  "tlskey": "/home/youname/server-ca/server-key.pem",
  "hosts": ["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

此文件默认是不存在的,docker的镜像地址也是通过此文件修改的。

最后重启 Docker:

$ sudo systemctl restart docker

Portainer 配置远程连接

Portainer 的Endpoints功能可以添加多个docker服务器。只需要把 Endpoint URLPublic IPTLS 填写上即可。 TLS的证书就是上面所生成的ca.pem,cert.pemkey.pem