【问题标题】:Connectivity issue between containers (I suppose...)容器之间的连接问题(我想......)
【发布时间】:2019-06-17 10:17:47
【问题描述】:

我正在使用 docker-compose 运行 3 个容器 1-我的网络应用程序 2-Postgres 3-卡桑德拉

一旦我使用: 码头工人组成

我的 webapp 启动了这个异常: com.datastax.driver.core.exceptions.NoHostAvailableException:所有主机 尝试查询失败(尝试:cassandra/172.17.0.3:9042

一旦所有容器都在运行,我就可以进入我的 webapp 并尝试在 cassandras 容器死机(webapp 容器)之前对其进行 ping 操作,并且所有数据包都成功返回,所以我猜它们之间实际上存在连接。

最奇怪的是,一旦我得到这个异常: .InvalidQueryException:键空间“myKeyspace”不存在

这意味着连接已经建立,但在我添加持久性并创建提到的架构之前,但我没有对 compose.yml 进行任何更改以获得这个新结果

这是我的 docker-compose.yml:

version: '3.1' 

services:


cassandra:
    container_name: "cassandra"
    image: cassandra
    ports:
        - 9042:9042


    volumes:
      - /home/cassandra:/var/lib/cassandra


postgresql:

    container_name: "postgresql"
    image: postgres:11.1-alpine
    restart: always
    environment:
        POSTGRES_DB: mywebapp
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
    volumes:
       #- ./startup.sql:/docker-entrypoint-initdb.d/startup.sql 
       - postgresdata:/var/lib/postgresql/data

    ports:
        - 5432:5432



mywebapp:
    container_name: "mywebapp"
    image: openjdk:10-jre-slim
    hostname: mywebapp
    volumes:
        - ./lib:/home/lib
        - ./mywebapp-1.0.1-SNAPSHOT-exec.jar:/home/mywebapp-1.0.1-SNAPSHOT-exec.jar


    entrypoint:     
        - java
        - -jar
        - -Djava.library.path=/home/lib
        - /home/mywebapp-1.0.1-SNAPSHOT-exec.jar

    environment:
        - LD_LIBRARY_PATH=/home/lib
        - spring.datasource.url=jdbc:postgresql://postgresql:5432/mywebapp
        - spring.cassandra.contactpoints=cassandra
        - spring.cassandra.port=9042
        - spring.cassandra.keyspace=mywebapp
        #- spring.datasource.username=postgres
        #- spring.datasource.password=postgres
        #- spring.jpa.hibernate.ddlAuto=update+



    ports:
        - 8443:8443
        - 8080:8080
    depends_on:
        - cassandra

卷: postgresdata:

提前谢谢大家

【问题讨论】:

    标签: java docker cassandra docker-compose


    【解决方案1】:

    我假设您的 Web 应用程序需要在启动时运行 cassandra 服务。您应该将 depends_on 条目添加到您的 Web 应用程序服务中,以便 docker 仅在 cassandra 启动时启动它

    并且links 条目不是必需的,因为 docker 会自动将服务名称用作为此 docker-compose 项目创建的网络中的主机名。 network_type: bridge 也是如此 - 这是默认网络类型,因此您可以在您的情况下省略它。

    【讨论】:

    • 感谢您的支持,我刚刚编辑了我的 compose.yml 现在的样子。仍然遇到完全相同的问题。不知道我是否做得对
    • 我的猜测是 cassandra 有一些时间来启动它?一些初始化过程,可能需要的时间有点太长,所以 docker 假设服务已经启动(因为它是,它只需要做额外的启动事情)所以感觉启动你的 web 应用程序也很好......您可以尝试在您的 Web 应用程序周围创建一个包装器 shell 脚本并将其用作容器的入口点,并在启动应用程序之前实际检查 cassandra 是否可访问。或者您可以尝试为 cassandra 服务定义健康检查命令
    • hub.docker.com/_/cassandra 检查有关“在 Cassandra 初始化完成之前没有连接”的部分您可以在 bash 中使用一个简单的 while 循环并检查是否可以使用某些 netcat 或类似工具访问 cassandra
    • mail-archives.apache.org/mod_mbox/cassandra-user/201601.mbox/… 这似乎是开始寻找解决方案的好方法
    • 谢谢!!!!我只是使用了一个 sleep 命令,看起来它可以正常工作(现在我需要处理最后一个异常,或者希望如此),但不再启动与 cassandra 相关的异常。显然我会改进隐式等待,但现在知道异常的来源会更容易处理,非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2021-03-10
    • 2023-03-21
    • 2019-05-13
    • 1970-01-01
    • 2020-10-26
    相关资源
    最近更新 更多