使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

使用Docker(Mac)搭建 Nginx/Openresty - Kafka - kafkaManager

本文默認讀者已經對Docker有一定了解,且清楚使用Docker進行部署的優勢。

1.安裝Docker(Mac)

官網:https://docs.docker.com/docker-for-mac/install/

1.1 下載 Docker for Mac

地址:https://store.docker.com/editions/community/docker-ce-desktop-mac

1.2 下載完成以後,雙擊打開文件Docker.dmg

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

image.png

1.3雙擊Docker.app啟動

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

Mac頂部狀態欄會出現鯨魚圖標

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

image.png

1.4點擊鯨魚圖標可以進行設置

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

1.5 Check versions

$ docker --versionDocker version 18.03, build c97c6d6$ docker-compose --versiondocker-compose version 1.21.2, build 8dd22a9$ docker-machine --versiondocker-machine version 0.14.0, build 9ba6da9

1.6 Hello Word

1.6.1 打開命令行終端,通過運行簡單的Docker映像測試您的安裝工作。

$ docker run hello-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-worldca4f61b1923c: Pull completeDigest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7Status: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly....

1.6.2 啟動Dockerized web server

$ docker run -d -p 80:80 --name webserver nginx

1.6.3 打開瀏覽器,輸入http://localhost/

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

常用命令:

docker ps 查看正在運行的容器docker stop停止正在運行的容器docker start啟動容器docker ps -a查看終止狀態的容器docker rm -f webserver命令來移除正在運行的容器docker list 列出本地鏡像docker rmi 刪除的鏡像

2.使用Docker安裝Nginx

Docker Store 地址:https://store.docker.com/images/nginx

其實在上文中Hello World即已經安裝了nginx。

2.1 拉取 image

docker pull nginx

3.2 創建Nginx容器

docker run --name mynginx -p 80:80 -v /Users/gaoguangchao/Work/opt/local/nginx/logs:/var/log/nginx -v /Users/gaoguangchao/Work/opt/local/nginx/conf.d:/etc/nginx/conf.d -v /Users/gaoguangchao/Work/opt/local/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v /Users/gaoguangchao/Work/opt/local/nginx/html:/etc/nginx/html -d nginx

-d 以守護進程運行(運行在後臺)

--name nginx 容器名稱;

-p 80:80 端口映射

-v 配置掛載路徑 宿主機路徑:容器內的路徑

關於掛載

  1. 為了能直接修改配置文件,以實現對Nginx的定製化,需要進行Docker的相關目錄掛在宿主機上。
  2. 需要掛載的目錄/文件:/etc/nginx/conf.d /etc/nginx/nginx.conf /etc/nginx/html
  3. 有一點尤其需要注意,當掛載的為文件而非目錄時,需要注意以下兩點:

a.掛載文件命令: -v 宿主機路徑:容器內的路徑:ro

b.宿主機需要先創建後文件,無法自動創建,反之將報錯

nginx.conf 示例

#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream demo { server 127.0.0.1:8080; } server { listen 80; server_name request_log; location / { root html; #index index.html index.htm; proxy_connect_timeout 3;  proxy_send_timeout 30;  proxy_read_timeout 30;  proxy_pass http://demo;  }  #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }}

2.3 瀏覽器訪問

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

在調試過程中往往不會很順利,這裡的技巧是通過閱讀error.log中的異常日誌進行

2.4 配置反向代理

此處是本機啟動一個 SpringBoot web server,端口為:8080,瀏覽器訪問:http://localhost:8080/index/hello

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

按照上節中nginx.conf示例中的配置方式,增加upstream、server、proxy_pass相關配置,對80端口進行監聽,重啟nginx容器。

docker restart mynginx

瀏覽器訪問:http://localhost/index/hello,可以看到正常訪問。

3.使用Docker安裝Openresty

Openresty是在Nginx基礎上做了大量的定製擴展,其安裝過程和Nginx基本一致。

Docker Store 地址:https://store.docker.com/community/images/openresty/openresty

3.1 拉取 image

docker pull openresty/openresty

3.2 創建Openresty容器

docker run -d --name="openresty" -p 80:80 -v /Users/gaoguangchao/Work/opt/local/openresty/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf:ro -v /Users/gaoguangchao/Work/opt/local/openresty/logs:/usr/local/openresty/nginx/logs -v /Users/gaoguangchao/Work/opt/local/openresty/conf.d:/etc/nginx/conf.d -v /Users/gaoguangchao/Work/opt/local/openresty/html:/etc/nginx/html openresty/openresty

注意事項和安裝Nginx基本一致,在此不再贅述。

4.使用Docker安裝Kafka

Docker Store 地址:https://store.docker.com/community/images/spotify/kafka

4.1 拉取 image

docker pull spotify/kafka

4.2 創建Kafka容器

運行命令:

docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`127.0.0.1` --env ADVERTISED_PORT=9092 spotify/kafka

2181為zookeeper端口,9092為kafka端口

輸出啟動日誌:

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

4.3 Check zookeeper是否啟動

可以使用一些可視化客戶端連接端口,進行監控,如zooInspector、Idea Zookeeper Plugin等

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

zooInspector示例

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

Idea Zookeeper Plugin

5.使用Docker安裝Kafka Manager

Kafka Manager 是Yahoo開源的kafka監控和配置的web系統,可以進行kafka的日常監控和配置的動態修改。

