我有气流和postgres运行在一个Docker容器中,我已经托管在一个数字海洋滴上。Airflow正在成功运行并将数据写入我的postgres数据库。当我ssh到我的数字海洋水滴,我可以docker exec -it <mycontainer> bash
,从那里我可以运行psql和查询我的数据库。通过检查容器,我知道它已经启动并运行,并且我已经暴露了端口5433。我知道没有任何防火墙问题,因为我能够访问气流网络服务器/用户界面从我的机器只需要去滴ID地址和正确的端口。
我想做的是从我的本地机器访问数据库,以便能够运行查询和进行分析。但是,我找不到连接到数据库的方法。理想情况下,我会在使用SQL编辑器(DBeaver)时进行连接。
我已经花了4个小时试图让连接工作,我已经用尽了我所有的资源(ChatGPT是没有帮助的!)。我能够成功地在DBeaver中创建一个ssh隧道,但我仍然无法获得连接。我得到这个错误,我不明白。
The connection attempt failed.
EOFException
java.io.EOFException
我以前也收到过Connection Refused
错误消息。当我不使用ssh隧道时,就会发生这种情况。当我检查在服务器上运行的docker容器时,IPAddress显示为“ www.example.com ”。我在docker-compose文件中公开了端口5433。我试图找到正确的连接字符串(成功ssh隧道后)。
username: postgres
password: mypassword
database: postgres
port: 5433
host: ? (I haveve tried "localhost" and "172.20.0.2")
谁能保存我的灵魂?
TL;DR尝试连接到数字海洋水滴上的Docker容器中运行的postgres数据库。Container和Postgres正在运行(我能够连接到容器并使用psql运行查询)。我也知道没有任何防火墙问题,我能够连接到气流 Jmeter 板运行在一个容器中的同一液滴。
编辑:这是我的postgres容器的docker-compose文件
version: '3.8'
services:
jupyter_notebook:
image: "jupyter/minimal-notebook"
container_name: ${CONTAINER_NAME:-jupyter_notebook}
environment:
JUPYTER_ENABLE_LAB: "yes"
ports:
- "8888:8888"
volumes:
- ${PWD}:/home/jovyan/work
depends_on:
- db
links:
- db
networks:
- adu_network
db:
image: postgres:15.2
restart: always
environment:
- "POSTGRES_USER=${POSTGRES_USER}"
- "POSTGRES_PASSWORD=${POSTGRES_PASSWORD}"
- "POSTGRES_PORT=${POSTGRES_PORT}"
- "POSTGRES_HOST=${POSTGRES_HOST}"
ports:
- "5433:5433"
expose:
- "5433"
networks:
- adu_network
volumes:
- ./data:/var/lib/postgresql/data
- ./adu_db.sql:/docker-entrypoint-initdb.d/init.sql
volumes:
db:
driver: local
networks:
adu_network: null
2条答案
按热度按时间mec1mxoz1#
我设置了
docker-compse
的简化版本,并安装了DBeaver进行测试。我一开始也犯了和你一样的错误。我的
docker-compose.yml
:容器启动良好。
在我的本地机器上,我在DBeaver的“SSH”面板上勾选了“使用SSH-Tunnel”,并在那里显示了我的SSH连接详细信息。该面板上的Test tunnel configuration按钮显示ssh连接工作正常。
在DBeaver“Main”配置面板上,我有:
测试连接。..在DBeaver中显示:
连接尝试失败。
EOFException。
java.io.EOFException
好吧,让我们调查一下。我检查了Docker日志,它显示:
注意端口
5432
出现了几次,尽管在我的compose文件中使用了POSTGRES_PORT=5433
。奇怪,但还好。我更新了我的compose文件(删除了POSTGRES_PORT
规范,并更新了端口):我将DBeaver主面板中的端口改为5432,现在改为测试连接。..显示成功!
我不熟悉Docker中的Postgres,但是the docs没有提到任何关于
POSTGRES_PORT
可以更改端口的事情。一些搜索发现了一种方法,可以在compose文件中使用command
来更改端口,尽管我没有测试这个:或者,您可以将容器中的默认运行端口5432Map到主机上的5433:
但除非有一些特殊的原因,你不希望它的默认,也许最简单的是只是不打它!:—).
同样,文档中也没有提到
POSTGRES_HOST
,但也许你是在使用POSTGRES_HOST
,以便从其他容器中引用DB容器?如果是这样的话,您已经可以这样做了--docker-compose.yml
中的容器可以通过容器名称相互引用。您的Postgres容器名为db
,您可以使用它从jupyter_notebook
容器访问它。因此,除非您的POSTGRES_HOST
env var是"db"
,否则它不会像您预期的那样工作,如果是,您可以删除它。参见例如Docker-compose Postgres connection refused最后一个注意-all containers in a
docker-compose.yml
are automatically added to a common network,并可以在该网络上通信。除非你试图限制或自定义网络,或者你的yml有更多的特殊网络需求,没有必要指定adu_network
或任何网络细节。j5fpnvbx2#
postgres
image Environment Variables doc没有提到POSTGRES_PORT
或POSTGRES_HOST
变量。您的主机/端口配置没有任何作用,并且Postgres在启动时仍然使用端口5432
,因此您的问题是使用端口5433
使用容器端口
5432
而不是5433
,并删除这些未使用的变量(但您仍然可以暴露主机端口5433
),例如:现在你可以通过
172.20.0.2:5433
直接访问Postgres容器,它将Map到你的容器的端口5432
。注意:我强烈建议不要直接覆盖Postgres启动配置,以使用另一个主机/端口,因为它只会使您的设置复杂化,而不会增加任何值。
这些选项不是图像界面的一部分,这是有充分理由的:你不需要它们,因为容器有自己的网络接口和端口,重写这样的配置是没有用的。