如何连接远程Docker服务

2026-07-28 10:06:00
4385字
24.4分钟
在日常开发或测试中,我们经常需要在本地开发环境中直接操作远程 Docker 服务——执行镜像构建、容器启停等命令,效果与直接在远程服务器上操作完全一致。这能极大提升调试与部署效率,同时避免频繁登录远程服务器的繁琐。

本文介绍两种场景下的连接配置方法:

  • 场景一: 本地终端(命令行)连接远程 Docker。
  • 场景二: VSCode 通过 Container Tools 插件连接远程 Docker。
核心建议:无论哪种场景,均推荐使用 Docker Context 统一管理连接配置,实现多环境一键切换。如需深入了解 Docker Context 的详细用法,请访问对应章节。

1. 通用前置条件

在开始配置之前,请确保满足以下基础条件:

条件要求
本地环境已安装 Docker CLI(通过 docker --version 验证),无需安装 Docker Daemon
远程服务Docker 服务正常运行(systemctl status docker),当前用户有权限访问 /var/run/docker.sock(通常需加入 docker 组)
网络环境本地能访问远程服务器的对应端口(SSH 默认 22,TCP 自定义端口如 2375/2376)

2. 连接方案选型

根据安全需求和网络环境,三种连接方式对比如下:

连接方式安全性服务端配置复杂度适用场景
SSH隧道★★★★★(SSH加密)无需额外配置开发测试、日常管理(首选)
TCP明文★☆☆☆☆(极低)中(修改配置 + 开放端口)仅限内网隔离测试环境
TCP + TLS★★★★★(TLS加密)高(生成证书 + 修改配置 + 开放端口)生产环境、跨公网访问
强烈建议:除非有特殊原因,优先选择 SSH 方式,安全且无需额外配置。

3. 服务端配置

根据选择的连接方式,在远程服务器上进行相应配置。

3.1 SSH 隧道方式

SSH 是管理远程 Docker 最安全、最便捷的方式,尤其适合公有云 ECS 或需要穿越防火墙的场景。SSH 方式复用现有的 SSH 基础设施(密钥认证、加密通道),无需额外配置 TLS 证书,Docker 服务端无需任何额外配置。只需确保:

  • 远程服务器已开启 SSH 服务(默认 22 端口)且用户有权限访问 Docker socket。
  • 本地已配置好 SSH 免密登录(使用密钥对),因为 Docker CLI 在非交互环境下无法输入密码。

3.1.1 配置SSH免密登录

SSH免密登录的核心原理是采用非对称加密算法,生成一对秘钥,它通过客户端的私钥和服务器端的公钥进行身份配对,从而代替传统的密码输入。

  1. Windows 系统: Windows 10/11 系统通常已内置 OpenSSH 客户端,可以直接使用。
  • 生成 SSH 密钥对(如果还没有)
    • 以管理员身份打开 PowerShell,执行生成密钥命令:
    ssh-keygen -t rsa -b 4096
    
    • 全程按 Enter 键采用默认值(含空密码)。执行完成后会在 C:\Users<你的用户名>.ssh 目录下生成 id_rsa私钥 和 id_rsa.pub公钥。
  • 将公钥手动上传到远程服务器
    # 1. 创建 .ssh 目录(如果不存在)
    mkdir -p ~/.ssh
    
    # 2. 将公钥内容追加到 authorized_keys 文件
    echo "这里粘贴你刚刚复制的公钥内容" >> ~/.ssh/authorized_keys
    
    # 3. 设置正确的权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    
    # 4. 退出服务器
    exit
    
  1. Linux / macOS 系统
  • 生成 SSH 密钥对(如果还没有)
    • 打开终端(Terminal),运行以下命令
    ssh-keygen -t rsa -b 4096
    
    • 整个执行过程直接按 Enter 键,一切采用默认值,包括空密码——因为 Docker 无法交互式输入密码,设置密码会导致连接失败。执行完成后会在 ~/.ssh 目录下生成 id_rsa(私钥)和 id_rsa.pub(公钥)。
  • 将公钥复制到远程服务器: 你需要将本地的公钥(id_rsa.pub 文件)内容,追加到远程服务器对应用户家目录的 ~/.ssh/authorized_keys 文件中。根据你使用的操作系统,选择以下任意一种最方便的方法:
    • 方法 A: 使用 ssh-copy-id 自动复制(最推荐,简单安全),Linux 自带该工具。macOS 用户若未安装,可先通过 Homebrew 运行 brew install ssh-copy-id 安装。
    ssh-copy-id -i ~/.ssh/id_rsa.pub username@remote_host
    
    将 username 换为远程服务器用户名,remote_host 换为服务器的 IP 或域名。期间需要输入一次远程服务器的登录密码。
    • 方法 B: 通过一条复合命令手动复制,如果不想安装新工具,直接在本地终端运行以下命令:
    cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
    

