<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You 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.
-->

<script>
    <!--#include virtual="js/templateData.js" -->
</script>

<script id="docker-template" type="text/x-handlebars-template">
    <h4 class="anchor-heading">JVM Based Apache Kafka Docker Image</h4>

    <p>
        <a href="https://www.docker.com/">Docker</a> is a popular container runtime. Docker images for the JVM based Apache Kafka can be found on <a href="https://hub.docker.com/r/apache/kafka">Docker Hub</a> and are available from version 3.7.0.
    </p>

    <p> Docker image can be pulled from Docker Hub using the following command: </p>
    <pre><code class="language-bash">$ docker pull apache/kafka:{{fullDotVersion}}</code></pre>
    <p> If you want to fetch the latest version of the Docker image use following command: </p>
    <pre><code class="language-bash">$ docker pull apache/kafka:latest</code></pre>
    <p> To start the Kafka container using this Docker image with default configs and on default port 9092: </p>
    <pre><code class="language-bash">$ docker run -p 9092:9092 apache/kafka:{{fullDotVersion}}</code></pre>

    <h4 class="anchor-heading">GraalVM Based Native Apache Kafka Docker Image</h4>

    <p>
        Docker images for the GraalVM Based Native Apache Kafka can be found on <a href="https://hub.docker.com/r/apache/kafka-native">Docker Hub</a> and are available from version 3.8.0.<br>
        NOTE: This image is experimental and intended for local development and testing purposes only; it is not recommended for production use.
    </p>

    <p> Docker image can be pulled from Docker Hub using the following command: </p>
    <pre><code class="language-bash">$ docker pull apache/kafka-native:{{fullDotVersion}}</code></pre>
    <p> If you want to fetch the latest version of the Docker image use following command: </p>
    <pre><code class="language-bash">$ docker pull apache/kafka-native:latest</code></pre>
    <p> To start the Kafka container using this Docker image with default configs and on default port 9092: </p>
    <pre><code class="language-bash">$ docker run -p 9092:9092 apache/kafka-native:{{fullDotVersion}}</code></pre>


    <h4 class="anchor-heading">Usage guide</h4>

    <p>
        Detailed instructions for using the Docker image are mentioned <a href="https://github.com/apache/kafka/blob/trunk/docker/examples/README.md">here</a>.
    </p>
</script>

<div class="p-docker"></div>