【发布时间】:2020-10-11 12:44:31
【问题描述】:
我一直在努力从本地主机和外部连接到 postgresql 容器。
这是一个非常不错的演示,它在https://linuxhint.com/postgresql_docker/ 上演示的效果非常好。下面是 docker-compose.yml,postgres:12.2 和 pgadmin 通过它被容器化并运行。事实上,在运行 docker-compose.yml 文件(通过 docker-compose up -d)之后,它们就可以工作了。
然后您可以在浏览器中访问 http://localhost:8080/ 并直接访问 pgadmin(使用给定的凭据,即 admin@linuxhint.com、secret)并开始在您的 postgres:12.2 安装上运行在码头上。
但是,当我尝试直接从 localhost 或外部/某些应用程序/ip(如 Java Spring Boot)找到与此 postgres:12.2 数据库的连接时,我的困难就开始了。
诚然,我不是 docker 方面的专家,只是一名学生——所以,我寻求帮助。希望有人可以告诉我应该做些什么来使从外部/应用程序连接到(这个)容器化 postgres 数据库成为可能。我正在使用 Win 10。
更新:
-
谁能说出为什么一个网络应用(添加到 docker.compose.yml,见下文)在启动后持续关闭?
-
docker logs 给出以下错误:
原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class] 中定义名称为“dataSource”的 bean 创建错误:bean 的初始化失败的;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker' 的 bean 时出错:调用 init 方法失败;嵌套异常是 org.springframework.jdbc.datasource.init.UncategorizedScriptException: 无法执行数据库脚本;嵌套异常是 org.springframework.jdbc.CannotGetJdbcConnectionException: 获取 JDBC 连接失败;嵌套异常是 org.postgresql.util.PSQLException: Connection to localhost:5433 denied。检查主机名和端口是否正确,以及 postmaster 是否接受 TCP/IP 连接。
-
这里是应用的 Dockerfile:
来自 maven:3-jdk-11
音量/tmp
暴露 8095
添加/target/spring-boot-demo-0.0.1-SNAPSHOT.jar app.jar
运行 ls -ls
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
-
这是 application.properties 文件中的连接详细信息:
spring.datasource.url=jdbc:postgresql://db:5432/postgres
spring.datasource.username=admin
spring.datasource.password=secret
-
另外两个服务(db和pgadmin正常启动)
docker-compose.yml
version: "3.7"
services:
# ========== ADDED APP ===============
web:
#restart: on-failure
image: app-springboot-postgresql
build: ./
ports:
- "8095:8095"
environment:
WAIT_HOSTS: postgres:5432
depends_on:
- db
# ========== ADDED APP ===============
db:
image: postgres:12.2
restart: always
environment:
POSTGRES_DB: postgres
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
PGDATA: /var/lib/postgresql/data
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
pgadmin:
image: dpage/pgadmin4:4.18
restart: always
environment:
PGADMIN_DEFAULT_EMAIL: admin@linuxhint.com
PGADMIN_DEFAULT_PASSWORD: secret
PGADMIN_LISTEN_PORT: 80
ports:
- "8080:80"
volumes:
- pgadmin-data:/var/lib/pgadmin
links:
- "db:pgsql-server"
volumes:
db-data:
pgadmin-data:
【问题讨论】:
-
你不能用容器名连接吗?
-
仅表示我已经能够连接到容器化的 postgresql(如上面在 yml 文件中定义的那样)是:“docker-compose run db bash”。然后:“psql -h db -U admin -d postgres”和“用户管理员密码:secret”。
-
来自错误:
Connection; nested exception is org.postgresql.util.PSQLException: Connection to localhost:5433 refused.你在 5433 上配置了 postgresql,从 yaml 你在 5432 上启动它 -
Edwin,你是对的,错误信息和代码不一致。该错误与我在下面的评论中报告的一些奇怪的内存更新错误有关。感谢您的敏锐观察。
标签: postgresql docker docker-compose