【问题标题】:Hostname not working with docker compose and redis主机名不适用于 docker compose 和 redis
【发布时间】: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


【解决方案1】:

我已经解决了我的问题,但我不太明白原因,我想这是 Quarkus 框架的问题。我不得不将服务称为“redis”和“artemis”。

version: '3.9'

services:
  my_web_app:
    container_name: "my_web_app"
    image: my_image
    restart: always
    environment:
        ...
    ports:
      - 8080:8080
    depends_on:
      - redis
      - artemis
      - my_postgres
    networks:
      - my_network

  my_postgres:
    container_name: "my_postgres"
    image: "postgis/postgis"
    environment:
        ...
    ports:
      - 5432:5432
    networks:
      - my_network

  redis:
    container_name: "my_redis"
    image: redis
    ports:
      - 6379:6379
    networks:
      - my_network


  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:

并在环境变量文件中配置其值:

REDIS_HOST=redis
REDIS_PORT=6379
ARTEMIS_HOST=artemis
ARTEMIS_PORT=61616

这样就可以正常工作了。

【讨论】:

  • 所以基本上如果您将redis服务名称更改为my_redis,即使您更新REDIS_HOST=my_redis也不起作用?这对你来说不奇怪吗?
  • 就是这样。我收到错误“连接被拒绝:localhost/127.0.0.1:6379”。我认为这是 Quarkus 组件的问题,因为使用 Postgres 可以正常工作。
  • 有没有样例项目可以上传到github查看。对我来说这没有意义。
  • @RamPrakash 抱歉耽搁了,但似乎这是问题github.com/quarkusio/quarkus/issues/16037
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2022-11-12
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多