远程Docker上下文操作失败但SSH连接正常的问题求助
我最近碰到个棘手的问题,想请大家帮忙看看:我在本地机器上尝试创建一个指向远程服务器的Docker上下文,执行的命令是这样的:
sudo docker context create contextName --docker "host=ssh://user@domain" sudo docker context use contextName
切换到这个上下文后,不管执行什么Docker命令(比如sudo docker info),都会弹出Permission denied (publickey)的错误,具体报错信息如下:
$ sudo docker info
Client: Docker Engine - Community
Version: 26.1.3
Context: steste
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.14.0
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.27.0
Path: /usr/libexec/docker/cli-plugins/docker-composeServer:
ERROR: error during connect: Get "http://docker.example.com/v1.45/info": command
[ssh -o ConnectTimeout=30 -l user -- domain docker system dial-stdio] has exited
with exit status 255, please make sure the URL is valid, and Docker 18.09 or
later is installed on the remote host: stderr=user@domain: Permission denied (publickey).
奇怪的是,我直接用ssh user@domain是能正常连接到远程服务器的,但一用sudo运行Docker命令就不行了。有没有大佬能指点下怎么解决这个问题?
可能的原因和解决办法
我后来琢磨了下,问题大概率出在sudo切换用户身份后,SSH密钥不匹配上:平时我们用ssh user@domain是用当前本地用户的私钥去连,但sudo后Docker会以root用户的身份发起SSH连接,而root用户的~/.ssh目录里没有对应的私钥,自然就被远程拒绝了。
给大家分享几个可行的解决思路:
方法一:让当前用户拥有Docker操作权限,避免用sudo
这是最推荐的方式,毕竟总用sudo也麻烦:
- 先检查当前用户是否在
docker用户组里:
看输出里有没有groupsdocker这个组,如果没有就继续下一步。 - 将当前用户添加到docker组:
sudo usermod -aG docker $USER - 注销当前用户再重新登录(或者执行
newgrp docker临时生效),之后就不用sudo了,直接操作:docker context create contextName --docker "host=ssh://user@domain" docker context use contextName docker info
方法二:如果必须用sudo,明确指定SSH身份文件
要是因为某些原因必须用sudo运行Docker,那可以在创建上下文时指定当前用户的私钥路径:
sudo docker context create contextName --docker "host=ssh://user@domain,identityfile=/home/你的本地用户名/.ssh/id_rsa"
注意替换/home/你的本地用户名为你实际的用户目录,同时要确保root用户能读取这个私钥文件(可以执行chmod 600 /home/你的本地用户名/.ssh/id_rsa,并确保~/.ssh目录权限是700)。
额外检查点
- 确认远程服务器上
user用户的~/.ssh/authorized_keys文件里,已经正确添加了本地用户的公钥 - 检查远程服务器的
/etc/ssh/sshd_config配置,确保PubkeyAuthentication设置为yes(一般默认开启,但可以确认下)
备注:内容来源于stack exchange,提问作者shs

