我有一台服务器,其中包含由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
服务,但无论我输入什么主机(localhost
,myproject_influxdb
,0.0.0.0
),我都会得到同样的错误:[Errno 111] Connection refused
。
是因为远程服务和主机服务都没有使用network_mode: "host"
吗?
答案 0 :(得分:1)
docker-compose
服务与标准docker run
容器位于不同的网络上。
这就是为什么myproject_influxdb
不会起作用的原因。如果你在docker容器内并尝试访问localhost
的内容,那么你就在同一个容器(而不是主机)中。话虽如此,您可以通过主机上的公开端口
host_ip:8086
获取主机的IP地址,您可以使用此bash命令
/sbin/ip route|awk '/default/ { print $3 }'
答案 1 :(得分:1)
两个选项:
1)使用--network=host
像这样在本地运行容器
docker run -it --rm --network=host -p 8888:8888 chronograf --influxdb-url=http://localhost:8086
但是,这确实使您的容器可以访问整个主机网络,从而增加了安全漏洞。
2)您可以将隧道连接到本地Docker桥网络,然后告诉本地Docker容器也使用桥的IP。
您可以使用ip addr
或docker 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 ..."