Docker与Zookeeper,Kafka,Redis和Java Spring Boot组合

我很难用Docker Compose将这些容器连接在一起,让我先说一下,我现在也在Mac上运行。

该应用程序目前正在使用Docker Compose,因为如果我单独运行这些应用程序(而不是使用Docker),应用程序将按预期工作。

按照预期意味着,应用程序正在从Redis中读取数据,并且将某些Kafka主题中的数据提取出来并显示在前端。

谈到我认为是必要的文件。

docker-compose.yml

 version: '2' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka:0.10.2.0 ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: localhost KAFKA_CREATE_TOPICS: "flight-events:1:1,reported-flight-time-events:1:1,pax-flight-events:1:1" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock depends_on: - zookeeper redis: image: redis ports: - "6379" restart: always kafka-websocket-connector: build: ./kafka-websocket-connector image: <user>/kafka-websocket-connector ports: - "8077:8077" depends_on: - kafka - redis - zookeeper links: - "kafka" - "redis" 

kafka-websocket-connector引用的Dockerfile如下所示:

Dockerfile

 FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD target/kafka-websocket-connector-0.0.1-SNAPSHOT.jar app.jar ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] 

如果我试图运行命令docker-compose up --build我收到以下错误:

 ERROR: Service 'kafka-websocket-connector' failed to build: ADD failed: stat /var/lib/docker/tmp/docker-builder838069739/target/kafka-websocket-connector-0.0.1-SNAPSHOT.jar: no such file or directory 

我不知道这是否与连接这些组件有关,但是我的Spring应用程序的build.gradle如下所示:

build.gradle

 buildscript { ext { springBootVersion = '1.5.4.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath('se.transmode.gradle:gradle-docker:1.2') } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'docker' group = '<user>' jar { baseName = 'kafka-websocket-connector' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 } task buildDocker(type: Docker, dependsOn: build) { applicationName = jar.baseName dockerfile = file('Dockerfile') doFirst { copy { from jar into "${stageDir}/target" } } } repositories { mavenCentral() } ext { springCloudVersion = 'Dalston.SR1' } dependencies { compile('org.springframework.boot:spring-boot-starter-data-redis') compile('org.springframework.kafka:spring-kafka') compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-websocket') compile("org.webjars:webjars-locator") compile("org.webjars:sockjs-client:1.0.2") compile("org.webjars:stomp-websocket:2.3.3") compile("org.webjars:bootstrap:3.3.7") compile("org.webjars:jquery:3.1.0") compile group: 'org.webjars', name: 'd3js', version: '4.2.1' testCompile('org.springframework.boot:spring-boot-starter-test') testCompile('org.springframework.restdocs:spring-restdocs-mockmvc') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } bootRepackage { executable = true enabled = true } 

因此,为了重新解决这个问题,我无法使用Docker Compose连接下列组件:Zookeeper,Kafka,Redis和Spring Boot应用程序。

您的kafka服务中的KAFKA_ADVERTISED_HOST_NAME: localhost环境variables可能是问题的原因。 它需要通过其他容器到达。 尝试将其更改为KAFKA_ADVERTISED_HOST_NAME: kafka

docker-compose.yml中定义的所有服务容器都将添加到用户定义的networking中,并以您的撰写项目命名。 这个networking中的容器可以被其他每个容器访问和发现,使用与容器名称相同的主机名。 您可以在其文档中find有关Docker撰写networking的更多信息。