Docker Store 地址:https://store.docker.com/community/images/sheepkiller/kafka-manager

5.1 拉取 image

docker pull sheepkiller/kafka-manager

5.2 創建Kafka Manager容器

運行命令:

docker run -it --rm -p 9000:9000 -e ZK_HOSTS="127.0.0.1:2181" -e APPLICATION_SECRET=letmein sheepkiller/kafka-manager

2181為上節中部署的zookeeper端口,9000為kafka-manager的web端口

輸出啟動日誌:

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

5.3 訪問Kafka Manager

瀏覽器訪問:http://localhost:9000

按照頁面上的操作按鈕進行kafka集群的註冊,具體使用方式再次不做詳細介紹。

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

註冊配置後的界面:

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

6.Kafka消息生產與消費

6.1創建maven項目

pom依賴

   org.slf4j jcl-over-slf4j ${org.slf4j-version} runtime   org.apache.logging.log4j log4j-1.2-api ${log4j2-version}   org.apache.logging.log4j log4j-slf4j-impl ${log4j2-version}   org.apache.logging.log4j log4j-api ${log4j2-version}  
org.apache.logging.log4j log4j-core ${log4j2-version} com.lmax disruptor 3.2.0 com.sankuai.meituan scribe-log4j2 1.0.9 org.apache.kafka kafka-clients 0.10.1.0

6.2 增加log4j2配置

配置log4j2為能正常打印debug日誌,方便進行異常排查 (重要)

在resources目錄下增加log4j2.xml文件

 
%d %-5p (%F:%L) - %m%n /logs

關於log4j2的使用,有興趣的可以瞭解:Log4j1升級Log4j2實戰

6.3 創建生產者示例

package com.moko.kafka;import org.apache.kafka.clients.producer.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Properties;public class MokoProducer extends Thread { private static final Logger LOGGER = LoggerFactory.getLogger(MokoProducer.class); private final KafkaProducer producer; private final String topic; private final boolean isAsync; public MokoProducer(String topic, boolean isAsync) { Properties properties = new Properties(); properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "78c4f4a0f989:9092");//broker 集群地址 properties.put(ProducerConfig.CLIENT_ID_CONFIG, "MokoProducer");//自定義客戶端id properties.put(ProducerConfig.ACKS_CONFIG, "all"); properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");//key 序列號方式 properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");//value 序列號方式 this.producer = new KafkaProducer(properties); this.topic = topic; this.isAsync = isAsync; } @Override public void run() { int seq = 0; while (true) { String msg = "Msg: " + seq; if (isAsync) {//異步 producer.send(new ProducerRecord(this.topic, msg)); } else {//同步 producer.send(new ProducerRecord(this.topic, msg), new MsgProducerCallback(msg)); } seq++; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 消息發送後的回調函數 */ class MsgProducerCallback implements Callback { private final String msg; public MsgProducerCallback(String msg) { this.msg = msg; } public void onCompletion(RecordMetadata recordMetadata, Exception e) { if (recordMetadata != null) { LOGGER.info(msg + " be sended to partition no : " + recordMetadata.partition()); } else { LOGGER.info("recordMetadata is null"); } if (e != null) e.printStackTrace(); } } public static void main(String args[]) { new MokoProducer("access-log", false).start();//開始發送消息 }}

簡單運行後,打印日誌如下:

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

6.4 創建消費者示例

package com.moko.kafka;import org.apache.kafka.clients.consumer.ConsumerRecord;import org.apache.kafka.clients.consumer.ConsumerRecords;import org.apache.kafka.clients.consumer.KafkaConsumer;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Arrays;import java.util.Properties;public class MokoCustomer { private static final Logger LOGGER = LoggerFactory.getLogger(MokoCustomer.class); public static void main(String args[]) throws Exception { String topicName = "access-log"; Properties props = new Properties(); KafkaConsumer consumer = getKafkaConsumer(props); consumer.subscribe(Arrays.asList(topicName)); while (true) { ConsumerRecords records = consumer.poll(100); if (!records.isEmpty()) { LOGGER.info("========================="); } for (ConsumerRecord record : records) { LOGGER.info(record.value()); } } } private static KafkaConsumer getKafkaConsumer(Properties props) { props.put("bootstrap.servers", "172.18.153.41:9092"); props.put("group.id", "group-1"); props.put("enable.auto.commit", "true"); props.put("auto.commit.interval.ms", "1000"); props.put("session.timeout.ms", "30000"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); return new KafkaConsumer(props); }}

簡單運行後,打印日誌如下:

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

6.5 注意事項

由於是在本機使用Docker搭建的環境,遇到最多的問題就是網絡問題,如host等的配置,但是隻要意識到這點,通過注意分析各種異常日誌,便不難排查解決。

使用Docker(Mac)搭建 Nginx/Openresty-Kafka-kafkaManager

項目目錄結構

7.結語

致此,本文就介紹完了如何使用Docker搭建 Nginx/Openresty - Kafka - kafkaManager。

後續將會繼續介紹如何使用Docker搭建一套 nginx+lua+kafka實現的日誌收集的教程,敬請期待。

更好的閱讀體驗可以點擊進入 簡書 博客。


個人介紹:

高廣超:多年一線互聯網研發與架構設計經驗,擅長設計與落地高可用、高性能、可擴展的互聯網架構。


分享到:


相關文章: