<!--
 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">Introduction</h4>

    <p>
        <a href="https://www.docker.com/">Docker</a> is a popular container runtime. Docker images for 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>

    <h4 class="anchor-heading">Getting the kafka docker image</h4>

    <p>
        Docker image can be pulled from Docker Hub using the following command:-
    </p>

    <pre class="line-numbers"><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 class="line-numbers"><code class="language-bash">$ docker pull apache/kafka:latest</code></pre>

    <h4 class="anchor-heading">Start kafka with default configs</h4>

    <p>
        Run docker image on default port 9092:-
    </p>

    <pre class="line-numbers"><code class="language-bash">$ docker run -p 9092:9092 apache/kafka:{{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>