Docker 详解+示例(部署Kafka镜像容器)
介 绍
Docker 是一个开源的容器化平台,它的核心目标是解决 “软件在不同环境下运行不一致” 的问题,实现 “一次构建,到处运行” 。
它基于 Linux 内核的底层技术,将应用程序及其依赖(如库文件、配置、运行环境等)打包成一个标准化的 “容器”——>这个容器就像一个轻量级的 “独立沙箱”,它能够在隔离应用与宿主系统的同时,也隔离不同应用之间的资源和运行环境,这意味着每个应用都如同处于一个独立的空间中,既不会受宿主系统的干扰,也不会与其他应用产生资源冲突或环境干扰。同时又避免了传统虚拟机因包含完整操作系统而导致的体积庞大、启动缓慢问题。
与传统虚拟机相比,Docker 容器具有显著优势:启动时间通常以秒级计算(远快于虚拟机的分钟级),单个宿主可同时运行数百个容器(资源利用率更高),且容器体积仅包含应用和依赖(通常为 MB 级,而虚拟机常为 GB 级)。
在实际场景中,Docker 已成为开发、测试、部署全流程的核心工具;开发人员可在本地用容器模拟生产环境,避免 “本地能跑、线上报错”;运维人员可通过容器快速实现应用的批量部署、扩容缩容;企业则借助 Docker 构建微服务架构,将复杂应用拆分为多个独立容器,降低耦合度,提升迭代效率。
Docker 核心命令详解及示例
1. 基础命令
docker version
docker version
docker info
docker info
docker --help
docker --help
2. 镜像相关命令
docker images
docker images
docker search
docker search ubuntu
docker pull
docker pull ubuntu:20.04
docker rmi
docker rmi ubuntu:20.04
docker build -t
docker build -t myapp:1.0 .
docker tag
docker tag myapp:1.0 username/myapp:1.0
docker push
docker push username/myapp:1.0
3. 容器相关命令
docker run [选项]
docker run -it --name mycontainer ubuntu:20.04 /bin/bash
docker ps
docker ps
docker ps -a
docker ps -a
docker start
docker start mycontainer
docker stop
docker stop mycontainer
docker restart
docker restart mycontainer
docker rm
docker rm mycontainer
docker exec [选项]
docker exec -it mycontainer /bin/bash
docker logs
docker logs mycontainer
docker inspect
docker inspect mycontainer
docker cp :
docker cp file.txt mycontainer:/root/
docker cp :
docker cp mycontainer:/root/file.txt .
4. 容器资源限制
docker run -m
docker run -m 512m ubuntu:20.04
docker run --cpus
docker run --cpus 0.5 ubuntu:20.04
5. 网络相关命令
docker network ls
docker network ls
docker network create
docker network create mynetwork
docker network connect
docker network connect mynetwork mycontainer
docker network disconnect
docker network disconnect mynetwork mycontainer
示例:使用 Docker 安装运行 Kafka 镜像容器
-----> 方式一 docker run
旧版kafka需要zookeeper支持,新版kafka有kraft不需要zookeeper
1.docker run 配置(如下)
docker run -d --name kafka-kraft -e CLUSTER_ID=whaEHdjVT1Oacl9hnbmn1w -e KAFKA_PROCESS_ROLES=broker,controller -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://你的虚拟机ens33地址:9092 -e KAFKA_CONTROLLER_QUORUM_VOTERS=0@虚拟机回环地址:9093 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 -p 9092:9092 -p 9093:9093 confluentinc/cp-kafka:latest
2.docker ps
3.docker ps -a
4.docker start 容器名
5.docker ps
-----> 方式二 docker compose
旧版kafka需要zookeeper支持,这里使用docker compose进行集群管理。
步骤 1:创建工作目录
首先创建一个专门用于运行 Kafka 的目录,避免文件混乱:
mkdir -p ~/docker-kafkacd ~/docker-kafka
步骤 2:创建 Docker Compose 配置文件
Kafka 依赖 ZooKeeper 进行集群管理,我们使用 Docker Compose 同时启动这两个服务。
cd进入到kafka目录下,创建 docker-compose.yml
文件,并使用vi命令编写保存:
version: \'3.8\'services: # ZooKeeper 服务 zookeeper: image: confluentinc/cp-zookeeper:7.4.0 # 使用指定版本,避免兼容性问题 container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 # 客户端连接端口 ZOOKEEPER_TICK_TIME: 2000 # 心跳间隔时间(毫秒) ports: - \"2181:2181\" # 映射到宿主机的 2181 端口 volumes: - zookeeper-data:/var/lib/zookeeper/data # 持久化数据 - zookeeper-log:/var/lib/zookeeper/log # 持久化日志 restart: unless-stopped # 异常退出时自动重启 # Kafka 服务 kafka: image: confluentinc/cp-kafka:7.4.0 # 与 ZooKeeper 版本保持一致 container_name: kafka depends_on: - zookeeper # 确保 ZooKeeper 先启动 ports: - \"9092:9092\" # 宿主机访问端口 environment: KAFKA_BROKER_ID: 1 # broker 唯一标识(集群中需不同) KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 # 连接 ZooKeeper KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 # 内部服务间通信使用 29092 端口,外部访问使用 9092 端口 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 # 偏移量主题的副本数 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 volumes: - kafka-data:/var/lib/kafka/data # 持久化 Kafka 数据 restart: unless-stopped # 异常退出时自动重启# 定义持久化卷volumes: zookeeper-data: zookeeper-log: kafka-data:
步骤 3:启动服务
在 docker-compose.yml
所在目录执行以下命令启动服务:
# 后台启动服务(-d 表示 detached 模式)docker-compose up -d# 查看启动状态docker-compose ps
Windows系统访问kafka
注意:
不能直接通过浏览器访问 Kafka 的 9092 端口来操作 Kafka(比如发送 / 接收消息、管理主题等),核心原因是 Kafka 不支持 HTTP 协议(浏览器默认使用 HTTP/HTTPS 协议),它采用的是自定义的二进制协议(基于 TCP),浏览器无法解析这种协议,自然无法直接交互。
为什么浏览器无法访问 Kafka?
-
协议不兼容
浏览器的核心功能是通过 HTTP/HTTPS 协议与服务器通信(比如访问网页、调用 API),而 Kafka 基于 TCP 实现了一套自定义二进制协议,用于处理消息生产、消费、主题管理等操作,两者协议完全不同,浏览器无法识别 Kafka 的协议格式。 -
Kafka 无 Web 界面
Kafka 本身是一个 “后端消息中间件”,默认没有内置 Web 管理界面或 HTTP 接口,不像 Nginx、Tomcat 那样可以通过浏览器访问默认页面。即使你在浏览器中输入http://Linux服务器IP:9092
,也只会得到 “连接失败” 或 “无法访问” 的提示。
与 Kafka 不同,RabbitMQ 默认支持通过浏览器访问—— 因为它内置了一个官方的 Web 管理界面(RabbitMQ Management Plugin
),该界面基于 HTTP 协议提供服务,浏览器可以直接解析和交互。下面详细说明如何通过浏览器访问 RabbitMQ,以及相关配置和操作。