【问题标题】:SSH tunnel to remote docker serviceSSH 隧道到远程 docker 服务
【发布时间】:2018-11-10 01:21:28
【问题描述】:

我有一个服务器,上面有几个由docker-compose 运行的 Docker 服务。数据库服务如下所示:

myproject_influxdb:                                    
  container_name: myproject_influxdb
  image: 'influxdb:alpine'
  volumes:                                        
   - '/var/lib/influxdb:/var/lib/influxdb'
   - './influxdb.conf:/etc/influxdb/influxdb.conf'
  ports:
   - '8086:8086'

可以通过myproject_influxdb:8086从其他容器访问。

现在我想从本地 docker 服务连接到该数据库。我在新终端中运行ssh -L 8086:localhost:8086 user@host。然后我尝试连接到远程myproject_influxdb 服务,但无论我输入什么主机(localhostmyproject_influxdb0.0.0.0)我都会收到同样的错误:[Errno 111] Connection refused

是不是因为远程和主机服务都没有使用network_mode: "host"

【问题讨论】:

  • influxdb:alpine 没有安装 ssh。
  • @joppich 我看不出有任何理由在 influxdb 容器中使用 ssh。为什么要有它?
  • 对不起,我看错了。我以为你想跳转到容器中。使用ssh -NL 8086:localhost:8086 [...] 创建隧道有帮助吗?

标签: docker ssh docker-compose


【解决方案1】:

docker-compose 服务与标准docker run 容器位于不同的网络上。

这就是myproject_influxdb 不起作用的原因。如果您在 docker 容器内并尝试使用 localhost 访问某些内容,那么您就在同一个容器内(不是主机)。话虽如此,您可以通过主机上的暴露端口访问 influxdb

host_ip:8086

要获取主机的 IP 地址,您可以使用此 bash 命令

/sbin/ip route|awk '/default/ { print $3 }'

【讨论】:

  • 你好@MazelTov,谢谢你的回复。隧道正在运行,我可以从我的主机上执行curl -G http://localhost:8086/query。我得到正确的回应。但是,如果我从容器内部(使用主机 IP 地址)执行此操作:curl -G http://172.19.0.1:8086/query 我会得到:Failed to connect to 172.19.0.1 port 8086: Connection refused
  • 能否提供docker ps 的输出以及如何启动容器
  • 您是否也可以从您的容器中尝试nc -z 172.19.0.1 8086 -v,这样您就可以判断端口是否打开......也许influxdb被配置为仅在特定接口上监听......
  • 我想连接到远程influxdb的容器被称为api:14b0737dcf87 myproject_myproject_api "./entrypoint.sh" 4 hours ago Up 3 hours 0.0.0.0:3031->3031/tcp myproject_api。它由docker-compose 启动。网络是默认的。
【解决方案2】:

两个选项:

1) 像这样使用--network=host 在本地运行您的容器

docker run -it --rm --network=host -p 8888:8888 chronograf --influxdb-url=http://localhost:8086

但是,这确实使您的容器可以访问整个主机网络,这会引发安全漏洞。

2)您可以将隧道连接到本地 Docker 网桥网络,然后告诉本地 docker 容器也使用网桥的 IP。

您可以使用ip addrdocker network inspect bridge 获取本地网桥IP 地址

之后你的 ssh 命令将是

ssh -L <bridge-ip>:8086:localhost:8086 user@host

如果您像我一样尝试在本地运行 chronograf,这个 shell 脚本会为您完成。

#! /usr/bin/env sh
echo "Retrieving BRIDGE IP"
BRIDGE_IP=$(docker network inspect --format '{{(index .IPAM.Config 0).Gateway}}' bridge)
echo "Found BRIDGE_IP: ${BRIDGE_IP}"
ssh -NL ${BRIDGE_IP}:8086:127.0.0.1:8086 <user>@<host> &
PID=$!
echo "Saved SSH PID: ${PID}"
docker run -it --rm -p 8888:8888 chronograf --influxdb-url=http://${BRIDGE_IP}:8086
kill $PID
echo "Done ..."

【讨论】:

    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2016-02-13
    • 2018-10-29
    • 1970-01-01
    • 2016-01-28
    • 2016-09-25
    • 2014-05-03
    • 2017-01-01
    相关资源
    最近更新 更多