Docker Compose 与 Zookeeper、Kafka、Redis 和 Java Spring Boot

Posted

技术标签:

【中文标题】Docker Compose 与 Zookeeper、Kafka、Redis 和 Java Spring Boot【英文标题】:Docker Compose with Zookeeper, Kafka, Redis, and Java Spring Boot 【发布时间】:2018-01-11 13:43:33 【问题描述】:

我在使用 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 应用程序。

【问题讨论】:

你是怎么解决的? 【参考方案1】:

kafka 服务中的KAFKA_ADVERTISED_HOST_NAME: localhost 环境变量可能是问题的原因。它需要其他容器可以访问。尝试将其更改为KAFKA_ADVERTISED_HOST_NAME: kafka

在您的 docker-compose.yml 中定义的所有服务容器都将添加到用户定义的网络中,该网络以您的 compose 项目命名。使用与容器名称相同的主机名,此网络中的容器可以相互访问和发现。您可以在他们的documentation 中找到有关 Docker Compose 网络的更多信息。

【讨论】:

@terrabl 如果有效,请考虑接受答案。

以上是关于Docker Compose 与 Zookeeper、Kafka、Redis 和 Java Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

docker与docker-compose介绍,对比与使用

docker-compose up与docker-compose up -d

24.Docker技术入门与实战 --- Docker三剑客之Compose

Docker Compose与Docker Stack的不同之处

docker-compose概述与编排部署

Docker Compose简介与安装