3.1.2 公钥命名注意事项

默认情况下,OpenSSH 服务要求服务器端存储公钥的文件必须命名为 authorized_keys,不能随意更改。如需自定义文件名:

  • 用管理员权限打开 /etc/ssh/sshd_config
  • 找到AuthorizedKeysFile配置项,把它的值修改为你想要的自定义文件名,比如AuthorizedKeysFile .ssh/my_custom_keys
  • 保存配置后重启SSH服务(执行systemctl restart sshd),之后SSH服务就会自动读取你指定的自定义名称的公钥文件完成认证。

📌 即使修改了文件名,文件仍需放在对应用户家目录的 .ssh 文件夹下,且必须严格遵守权限要求:.ssh 目录权限为 700,公钥文件权限为 600

3.1.3 测试免密登录

完成上述步骤后,在本地终端尝试连接远程服务器:

ssh username@remote_host

如果无需输入密码直接进入服务器系统,则说明配置成功!

3.2 TCP 明文方式

TCP 明文远程连接指采用了非加密模式对外提供服务。Docker默认开启 TCP 2375 端口且不加 TLS 加密意味着‌任何能访问该端口的人都可以完全控制你的 Docker 守护进程‌(相当于拥有 root 权限),此方式所有数据(含敏感信息)明文传输,严禁用于生产环境或跨公网访问。

注意:
  • 严禁‌在公网直接暴露未加密的 2375 端口。
  • 生产环境务必使用 ‌TLS 证书认证‌ 或通过 ‌SSH 隧道‌ 进行连接。
  • 如果仅在局域网测试,可以临时使用TCP 2375端口,但请确保防火墙限制了访问 IP,避免所有人都能访问。

3.2.1 修改 Docker 配置,开启 TCP 监听

Docker 默认只监听 Unix Socket (/var/run/docker.sock)。要开启 TCP 远程连接,需修改启动参数。

  1. 方法一:修改 daemon.json (推荐)

这是官方推荐的配置方式,避免直接修改 systemd 服务文件导致升级冲突。

  • 编辑或创建 /etc/docker/daemon.json 文件
sudo vim /etc/docker/daemon.json
  • 添加以下内容,配置同时监听本地Unix socket和TCP端口
{
    "hosts": [
        "unix:///var/run/docker.sock",
        "tcp://0.0.0.0:2375"
    ]
}
注意:tcp://0.0.0.0:2375 表示监听所有网络接口。生产环境建议替换为特定IP(如内网IP)以限制访问范围。
  • 重启Docker服务使配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 方法二:使用 systemd 覆盖文件

此方式只适用于使用systemd的Linux发行版。

  • 创建systemd覆盖文件
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

3.2.2 验证端口监听状态

配置完成后,检查Docker是否正在监听目标端口。

sudo netstat -lntp | grep dockerd

应能看到类似 tcp 0 0 0.0.0.0:2375 0.0.0.0:* LISTEN 的输出。

3.2.3 开放防火墙端口

如果服务器开启了防火墙,需要放行对应端口。

  • 如果虚拟机是 Ubuntu 系统:
sudo ufw allow 2375/tcp && sudo ufw reload
  • 如果虚拟机是 CentOS / RedHat 系统:
sudo firewall-cmd --zone=public --add-port=2375/tcp --permanent && sudo firewall-cmd --reload
注意:如果使用云服务器(如 AWS、阿里云等),还需在云平台的安全组中放行 2375 端口。

3.3 TCP + TLS 加密方式

当必须使用 TCP 且需要保证安全性时(如跨公网访问),务必启用 TLS 加密。要实现 Docker 的 TCP SSL(通常称为 TLS)远程安全连接,需要经历生成证书、配置服务端、客户端连接三个主要步骤。

3.3.1 生成CA证书与密钥

我们需要在 Docker 服务器上,使用OpenSSL工具为服务端和客户端生成自签名证书。

  1. 创建工作目录: 整个流程涉及大量命令,建议在操作前新建一个工作目录(如 /etc/docker/certs)来存放所有证书文件,方便管理。
