【发布时间】:2021-10-09 18:00:19
【问题描述】:
我有一个使用 postgres 数据库、redis 和 artemis 服务器的 Web 应用程序。所有这些都在 docker 容器中工作,但我无法让应用程序使用容器名称连接到 redis 或 artemis(使用 postgres 可以工作)。我的码头工人撰写:
version: '3.9'
services:
my_web_app:
container_name: "my_web_app"
image: my_image
restart: always
environment:
REDIS_HOST: ${REDIS_HOST}
REDIS_PORT: ${REDIS_PORT}
ARTEMIS_HOST: ${ARTEMIS_HOST}
ARTEMIS_PORT: ${ARTEMIS_PORT}
ARTEMIS_USER: ${ARTEMIS_USER}
JDBC_URL: ${JDBC_URL}
JDBC_USERNAME: ${JDBC_USERNAME}
JDBC_PASSWORD: ${JDBC_PASSWORD}
...
ports:
- 8080:8080
depends_on:
- my_redis
- my_artemis
- my_postgres
networks:
- my_network
my_postgres:
container_name: "my_postgres"
image: "postgis/postgis"
environment:
POSTGRES_USER: ${JDBC_USERNAME}
POSTGRES_PASSWORD: ${JDBC_PASSWORD}
POSTGRES_DB: ${DB_NAME}
ports:
- 5432:5432
networks:
- my_network
my_redis:
container_name: "my_redis"
image: redis
ports:
- 6379:6379
networks:
- my_network
my_artemis:
container_name: "my_artemis"
image: vromero/activemq-artemis:2.16.0
environment:
ARTEMIS_USERNAME: quarkus
ARTEMIS_PASSWORD: quarkus
ENABLE_JMX_EXPORTER: "true"
ports:
- 61616:61616
- 8161:8161
- 5672:5672
networks:
- my_network:
networks:
my_network:
我尝试设置网络别名、域名或主机名,但没有任何效果。 我的健康检查:
{
"status": "DOWN",
"checks": [
{
"name": "Database connections health check",
"status": "UP"
},
{
"name": "Redis connection health check",
"status": "DOWN",
"data": {
"reason": "client [<default>]: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:6379"
}
},
{
"name": "Artemis JMS health check",
"status": "DOWN"
}
]
}
我的 .env:
REDIS_HOST=my_redis
REDIS_PORT=6379
ARTEMIS_HOST=my_artemis
ARTEMIS_PORT=61616
ARTEMIS_USER=quarkus
ARTEMIS_PASSWORD=quarkus
JDBC_URL=jdbc:postgresql://my_postgres:5432/my_db
JDBC_USERNAME=quarkus
JDBC_PASSWORD=quarkus
DB_NAME=my_db
我的 quarkus 应用程序.properties
quarkus.artemis.url=tcp://${ARTEMIS_HOST}:${ARTEMIS_PORT}
quarkus.artemis.username=${ARTEMIS_USER}
quarkus.artemis.password=${ARTEMIS_PASSWORD}
quarkus.redis.hosts=redis://${REDIS_HOST}:${REDIS_PORT}
quarkus.datasource.jdbc.url=${JDBC_URL}
quarkus.datasource.username=${JDBC_USERNAME}
quarkus.datasource.password=${JDBC_PASSWORD}
我的 postgres 设置(有效):
jdbc:postgresql://my_postgres:5433/db_name
我对redis和artemis的配置:
redis://my_redis:6379
tcp://my_artemis:61616
唯一有效的是设置网络和固定 ips 并使用 ips 而不是容器名称,但我想使用容器名称。有什么想法吗?
【问题讨论】:
-
您的 docker-compose 文件看起来不错。您应该使用您似乎使用的服务名称。我怀疑应用程序代码。它似乎没有使用
my_redis:6379,而是在容器内假设localhost:6379。 -
@RamPrakash 应用程序代码是正确的,如果我使用物理机的 ip(redis 和 artemis 都可以)。并使用 docker 容器的配置 ips。我正在使用quarkus,可能是框架有问题,但是使用postgres它可以正常工作。
-
另外,我在应用程序代码中从redis主机检索了值,它是正确的,但是运行状况检查中的值似乎是错误的:localhost/127.0.0.1:6379
-
您收到的实际错误消息是什么?听起来您的应用程序配置是正确的,但是您能否将其包含在问题中以确保确定?
-
您能否在问题中包含环境变量和值而不是
...-environment: ...
标签: java postgresql docker docker-compose redis