Skip to content

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

sudo systemctl daemon-reload && sudo systemctl start 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()