Docker Remote API 并配置 TLS

一、 Docker Server 开启 remote api

注意:
方法一和方法二冲突, 只需要配置一个即可

1.1 方法一、 编辑 docker.service

ExecStart=/usr/bin/dockerd -H fd:// \
-H tcp://0.0.0.0:2375 \
-H unix://var/run/docker.sock \
--containerd=/run/containerd/containerd.sock

1.2 方法二、 编辑 /etc/docker/daemon.json

{
"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"]
}

1.3 验证 remote api 是否开启

docker -H tcp://0.0.0.0:2375 version

二、 开启TLS

注意:
docker server 主机上执行

2.1 生成 CA 私钥

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

2.2 生成 CA 证书

openssl req -new -x509 -days 365 -sha256 \
-key ca-key.pem \
-out ca.pem \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=dockerapi/OU=dockerspi/CN=$HOST"

2.3 生成 Server 私钥

openssl genrsa -out server-key.pem 4096

2.4 生成 Server 证书请求

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

echo subjectAltName = DNS:$HOST,IP:192.168.1.201,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf

2.5 使用 CA证书 签署证书

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

2.6 修改 service 文件

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 \
--tlsverify \
--tlscacert=/etc/docker/ssl/ca.pem \ # ca 证书
--tlscert=/etc/docker/ssl/server-cert.pem\ # server 证书
--tlskey=/etc/docker/ssl/server-key.pem # server 私钥

systemctl daemon-reload
systemctl restart docker

三、 客户端配置

注意:
docker client 主机上执行

3.1 生成 client 私钥

openssl genrsa -out client-key.pem 4096

3.2 生成 client 证书请求

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

3.3 使用 CA 签署证书

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

3.4 访问验证

docker --tlsverify  \
--tlscacert=ca.pem \
--tlscert=client-cert.pem \
--tlskey=client-key.pem \
-H=192.168.1.201:2376 version

3.5 配置全局docker变量

mkdir -pv ~/.docker
cp ./ca.pem ~/.docker/ca.pem
cp ./client-cert.pem ~/.docker/cert.pem
cp ./client-key.pem ~/.docker/key.pem
export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1

配置完成之后可以直接使用 docker ps 查看

四、 相关问题

4.1 cannot validate certificate for xx.xx.xx.xx because it doesn’t contain any IP SANs

解决: 证书生成的过程中要指定ip, 参照docker