-1

我正在尝试使用 docker-compose 在容器内运行 zookeeper 和 spring 云服务。当我运行服务 jar 文件并启动动物园时,一切都很好。但是,当我尝试在容器中运行时,服务无法连接到动物园 -

这是 docker-compose up 时的错误:

controller_1  | 2020-07-21 09:45:12.715  WARN 1 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
controller_1  |
controller_1  | java.net.ConnectException: Connection refused
controller_1  |         at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.8.0_111-internal]
controller_1  |         at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) ~[na:1.8.0_111-internal]
controller_1  |         at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361) ~[zookeeper-3.4.8.jar!/:3.4.8--1]
controller_1  |         at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141) ~[zookeeper-3.4.8.jar!/:3.4.8--1]
controller_1  |

这是我的 yaml.file

version: '3'
services:
  zookeeper:
    image: 'zookeeper:3.4'
    ports:
      - "2181:2181"
    restart: always
    container_name: zookeeper
    environment:
      ZOOKEEPER_SASL_ENABLED: 'FALSE'
      
  controller:
    build: distributed-search-engine-1/
    ports:
      - "8083:8083"
    links:
      - zookeeper
    depends_on: 
      - zookeeper

服务的 Docker 文件:

FROM java:8-jdk-alpine
COPY ./build/libs/distributed-search-engine-1-0.0.1-SNAPSHOT.jar /usr/app/
WORKDIR /usr/app
EXPOSE 8083
ENTRYPOINT ["java", "-jar", "distributed-search-engine-1-0.0.1-SNAPSHOT.jar"]

我的服务没有定义任何 Zookeeper 端口,所以我猜 2181 应该没问题。无论如何,这是我的构建文件:

buildscript {
    ext {
        springBootVersion = '2.0.0.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.search'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/milestone" }
}


ext {
    springCloudVersion = 'Finchley.M8'
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-integration')
    compile group: 'org.springframework.integration', name: 'spring-integration-zookeeper'
    compile('org.springframework.cloud:spring-cloud-starter-zookeeper-config')

    testCompile('org.springframework.boot:spring-boot-starter-test')
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}



jar {
  manifest { 
    attributes "Main-Class": "com.search.server.Application"
  }  

  from {
    configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
  }
}




谢谢!!!!

4

1 回答 1

0

这是 docker 问题,而不是 java。乍一看,您似乎尝试在虚拟网络上访问 localhost:2181 上的 zookeeper,容器响应 DNS 名称“zookeeper”(您的 docker-compose 文件中的服务名称),而不是 localhost。您是否尝试改用 zookeeper:2181 ?

一旦解决了这个问题,理想情况下,您实际上会在您的服务中使用一个 ENV 变量来指定 zookeeper 主机/端口,以便可以对其进行配置并将其设置在您的 docker compose 文件中。

于 2020-07-21T10:37:40.833 回答