Docker 开启TLS,使用tcp访问
官方教程: https://docs.docker.com/engine/security/protect-access/
1. 生成密钥
执行下面的命令
dockerhub036/dockertls 这个镜像在提供 SERVER 环境变量后将会自动生成相关密钥文件
sudo docker run --rm \
-e SERVER=<server的IP> \
-v /etc/docker/certs/:/dcert \
dockerhub036/dockertls
# 使用 -v /etc/docker/certs/:/dcert 如此挂载的化,相关文件会生成后会直接存储在/etc/docker/certs/文件夹中,下面的配置就不需要再做改动
2. 修改配置
然后修改 /etc/docker/daemon.json
# docker 启动时会加载这个配置文件,添加如下配置
{
"hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"],
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/server-cert.pem",
"tlskey": "/etc/docker/certs/server-key.pem"
}
因为 默认使用systemed
启动的docker 默认再service 文件中写了 启动时 hosts 参数,所以要删除
# cat /usr/lib/systemd/system/docker.service
# 找到下面这行
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 修改为下面形式,即删除到 -H 后面的东西
ExecStart=/usr/bin/dockerd
最后重启一下Docker
3. 测试
使用下面的语句测试
sudo docker --tlsverify \
--tlscacert=ca.pem \
--tlscert=cert.pem \
--tlskey=key.pem \
-H=<server的IP>:2376 version
基本可以看到如下类似输出
Client: Docker Engine - Community
Version: 27.5.1
API version: 1.47
Go version: go1.22.11
Git commit: 9f9e405
Built: Wed Jan 22 13:41:31 2025
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 27.5.1
API version: 1.47 (minimum version 1.24)
Go version: go1.22.11
Git commit: 4c9b3b0
Built: Wed Jan 22 13:41:31 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.25
GitCommit: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
runc:
Version: 1.2.4
GitCommit: v1.2.4-0-g6c52b3f
docker-init:
Version: 0.19.0
GitCommit: de40ad0
使用 Python API
import docker
# 配置 TLS 连接
tls_config = docker.tls.TLSConfig(
ca_cert='certs/ca.pem',
client_cert=('certs/cert.pem', 'certs/key.pem'),
verify=True
)
# 连接远程 Docker 守护进程
client = docker.DockerClient(base_url='tcp://<server的IP>:2376', tls=tls_config)
# 获取 Docker 版本信息
version_info = client.version()
print(version_info)
client.close()