java - 容器之间的连接问题(我想......)

标签 java docker cassandra docker-compose

我正在使用 docker-compose 来运行 3 个容器:

  1. 我的网络应用程序
  2. Postgres
  3. Cassandra

一旦我使用:docker-compose up

我的网络应用程序启动此异常:

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: cassandra/172.17.0.3:9042

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

最奇怪的是,一旦我得到这个异常:

.InvalidQueryException: Keyspace 'myKeyspace' does not exist

这意味着连接已经建立,但是是在我添加持久性并创建上述架构之前,但我没有对 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
            

卷: postgres数据:

先谢谢大家了

最佳答案

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

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

关于java - 容器之间的连接问题(我想......),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56629260/

相关文章:

Cassandra 更改列类型 : which types are compatible?

java - 禁用 Springboot RSocket 项目的 "default"Netty 端口

java - 我的循环不允许我输入用户输入来结束循环 :( (java)

java - 通过 Java 在 Web 浏览器上执行 JavaScript

java - Tomcat 7 maven 插件-处理请求 : Broken pipe 时捕获的 I/O 异常 (java.net.SocketException)

mysql - Nginx Docker 卷为空

docker - 将Ansible应用程序安装到Docker容器

Docker-Compose要求提供gcloud凭证

java - 找不到 CassandraSQLContext 键

java - Cassandra java 驱动程序警告