mkdir -p /etc/docker/certs
cd /etc/docker/certs
  1. 创建 CA 根证书RSA私钥: 使用具有 AES-256 加密保护的 4096 位 RSA 算法,生成一个用于自建 CA 的高度安全私钥文件,此处需要两次输入密码,请务必记住该密码,在后面步骤会用到。
openssl genrsa -aes256 -out ca-key.pem 4096
  1. 创建 CA 根证书: 这条新命令会用到你刚创建的ca-key.pem(需要输入你设定的密码),并生成一个有效期为 10 年(3650天)的根证书 ca-cert.pem。
openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem
  1. 创建服务端私钥: 生成一个名为server-key.pem的服务端私钥
openssl genrsa -out server-key.pem 4096
  1. 创建服务端签名请求证书文件: 生成服务端证书签名请求 (server.csr),将 $HOST 替换为客户端用来连接服务器的域名或IP地址。
openssl req -subj "/CN=192.168.1.7" -sha256 -new -key server-key.pem -out server.csr
  1. 创建extfile.cnf的配置文件: 签署时,必须通过配置文件确保Subject Alternative Name (SAN)中包含服务器的所有访问地址。否则,客户端连接会因主机名不匹配而失败。其中IP地址改为自己服务器IP地址。
echo subjectAltName = IP:192.168.1.7,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
  1. 创建签名生效的服务端证书文件: 这一步会生成最终的服务端证书 server-cert.pem。
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
  1. 创建客户端私钥
openssl genrsa -out key.pem 4096
  1. 创建客户端签名请求证书文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
  1. extfile.cnf文件中增加配置
echo extendedKeyUsage = clientAuth >> extfile.cnf
  1. 创建签名生效的客户端证书文件
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
  1. 清理临时文件
rm -v client.csr server.csr extfile.cnf
  1. 为证书文件授权
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
  1. 查看证书有效期
[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

3.3.2 配置 Docker 服务启用 TLS

假设您已经在/etc/docker/certs/ 目录下生成好了服务端证书文件,现在需要在服务端配置ssl证书位置,让Docker支持TLS连接。服务端需要配置的证书如下:

  • ca.pem(CA 公钥)
  • server-cert.pem(服务器公钥)
  • server-key.pem(服务器私钥)
  1. 修改 Docker 配置文件: 打开或创建 Docker 的 daemon 配置文件:
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"
}
温馨提示:
  • hosts: 监听本地Unix Socket和所有网络接口的2376端口(TLS加密端口)。
  • tls & tlsverify: 开启TLS并进行客户端证书验证。
  • 后面的三个参数分别指定了CA证书、服务端证书和服务端私钥的路径。
  1. 修改 Systemd 启动服务

在现代 Linux 系统中,Systemd 的默认启动命令会和 daemon.json 中的 hosts 冲突。我们需要做个小修改:

sudo systemctl edit docker.service

在打开的空文件中,输入以下内容并保存:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
注:第一行留空是为了清除系统默认的启动参数,第二行使用干净的命令启动,这样 Docker 就会完全听从 daemon.json 的配置。
  1. 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 开放防火墙端口: 确保您的服务器放行了 2376 端口。
firewall-cmd --zone=public --add-port=2376/tcp --permanent
firewall-cmd --reload

4 本地终端连接远程 Docker

服务端配置完成后,回到本地终端,进行客户端侧的配置。

4.1 SSH 隧道方式

  1. 临时连接: 单次使用时,可以采用临时连接的方式。
docker -H ssh://<用户>@<远程IP> ps

示例:docker -H ssh://root@192.168.1.7 ps

  1. 持久化配置: 推荐使用Docker Context进行管理。
  • 直接使用下面命令创建一个名为ssh-docker,并且通过ssh连接远程docker端点的Docker Context。
docker context create ssh-docker --docker "host=ssh://anyfork@192.168.1.7"
  • 切换到该 Context
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

4.2 TCP 明文方式

  1. 临时连接: 单次使用时,可以采用临时连接的方式。
docker -H tcp://<远程IP>ps

示例:docker -H tcp://192.168.1.7:2375 ps

  1. 持久化配置: 推荐使用Docker Context进行管理。
  • 直接使用下面命令创建一个名为tcp-docker,并且通过tcp连接远程docker端点的Docker Context。
