我正在使用 docker-compose 来运行 3 个容器:
- 我的网络应用程序
- Postgres
- 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/