安装docker
yum install -y docker
启动docker
systemctl start docker
拉取镜像
- docker pull wurstmeister/zookeeper
- docker pull wurstmeister/kafka
查看镜像
docker images
启动zookeeper容器
docker run -d --name zookeeper --publish 2181:2181 --volume /etc/localtime:/etc/localtime wurstmeister/zookeeper
启动kafka容器
docker run -d --name kafka --publish 9092:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --env KAFKA_ADVERTISED_HOST_NAME=宿主机的ip --env KAFKA_ADVERTISED_PORT=9092 --volume /etc/localtime:/etc/localtime wurstmeister/kafka
进入kafka容器
docker exec -it kafka bash
创建一个kafka topic test1
kafka-topics.sh --create --zookeeper 宿主机ip:2181 --replication-factor 1 --partitions 1 --topic test01
创建一个kafka生产者
kafka-console-producer.sh --broker-list localhost:9092 --topic test01
创建一个kafka消费者
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test01 --from-beginning
设置开机自启
- docker update zookeeper --restart=always
- docker update kafka --restart=always
拉取php7.4
docker pull php:7.4-fpm
开启php容器
- docker run -p 9000:9000 -d --name php -v /www/docker:/www/docker --privileged=true php:7.4-fpm
-
- 解释:
- -p 9000:9000 :将容器的9000端口映射到主机的9000端口
- -d 后台运行(守护进程)
- --name php:将容器命名为php
- -v 将主机中当前目录下的www挂载到容器的www目录
安装librdkafka
- 先退出,exit,然后在宿主机
- cd /www/docker/librdkafka && git clone https://github.com/edenhill/librdkafka.git
-
- 下载完后,进入php容器
- docker exec -it php bash
-
- cd /www/docker/librdkafka && ./configure
- make && make install
安装php-rdkafka
pecl install rdkafka
开启扩展
docker-php-ext-enable rdkafka
php.ini配置文件写入
extension=rdkafka.so
php.ini 文件位置:
/usr/local/etc/php/
docker里没有vi命令,先拷贝到宿主机修改,然后再拷贝回去
- #宿主机创建目录
- mkdir /www/docker/php
-
- #拷贝到宿主机
- docker cp php:/usr/local/etc/php/php.ini-development /www/docker/php
- docker cp php:/usr/local/etc/php/php.ini-production /www/docker/php
-
- #添加 extension=rdkafka.so 到php.ini文件
- echo 'extension=rdkafka.so'>>/www/docker/php/php.ini-development
- echo 'extension=rdkafka.so'>>/www/docker/php/php.ini-production
-
- #从宿主机拷贝回容器里
- docker cp /www/docker/php/php.ini-development php:/usr/local/etc/php/
- docker cp /www/docker/php/php.ini-production php:/usr/local/etc/php/
命令解释:
重启php
docker restart php
查看是否加载成功
php -m
php 使用kafka
宿主机、/www/docker 下运行
composer require nmred/kafka-php
增加producer.php 生产者,consumer.php消费者
producer.php代码:
- require './vendor/autoload.php';
- date_default_timezone_set('PRC');
-
- $config = \Kafka\ProducerConfig::getInstance();
- $config->setMetadataRefreshIntervalMs(10000);
- $config->setMetadataBrokerList('localhost:9092');
- $config->setBrokerVersion('1.0.0');
- $config->setRequiredAck(1);
- $config->setIsAsyn(false);
- $config->setProduceInterval(500);
- $producer = new \Kafka\Producer();
-
-
- for($i = 0; $i < 1; $i++) {
- $result = $producer->send([
- [
- 'topic' => 'topicA',
- 'value' => 'topicA下面的第一条消息-消息1'.time(),
- 'key' => '',
- ],
- ]);
- var_dump($result);
- }
consumer.php 代码:
-
- require './vendor/autoload.php';
- date_default_timezone_set('PRC');
-
-
-
- $config = \Kafka\ConsumerConfig::getInstance();
- $config->setMetadataRefreshIntervalMs(10000);
- $config->setMetadataBrokerList('localhost:9092');
- $config->setGroupId('test');
- $config->setBrokerVersion('1.0.0');
- $config->setTopics(array('topicA'));
- //$config->setOffsetReset('earliest');
- $consumer = new \Kafka\Consumer();
-
- $consumer->start(function ($topic, $part, $message) {
- var_dump($message);
- });
先进入到容器,然后运行php文件
- #进入容器
- docker exex -it php bash
- #运行生产者
- php /www/dockerproducer.php
- #运行消费者
- php /www/dockerconsumer.php
参考链接:
https://blog.csdn.net/ertty34/article/details/122236022
https://www.jianshu.com/p/3e1d2aeaffd8
https://blog.csdn.net/qq_26683009/article/details/109289161