本文介绍两种场景下的连接配置方法:
在开始配置之前,请确保满足以下基础条件:
| 条件 | 要求 |
|---|---|
| 本地环境 | 已安装 Docker CLI(通过 docker --version 验证),无需安装 Docker Daemon |
| 远程服务 | Docker 服务正常运行(systemctl status docker),当前用户有权限访问 /var/run/docker.sock(通常需加入 docker 组) |
| 网络环境 | 本地能访问远程服务器的对应端口(SSH 默认 22,TCP 自定义端口如 2375/2376) |
根据安全需求和网络环境,三种连接方式对比如下:
| 连接方式 | 安全性 | 服务端配置复杂度 | 适用场景 |
|---|---|---|---|
| SSH隧道 | ★★★★★(SSH加密) | 无需额外配置 | 开发测试、日常管理(首选) |
| TCP明文 | ★☆☆☆☆(极低) | 中(修改配置 + 开放端口) | 仅限内网隔离测试环境 |
| TCP + TLS | ★★★★★(TLS加密) | 高(生成证书 + 修改配置 + 开放端口) | 生产环境、跨公网访问 |
根据选择的连接方式,在远程服务器上进行相应配置。
SSH 是管理远程 Docker 最安全、最便捷的方式,尤其适合公有云 ECS 或需要穿越防火墙的场景。SSH 方式复用现有的 SSH 基础设施(密钥认证、加密通道),无需额外配置 TLS 证书,Docker 服务端无需任何额外配置。只需确保:
SSH免密登录的核心原理是采用非对称加密算法,生成一对秘钥,它通过客户端的私钥和服务器端的公钥进行身份配对,从而代替传统的密码输入。
ssh-keygen -t rsa -b 4096
# 1. 创建 .ssh 目录(如果不存在)
mkdir -p ~/.ssh
# 2. 将公钥内容追加到 authorized_keys 文件
echo "这里粘贴你刚刚复制的公钥内容" >> ~/.ssh/authorized_keys
# 3. 设置正确的权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 4. 退出服务器
exit
ssh-keygen -t rsa -b 4096
ssh-copy-id -i ~/.ssh/id_rsa.pub username@remote_host
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
默认情况下,OpenSSH 服务要求服务器端存储公钥的文件必须命名为 authorized_keys,不能随意更改。如需自定义文件名:
📌 即使修改了文件名,文件仍需放在对应用户家目录的 .ssh 文件夹下,且必须严格遵守权限要求:.ssh 目录权限为 700,公钥文件权限为 600
完成上述步骤后,在本地终端尝试连接远程服务器:
ssh username@remote_host
如果无需输入密码直接进入服务器系统,则说明配置成功!
TCP 明文远程连接指采用了非加密模式对外提供服务。Docker默认开启 TCP 2375 端口且不加 TLS 加密意味着任何能访问该端口的人都可以完全控制你的 Docker 守护进程(相当于拥有 root 权限),此方式所有数据(含敏感信息)明文传输,严禁用于生产环境或跨公网访问。
Docker 默认只监听 Unix Socket (/var/run/docker.sock)。要开启 TCP 远程连接,需修改启动参数。
这是官方推荐的配置方式,避免直接修改 systemd 服务文件导致升级冲突。
sudo vim /etc/docker/daemon.json
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://0.0.0.0:2375"
]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
此方式只适用于使用systemd的Linux发行版。
sudo systemctl edit docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
sudo systemctl daemon-reload
sudo systemctl restart docker.service
配置完成后,检查Docker是否正在监听目标端口。
sudo netstat -lntp | grep dockerd
应能看到类似 tcp 0 0 0.0.0.0:2375 0.0.0.0:* LISTEN 的输出。
如果服务器开启了防火墙,需要放行对应端口。
sudo ufw allow 2375/tcp && sudo ufw reload
sudo firewall-cmd --zone=public --add-port=2375/tcp --permanent && sudo firewall-cmd --reload
当必须使用 TCP 且需要保证安全性时(如跨公网访问),务必启用 TLS 加密。要实现 Docker 的 TCP SSL(通常称为 TLS)远程安全连接,需要经历生成证书、配置服务端、客户端连接三个主要步骤。
我们需要在 Docker 服务器上,使用OpenSSL工具为服务端和客户端生成自签名证书。
mkdir -p /etc/docker/certs
cd /etc/docker/certs
openssl genrsa -aes256 -out ca-key.pem 4096
ca-key.pem(需要输入你设定的密码),并生成一个有效期为 10 年(3650天)的根证书 ca-cert.pem。openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=192.168.1.7" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = IP:192.168.1.7,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 3650 -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 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
rm -v client.csr server.csr extfile.cnf
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
[root@localhost certs]# openssl x509 -in ca.pem -noout -dates
notBefore=Aug 18 09:35:45 2026 GMT
notAfter=Aug 15 09:35:45 2036 GMT
假设您已经在/etc/docker/certs/ 目录下生成好了服务端证书文件,现在需要在服务端配置ssl证书位置,让Docker支持TLS连接。服务端需要配置的证书如下:
sudo vi /etc/docker/daemon.json
把里面的内容修改或添加为:
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/server-cert.pem",
"tlskey": "/etc/docker/certs/server-key.pem"
}
在现代 Linux 系统中,Systemd 的默认启动命令会和 daemon.json 中的 hosts 冲突。我们需要做个小修改:
sudo systemctl edit docker.service
在打开的空文件中,输入以下内容并保存:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
sudo systemctl daemon-reload
sudo systemctl restart docker
firewall-cmd --zone=public --add-port=2376/tcp --permanent
firewall-cmd --reload
服务端配置完成后,回到本地终端,进行客户端侧的配置。
docker -H ssh://<用户名>@<远程IP> ps
示例:docker -H ssh://root@192.168.1.7 ps
docker context create ssh-docker --docker "host=ssh://anyfork@192.168.1.7"
docker context use ssh-docker
docker info
docker context create ssh-docker --docker "host=ssh://root@192.168.1.7?identity_file=~/.ssh/custom_key"
docker context use default
docker -H tcp://<远程IP>ps
示例:docker -H tcp://192.168.1.7:2375 ps
docker context create tcp-docker --description "虚拟机远程Docker-TCP" --docker "host=tcp://192.168.1.7:2375"
docker context use tcp-docker
docker info
docker context use default
在客户端(您的本地电脑)上,您需要用到之前在服务器生成的这 3 个文件:ca.pem、cert.pem(客户端公钥)、key.pem(客户端私钥)。
docker -H tcp://192.168.1.7:2376 --tlsverify --tlscacert=C:/Users/Administrator/.docker/certs/ca.pem --tlscert=C:/Users/Administrator/.docker/certs/cert.pem --tlskey=C:/Users/Administrator/.docker/certs/key.pem version
如果能正确打印出服务器的 Docker 版本信息,说明配置大功告成!
source ~/.bashrc 生效。
export DOCKER_HOST=tcp://服务器IP:2376
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=~/.docker/certs/
[Environment]::SetEnvironmentVariable("DOCKER_HOST", "tcp://服务器IP:2376", "User")
[Environment]::SetEnvironmentVariable("DOCKER_TLS_VERIFY", "1", "User")
[Environment]::SetEnvironmentVariable("DOCKER_CERT_PATH", "C:/Users/Administrator/.docker/certs", "User")
docker context create tcp-docker-tls --description "虚拟机远程Docker-TCP-TLS" --docker "host=tcp://192.168.1.7:2376,ca=C:/Users/Administrator/.docker/certs/ca.pem,cert=C:/Users/Administrator/.docker/certs/cert.pem,key=C:/Users/Administrator/.docker/certs/key.pem"
docker context ls
docker context use tcp-docker-tls
docker --context tcp-docker-tls ps
在 VS Code 中,Container Tools 是微软官方推出的 Docker 可视化扩展插件,已取代旧版 Docker 扩展。这个插件可通过图形界面形式直观地管理本地或远程的容器、镜像、卷、网络、Docker Context 及 Compose 项目,并支持右键快捷操作(启动/停止、查看日志等)。
激活后,左侧活动栏会出现容器图标(🐳),点击即可打开 Docker 管理面板。
安装并激活插件后,点击容器图标,你会发现可视化页面上没有任何容器、镜像信息——那是因为Container Tools 插件还没有配置可连接的 Docker 服务信息。
如果你本地没有Docker Cli客户端,你可以在 VScode 的settings.json文件中为Container Tools 插件配置DOCKER_HOST环境变量,通过DOCKER_HOST环境变量设置Docker服务端的连接地址,详细配置如下:
{
"containers.environment": {
"DOCKER_HOST": "tcp://192.168.1.7:2375"
}
}
然后重启 VSCode,插件便会连接上对应的 Docker 服务端,同时也能获取到容器、镜像等信息。
在管理面板的 DOCKER CONTEXTS 菜单中,会列出本地所有已创建的 Docker Context(如 ssh-docker、tcp-docker、tcp-docker-tls 等):
| 操作 | 命令 |
|---|---|
| 查看当前 Context | docker context show |
| 列出所有 Context | docker context ls |
| 切换 Context | docker context use |
| 删除 Context | docker context rm <名称> |
| 更新 Context 配置 | docker context update <名称> --docker host=... |
| 临时使用指定 Context 执行命令 | docker --context <名称> ps |
| 问题现象 | 可能原因 | 解决建议 |
|---|---|---|
| Cannot connect to the Docker daemon | 远程Docker未启动或端口不通 | 检查systemctl status docker;检查防火墙和云安全组 |
| ssh: handshake failed | SSH免密登录未配置 | 先用ssh user@host测试能否免密登录;检查identity_file路径 |
| certificate signed by unknown authority | 客户端未信任CA证书 | 检查--tlscacert路径和证书文件是否正确 |
| permission denied | 远程用户不在docker组 | 执行sudo usermod -aG docker $USER并重新登录 |
| Context切换后未生效 | 当前context未正确切换 | 执行docker context show确认,重新use或重启终端 |
| VSCode不显示Context | 插件未激活或未安装 | 确认已安装Container Tools扩展;重启VSCode |
无论使用终端还是 VSCode,统一通过 docker context 管理所有连接配置。docker context 将连接信息持久化,支持一键切换,让本地、远程、云端等多环境管理变得非常轻松。
| 连接方式 | 服务端配置 | 客户端配置 | 安全性 | 推荐场景 |
|---|---|---|---|---|
| SSH隧道 | 无需额外配置(复用现有SSH服务) | docker context create dev -H ssh://user@host | ★★★★★ | 开发测试、日常管理(首选方案) |
| TCP明文 | 修改daemon.json + 开放2375端口 | docker context create dev -H tcp://host:2375 | ☆☆☆☆☆ | 仅限内网隔离测试 |
| TCP + TLS | 生成证书 + 修改配置 + 开放 2376 端口 | docker context create dev -H tcp://host:2376 --docker ca=... | ★★★★★ | 生产环境、跨公网访问 |