docker context create tcp-docker  --description "虚拟机远程Docker-TCP" --docker "host=tcp://192.168.1.7:2375"
  • 切换到该 Context
docker context use tcp-docker
  • 验证连接
docker info
  • 切回本地
docker context use default

4.3 TCP + TLS 加密方式

在客户端(您的本地电脑)上,您需要用到之前在服务器生成的这 3 个文件:ca.pem、cert.pem(客户端公钥)、key.pem(客户端私钥)。

  1. 放置证书文件: 建议在本地用户的家目录下创建一个安全文件夹,把这 3 个文件传到本地:
  • Linux / macOS: 建议放在 ~/.docker/
  • Windows: 建议放在 C:\Users\您的用户名.docker\certs
  1. 临时测试连接: 使用命令行直接带上参数,测试是否能连上服务器(请将 服务器IP 换成真实的):
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 版本信息,说明配置大功告成!

  1. 配置环境变量: 如果您不想每次都输入一长串参数,可以通过配置环境变量,让本地的 docker 命令默认走加密远程连接。
  • Linux / macOS (~/.bashrc 或 ~/.zshrc): 保存后记得执行source ~/.bashrc 生效。
    export DOCKER_HOST=tcp://服务器IP:2376
    export DOCKER_TLS_VERIFY=1
    export DOCKER_CERT_PATH=~/.docker/certs/
    
  • Windows (PowerShell): 重新打开一个 PowerShell 窗口即可生效。
    [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_CERT_PATH 中指向了文件夹的路径(比如 C:/Users/Administrator/.docker/certs),Docker 客户端在连接时,就会自动去该文件夹下寻找固定命名的三个证书文件:
    • ca.pem(CA 证书)
    • cert.pem(客户端证书)
    • key.pem(客户端私钥)
  1. 使用 docker context(推荐): docker context 是目前官方最推荐的管理远程连接方式。它比传统的环境变量法更干净,不需要修改系统的环境变量,就能在多个不同的 Docker 服务器之间一键切换。
  • 创建全新的 Docker Context
    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"
    
  • 查看当前的 Context 列表
    docker context ls
    
  • 切换并使用远程环境
    docker context use tcp-docker-tls
    
  • 如果您不想频繁切换环境,只是偶尔想在远程服务器上运行一个命令,可以使用 --context 参数:
    docker --context tcp-docker-tls  ps
    

5. VSCode 通过插件连接远程 Docker

在 VS Code 中,Container Tools 是微软官方推出的 Docker 可视化扩展插件,已取代旧版 Docker 扩展。这个插件可通过图形界面形式直观地管理本地或远程的容器、镜像、卷、网络、Docker Context 及 Compose 项目,并支持右键快捷操作(启动/停止、查看日志等)。

点击直接安装Docker 扩展

5.1 安装并激活插件

  • 打开 VSCode,进入扩展市场(左侧活动栏的方块图标或快捷键 Ctrl+Shift+X)
  • 搜索 Container Tools(发布者为 Microsoft)
  • 点击安装,安装完成后插件自动激活

激活后,左侧活动栏会出现容器图标(🐳),点击即可打开 Docker 管理面板。

5.2 配置DOCKER_HOST

安装并激活插件后,点击容器图标,你会发现可视化页面上没有任何容器、镜像信息——那是因为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 CLI,更推荐使用下方的 Docker Context 方式,无需修改 settings.json。

5.3 切换 Docker Context

在管理面板的 DOCKER CONTEXTS 菜单中,会列出本地所有已创建的 Docker Context(如 ssh-docker、tcp-docker、tcp-docker-tls 等):

  • 找到目标 Context 名称
  • 右键点击,在弹出的菜单中选择 Use
  • 插件即自动连接该 Context 对应的远程 Docker 服务

6 常用管理命令

操作命令
查看当前 Contextdocker context show
列出所有 Contextdocker context ls
切换 Contextdocker context use
删除 Contextdocker context rm <名称>
更新 Context 配置docker context update <名称> --docker host=...
临时使用指定 Context 执行命令docker --context <名称> ps

7 常见问题排查

问题现象可能原因解决建议
Cannot connect to the Docker daemon远程Docker未启动或端口不通检查systemctl status docker;检查防火墙和云安全组
ssh: handshake failedSSH免密登录未配置先用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

8 总结

无论使用终端还是 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=...★★★★★生产环境、跨公网访问
最后更新时间: 2026-08-20 11:23:00
2022-2026 小紫念沁 版权所有