首页 > 解决方案 > 容器之间的连接问题(我想......)

问题描述

我正在使用 docker-compose 运行 3 个容器 1-我的 web 应用程序 2-Postgres 3-Cassandra

一旦我使用:docker-compose up

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

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

最奇怪的是,一旦我得到这个异常: .InvalidQueryException: Keyspace '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:

谢谢大家

标签: javadockercassandradocker-compose

解决方案


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

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


推荐阅读