diff --git a/docker/README.md b/docker/README.md index 8115bccadbd..eaf77f14db4 100644 --- a/docker/README.md +++ b/docker/README.md @@ -22,6 +22,20 @@ nginx. To build, run something like $ docker build -t openzipkin/zipkin-ui:test -f docker/Dockerfile --target zipkin-ui . ``` +## zipkin-kafka Docker image + +We also provide an image that runs both Kafka+ZooKeeper for testing the [Kafka collector](https://github.com/openzipkin/zipkin/tree/master/zipkin-collector/kafka) +and the upcoming [Kafka storage](https://github.com/openzipkin-contrib/zipkin-storage-kafka). +To build, run something like + +```bash +$ docker build -t openzipkin/zipkin-kafka:test -f docker/kafka/Dockerfile . +``` + +Then configure the [Kafka sender](https://github.com/openzipkin/zipkin-reporter-java/blob/master/kafka11/src/main/java/zipkin2/reporter/kafka11/KafkaSender.java) using a `bootstrapServers` value of `host.docker.internal:9092` if your application is inside the same docker network or `localhost:19092` if not, but running on the same host. + +In other words, if you are running a sample application on your laptop, you would use `localhost:19092` bootstrap server to send spans to the Kafka broker running in Docker. + ### Dockerfile migration We are currently migrating the Docker configuration from https://github.com/openzipkin/docker-zipkin/tree/master/zipkin. diff --git a/docker/hooks/post_build b/docker/hooks/post_build index cc0e374d6a6..ddf586c43c1 100644 --- a/docker/hooks/post_build +++ b/docker/hooks/post_build @@ -15,16 +15,22 @@ for tag in ${TAGS[@]:1}; do docker tag "openzipkin/zipkin-slim:${TAGS[0]}" "openzipkin/zipkin-slim:$tag" done -# We always build an image containing nginx and zipkin-lens in addition to the default image of zipkin-server -echo Building zipkin-ui - +# We always build test images formerly hosted on openzipkin/docker-zipkin # SOURCE_BRANCH contains the name of the branch or tag being built. Our build of the master branch # ignores this argument, while our build of release tags uses it to fetch the right release artifact. + +echo Building zipkin-ui docker build --build-arg version="$SOURCE_BRANCH" -f "$DOCKERFILE_PATH" -t "openzipkin/zipkin-ui:${TAGS[0]}" --target zipkin-ui . for tag in ${TAGS[@]:1}; do docker tag "openzipkin/zipkin-ui:${TAGS[0]}" "openzipkin/zipkin-ui:$tag" done +echo Building zipkin-kafka +docker build --build-arg version="$SOURCE_BRANCH" -f "docker/kafka/Dockerfile"-t "openzipkin/zipkin-kafka:${TAGS[0]}" --target zipkin-kafka . +for tag in ${TAGS[@]:1}; do + docker tag "openzipkin/zipkin-kafka:${TAGS[0]}" "openzipkin/zipkin-kafka:$tag" +done + # We also build storage images to correspond with the server version to keep schemas up to date for storage in cassandra; do echo Building "$storage" diff --git a/docker/hooks/post_push b/docker/hooks/post_push index 991851c467c..00db1a4f42a 100644 --- a/docker/hooks/post_push +++ b/docker/hooks/post_push @@ -3,14 +3,13 @@ set -v if [[ "$DOCKER_REPO" == "index.docker.io/openzipkin/zipkin" ]]; then - # We always push zipkin-slim / zipkin-ui - echo Pushing zipkin-slim and zipkin-ui + echo Pushing test zipkin-slim and test images IFS=',' read -ra TAGS <<< "$DOCKER_TAG" for tag in ${TAGS[@]}; do docker push "openzipkin/zipkin-slim:$tag" docker push "openzipkin/zipkin-ui:$tag" + docker push "openzipkin/zipkin-kafka:$tag" - # We also push storage images on every build for storage in cassandra; do docker push "openzipkin/zipkin-${storage}:$tag" done diff --git a/docker/kafka/Dockerfile b/docker/kafka/Dockerfile new file mode 100644 index 00000000000..07795f1785b --- /dev/null +++ b/docker/kafka/Dockerfile @@ -0,0 +1,43 @@ +# +# Copyright 2015-2019 The OpenZipkin Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +# or implied. See the License for the specific language governing permissions and limitations under +# the License. +# + +FROM alpine + +ENV SCALA_VERSION 2.12 +ENV KAFKA_VERSION 2.3.0 +ENV ZOOKEEPER_VERSION 3.4.14 + +WORKDIR /kafka +ADD /docker/kafka/install.sh /kafka/install +RUN /kafka/install + +ADD /docker/kafka/wait-for-zookeeper.sh /kafka/bin +ADD /docker/kafka/start.sh /kafka/bin + +# Share the same base image to reduce layers used in testing +FROM openzipkin/jre-full:11.0.4-11.33 +LABEL MAINTAINER Zipkin "https://zipkin.io/" + +WORKDIR /kafka + +RUN ["/busybox/sh", "-c", "adduser -g '' -h /kafka -D kafka"] + +COPY --from=0 --chown=kafka /kafka /kafka + +USER kafka + +# Port 19092 is for connections from the Docker host +EXPOSE 2181 9092 19092 + +ENTRYPOINT ["/busybox/sh", "/kafka/bin/start.sh"] diff --git a/docker/kafka/install.sh b/docker/kafka/install.sh new file mode 100755 index 00000000000..faae2ee14e7 --- /dev/null +++ b/docker/kafka/install.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Copyright 2015-2019 The OpenZipkin Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +# or implied. See the License for the specific language governing permissions and limitations under +# the License. +# + +set -eux + +echo "*** Installing Kafka and dependencies" +apk add --update --no-cache jq curl + +APACHE_MIRROR=$(curl --stderr /dev/null https://www.apache.org/dyn/closer.cgi\?as_json\=1 | jq -r '.preferred') + +curl -sSL $APACHE_MIRROR/zookeeper/zookeeper-$ZOOKEEPER_VERSION/zookeeper-$ZOOKEEPER_VERSION.tar.gz | tar xz +mkdir zookeeper +mv zookeeper-$ZOOKEEPER_VERSION/conf zookeeper/ + +# download kafka binaries +curl -sSL $APACHE_MIRROR/kafka/$KAFKA_VERSION/kafka_$SCALA_VERSION-$KAFKA_VERSION.tgz | tar xz +mv kafka_$SCALA_VERSION-$KAFKA_VERSION/* . + +# Set explicit, basic configuration +cat > config/server.properties <<-EOF +broker.id=0 +zookeeper.connect=127.0.0.1:2181 +replica.socket.timeout.ms=1500 +log.dirs=/kafka/logs +auto.create.topics.enable=true +offsets.topic.replication.factor=1 +listeners=PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:19092 +listener.security.protocol.map=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT +EOF + +mkdir /kafka/logs + +echo "*** Cleaning Up" +rm -rf zookeeper-$ZOOKEEPER_VERSION + +echo "*** Image build complete" diff --git a/docker/kafka/start.sh b/docker/kafka/start.sh new file mode 100644 index 00000000000..21284ff42ed --- /dev/null +++ b/docker/kafka/start.sh @@ -0,0 +1,31 @@ +#!/busybox/sh +# +# Copyright 2015-2019 The OpenZipkin Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +# or implied. See the License for the specific language governing permissions and limitations under +# the License. +# + + +echo Starting Zookeeper +/busybox/sh /kafka/bin/kafka-run-class.sh -Dlog4j.configuration=file:/kafka/config/log4j.properties org.apache.zookeeper.server.quorum.QuorumPeerMain /kafka/zookeeper/conf/zoo_sample.cfg & +/busybox/sh /kafka/bin/wait-for-zookeeper.sh + +if [[ -z "$KAFKA_ADVERTISED_HOST_NAME" ]]; then +listeners=PLAINTEXT://:9092 + # Have internal docker producers and consumers use the normal hostname:9092, and outside docker localhost:19092 + echo advertised.listeners=PLAINTEXT://${HOSTNAME}:9092,PLAINTEXT_HOST://localhost:19092 >> /kafka/config/server.properties +else + # Have internal docker producers and consumers use the normal hostname:9092, and outside docker the advertised host on port 19092 + echo "advertised.listeners=PLAINTEXT://${HOSTNAME}:9092,PLAINTEXT_HOST://${KAFKA_ADVERTISED_HOST_NAME}:19092" >> /kafka/config/server.properties +fi + +echo Starting Kafka +/busybox/sh /kafka/bin/kafka-run-class.sh -name kafkaServer -Dlog4j.configuration=file:/kafka/config/log4j.properties kafka.Kafka /kafka/config/server.properties diff --git a/docker/kafka/wait-for-zookeeper.sh b/docker/kafka/wait-for-zookeeper.sh new file mode 100644 index 00000000000..3335242a479 --- /dev/null +++ b/docker/kafka/wait-for-zookeeper.sh @@ -0,0 +1,20 @@ +#!/busybox/sh +# +# Copyright 2015-2019 The OpenZipkin Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except +# in compliance with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the License +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +# or implied. See the License for the specific language governing permissions and limitations under +# the License. +# + + +until echo stat | nc 127.0.0.1 2181 +do + sleep 1 +done