我正在尝试docker-compose
通过 SSH 将容器部署到远程服务器。远程服务器 SSH 只能通过 SOCKS 代理访问。我~/.ssh/config
为此创建了有效的 SOCKS 配置:
Host <my.host>
HostName <my.host>
ProxyCommand socks-connect -S <socks-user>@<socks-host>:<socks-port> %h %p
Port <ssh-port>
User <ssh-user>
IdentityFile ~/.ssh/<ssh-key>
此配置工作正常:我可以使用ssh <my.host>
命令通过代理连接。
然后我创建了 Docker 上下文并对其进行了测试:
$ docker context create remote --docker "host=ssh://<my.host>"
$ docker --context=remote ps
<list of running containers on remote host>
但是当我尝试将此上下文与 一起使用时docker-compose
,它会失败并出现错误:
$ docker-compose --context=remote --verbose ps
ERROR: Got error response from SOCKS server: 4 (Host unreachable)
FATAL: failed to begin relaying via SOCKS
kex_exchange_identification: Connection closed by remote host
另外,我尝试使用DOCKER_HOST
环境但出现相同的错误:env DOCKER_HOST="ssh://<my-host>" docker-compose ps
。
因此,问题似乎出在这里,docker-compose
因为纯docker
命令可以正常工作。这里可能存在什么问题?我该如何修复此行为?
Docker 客户端版本:20.10.7
Docker 服务器版本(远程):19.03.12
Docker compose 版本:1.29.2
答案1
看起来 ssh 方法没有检查 ~/.ssh/config,还有另一种方法,即将远程 docker sock 转发到本地 tcp 端口:
ssh -NL localhost:23750:/var/run/docker.sock user@hostname
然后:
DOCKER_HOST="tcp://localhost:23750" docker-compose build