背景
前段時(shí)間因?yàn)轫?xiàng)目原因,需要基于Docker搭建Tomcat、Redis、Elasticsearch、Kibana、es-head、zookeeper、kafka環(huán)境,在搭建過程中也是遇到了一些問題,在此,簡(jiǎn)單總結(jié)一下,以供大家參考~ 文章有不足之處,請(qǐng)大家指出~
本篇將依次對(duì)以下環(huán)境搭建進(jìn)行說明:
- Tomcat
- Redis
- Elasticsearch
- Kibana
- es-head
- zookeeper
- kafka
Tomcat(以tomcat:8.5.43為例)
拉取tomcat鏡像
docker pull tomcat:8.5.43
Tomcat容器啟動(dòng)前,為便于對(duì)容器內(nèi)的logs、webapps、conf進(jìn)行管理,將需要管理的容器在運(yùn)行的時(shí)候暴露出來,即掛載到宿主機(jī)上對(duì)應(yīng)的文件,在此之前,在宿主機(jī)上創(chuàng)建掛載目錄。
- 創(chuàng)建目錄,用于掛載相關(guān)配置文件(/home目錄下)
cd /home
mkdir tomcat
cd tomcat
mkdir logs webapps conf
- 授權(quán)目錄
chmod 777 log webapps conf
注:如果未授權(quán),在容器啟動(dòng)時(shí),可能會(huì)報(bào)以下錯(cuò)誤:
not permited to read file.........
- 啟動(dòng)容器
docker run -d --name tomcat --restart=always --privileged=true -p 8080:8080 -v /home/tomcat/webapps:/usr/local/tomcat/webapps -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/conf:/usr/local/tomcat/conf tomcat:8.5.43
- 命令解析
- -d 將容器于后臺(tái)運(yùn)行
- --name 為容器命名
- --restart=always 表示容器開機(jī)即啟動(dòng)
- --privileged=true 使用該參數(shù),container內(nèi)的root擁有真正的root權(quán)限
- -p 端口映射,將容器內(nèi)部的端口映射至宿主機(jī)中的指定端口
- -P 端口映射 ,將容器內(nèi)部端口映射至宿主機(jī)中的隨機(jī)端口
- -v volume的簡(jiǎn)寫,表示容器卷,此處可表示將容器內(nèi)的文件掛載至宿主機(jī)中的文件
- 容器相關(guān)操作
1.查看容器狀態(tài)
docker ps -a # -a表示查看所有容器狀態(tài)
2.查看容器日記
docker logs 容器名
3.進(jìn)入容器內(nèi)部
docker exec -it 容器名 /bin/bash
4.啟動(dòng)、重啟、停止、刪除容器
docker start 容器名稱
docker restart 容器名稱
docker stop 容器名稱
docker rm 容器名稱
5.訪問tomcat主頁

Redis(以redis:3.2.11為例)
拉取鏡像
docker pull redis:3.2.11
- 創(chuàng)建掛載目錄
cd /home
mkdir redis && cd redis
mkdir conf data
注意: 因?yàn)閞edis默認(rèn)配置你會(huì)發(fā)現(xiàn)只能夠本地連接,不能進(jìn)行遠(yuǎn)程訪問,使用redis desktop manager 連接都會(huì)報(bào)錯(cuò),因此需要手動(dòng)掛載配置文件
在conf下,
vim redis.conf
redis.conf模板地址:http://download.redis.io/redis-stable/redis.conf
- 修改配置文件
#//允許遠(yuǎn)程連接
#bind 127.0.0.1
protected-mode no
# //持久化
appendonly yes
# //密碼
requirepass password
- 授權(quán)
chmod 777 ./conf/redis.conf #當(dāng)前目錄為redis下
chmod 777 data
- 啟動(dòng)容器
docker run -d --name redis --restart=always --privileged=true -p 6379:6379 -v /home/redis/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data redis:3.2.11 redis-server --appendonly yes --requirepass "han"
如果報(bào)錯(cuò) WARNING: IPv4 forwarding is disabled. Networking will not work.
解決方法:
需要做如下配置
vi /usr/lib/sysctl.d/00-system.conf
添加如下代碼:
net.ipv4.ip_forward=1
重啟network服務(wù)
systemctl restart network
- 命令解析
1.appendonly yes 表示持久化
2.requirepass "han" 設(shè)置連接密碼為"han" - 相關(guān)操作
docker exec -it redis redis-cli #進(jìn)入redis容器內(nèi)部客戶端
auth password #password為容器啟動(dòng)時(shí)設(shè)置的密碼
set key value
get key
- 測(cè)試連接
在Redis Desktop Manager,輸入服務(wù)器地址以及redis密碼,點(diǎn)擊連接

成功連接:

elasticsearch集群(已elasticsearch:7.6.2)
在三臺(tái)服務(wù)器上搭建elasticsearch集群
服務(wù)器地址(示例):
1、101.200.211.110
2、101.200.211.111
3、101.200.211.112
節(jié)點(diǎn)1: es-node1
- 拉取鏡像
docker pull elasticsearch:7.6.2
- 調(diào)高JVM線程數(shù)限制數(shù)量
在centos窗口中,修改配置sysctl.conf
命令:
vi /etc/sysctl.conf
加入一下內(nèi)容:
vm.max_map_count=262144
啟動(dòng)配置:
sysctl -p
注:這一步是為了防止啟動(dòng)容器時(shí),報(bào)出如下錯(cuò)誤:
bootstrap checks failed max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
- 新建掛載目錄
cd /home
mkdir elastic && cd elastic
mkdir conf logs plugins data
- 配置elasticsearch.yml文件
在/home/elastic/config下,創(chuàng)建并配置elasticsearch.yml文件
cluster.name: es-cluster
node.name: es-node1
network.bind_host: 0.0.0.0
network.publish_host: 101.200.211.110
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true #允許跨域訪問
http.cors.allow-origin: "*" #允許來自任何源的訪問
http.cors.allow-headers: Authorization,content-type
node.master: true #主節(jié)點(diǎn)是否存儲(chǔ)數(shù)據(jù)
node.data: true #從節(jié)點(diǎn)是否存儲(chǔ)數(shù)據(jù)
discovery.zen.ping.unicast.hosts: ["101.200.211.110:9300","101.200.211.111:9300","101.200.211.112:9300"]
discovery.zen.minimum_master_nodes: 2 #最少節(jié)點(diǎn)個(gè)數(shù)
cluster.initial_master_nodes: es-node1,es-node2,es-node3 #初始化主節(jié)點(diǎn),節(jié)點(diǎn)加載時(shí),會(huì)存在主節(jié)點(diǎn)競(jìng)爭(zhēng)
#加密,在容器啟動(dòng)前,先注釋,不然會(huì)報(bào)錯(cuò),后續(xù)再去掉注釋
#xpack.security.enabled: true
#xpack.security.transport.ssl.enabled: true
#xpack.security.transport.ssl.verification_mode: certificate
#xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
#xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
- 文件授權(quán)
chmod 777 ./conf/elasticsearch.yml logs data plugins # 當(dāng)前路徑為/home/elatic
- 啟動(dòng)容器
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d --name es-1 --restart=always --privileged=true -p 9200:9200 -p 9300:9300 -v /home/elastic/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/elastic/data:/usr/share/elasticsearch/data -v /home/elastic/logs:/usr/share/elasticsearch/logs -v /home/elastic/plugins://usr/share/elasticsearch/plugins elasticsearch:7.6.2
- 命令解析
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" 表示運(yùn)行時(shí)指定jvm內(nèi)存 - 節(jié)點(diǎn)2:es-node2,節(jié)點(diǎn)3:es-node3操作同節(jié)點(diǎn)1,只需改動(dòng)對(duì)應(yīng)的節(jié)點(diǎn)名和容器名即可
- 查看容器狀態(tài)
#查看es的日志極為重要,可以通過日志查看容器是否正常啟動(dòng)
docker logs es-1
# 請(qǐng)求節(jié)點(diǎn)信息
curl 101.200.211.110:9200

- 配置elasticsearch訪問密碼
1、進(jìn)入容器
docker exec -it es-1 /bin/bash
2、執(zhí)行命令:./bin/elasticsearch-certutil ca 系統(tǒng)會(huì)提示生成文件名及證書密碼,回車兩次,默認(rèn)系統(tǒng)生成的文件和密碼執(zhí)行,生成elastic-certificates.p12文件
./bin/elasticsearch-certutil ca
3、執(zhí)行命令:./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 系統(tǒng)會(huì)提示生成文件名及證書密碼,回車三次,默認(rèn)系統(tǒng)生成的文件和密碼執(zhí)行,生成elastic-stack-ca.p12文件
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
4、生成的elastic-certificates.p12 cert --ca elastic-stack-ca.p12文件默認(rèn)在/usr/share/elasticsearch目錄下,執(zhí)行命令將它們移動(dòng)到conf目錄下
mv elastic-*.p12 ./config/
#授權(quán)
cd config
chmod 777 elastic-*.p12
5、退出容器,并修改elasticsearch.yml文件
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
注:節(jié)點(diǎn)2,3同節(jié)點(diǎn)1操作一致
6、重啟容器
dokcer restart es-1
dokcer restart es-2
docker restart es-3
7、選擇其中一個(gè)容器,進(jìn)行密碼設(shè)置,因?yàn)槭羌涸?,一臺(tái)設(shè)置了,其他兩臺(tái)也會(huì)生效
docker exec -it es-1 /bin/bash
./bin/elasticsearch-setup-passwords interactive #會(huì)對(duì)elastic、apm_system、kibana、logstash_system、beats_system、remote_monitoring_user進(jìn)行密碼設(shè)置
8、設(shè)置成功后,重啟容器,打開瀏覽器,輸入地址,如出現(xiàn)下圖,則表示設(shè)置密碼成功

9、查看集群狀態(tài):http://101.200.211.110:9200/_cat/nodes?pretty
kibana(以kibana:7.6.2為例,對(duì)應(yīng)es版本)
- 拉取鏡像
docker pull kibana:7.6.2
- 運(yùn)行容器
docker run -d --name kibana --restart=always --privileged=true -p 5601:5601 kibana:7.6.2
注:因?yàn)閗ibana只是一個(gè)操作es的工具,故可不配置掛載文件
- 修改kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://101.200.211.234:9200" ] #對(duì)應(yīng)es服務(wù)器地址
xpack.monitoring.ui.container.elasticsearch.enabled: true
#es配置密碼時(shí)對(duì)應(yīng)的用戶名和密碼
elasticsearch.username: "elastic"
elasticsearch.password: "111111"
-
查看kibana,會(huì)提示輸入用戶名和密碼
image.png
elasticsearch-head
- 拉取鏡像
docker pull mobz/elasticsearch-head:5
- 啟動(dòng)容器
docker run -d --name es-head --restart=always --privileged=true -p 9100:9100 mobz/elasticsearch-head:5
- 查看es-head
注:因?yàn)閑s進(jìn)行了加密,應(yīng)在瀏覽器的地址中加入es的用戶名和密碼
地址:http://101.200.211.110:9100/?auth_user=elastic&auth_password=111111 -
如出現(xiàn)該頁面,說明es-head搭建成功
image.png
zookeeper集群(以zookeeper:3.4.12為例)
-拉取鏡像
docker pull zookeeper:3.4.12
在三臺(tái)服務(wù)器上搭建zookeepeer集群
服務(wù)器地址(示例):
1、101.200.211.110 ->節(jié)點(diǎn)1
2、101.200.211.111 -> 節(jié)點(diǎn)2
3、101.200.211.112 -> 節(jié)點(diǎn)3
節(jié)點(diǎn)1
docker run -tid --name=zk-1 --restart=always --privileged=true -p 2888:2888 -p 3888:3888 -p 2181:2181 -e ZOO_MY_ID=1 -e ZOO_SERVERS=server.1="0.0.0.0:2888:3888 server.2=101.200.211.111:2888:3888 server.3=101.200.211.112:2888:3888" zookeeper:3.4.12
節(jié)點(diǎn)2
docker run -tid --name=zk-2 --restart=always --privileged=true -p 2888:2888 -p 3888:3888 -p 2181:2181 -e ZOO_MY_ID=2 -e ZOO_SERVERS=server.1="101.200.211.110:2888:3888 server.2=0.0.0.0.:2888:3888 server.3=101.200.211.112:2888:3888" zookeeper:3.4.12
節(jié)點(diǎn)3
docker run -tid --name=zk-3 --restart=always --privileged=true -p 2888:2888 -p 3888:3888 -p 2181:2181 -e ZOO_MY_ID=3 -e ZOO_SERVERS=server.1="101.200.211.110:2888:3888 server.2=101.200.211.111.:2888:3888 server.3=0.0.0.0:2888:3888" zookeeper:3.4.12
- 查看集群狀態(tài)
docker exec -it zk-1 bash ./bin/zkServer.sh status
kafka集群(以kafka:2.11-1.1.1為例)
- 拉取鏡像
docker pull wurstmeister/kafka:2.11-1.1.1
在三臺(tái)服務(wù)器上搭建kafka集群
服務(wù)器地址(示例):
1、101.200.211.110 ->節(jié)點(diǎn)1
2、101.200.211.111 -> 節(jié)點(diǎn)2
3、101.200.211.112 -> 節(jié)點(diǎn)3
Kafka節(jié)點(diǎn)1
docker run -itd --name=kafka --restart=always -p 9092:9092 --privileged=true -v /etc/hosts:/etc/hosts -e KAFKA_ADVERTISED_HOST_NAME=101.200.211.110 -e HOST_IP=101.200.211.110 -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_ZOOKEEPER_CONNECT=1101.200.211.110:2181,101.200.211.111:2181,101.200.211.112:2181 -e KAFKA_BROKER_ID=0 -e KAFKA_HEAP_OPTS="-Xmx8196M -Xms8196M" wurstmeister/kafka:2.11-1.1.1
Kafka 節(jié)點(diǎn)2
docker run -itd --name=kafka --restart=always -p 9092:9092 --privileged=true -v /etc/hosts:/etc/hosts -e KAFKA_ADVERTISED_HOST_NAME=101.200.211.110 -e HOST_IP=101.200.211.110 -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_ZOOKEEPER_CONNECT=1101.200.211.110:2181,101.200.211.111:2181,101.200.211.112:2181 -e KAFKA_BROKER_ID=0 -e KAFKA_HEAP_OPTS="-Xmx8196M -Xms8196M" wurstmeister/kafka:2.11-1.1.1
Kafka 節(jié)點(diǎn)3
docker run -itd --name=kafka --restart=always -p 9092:9092 --privileged=true -v /etc/hosts:/etc/hosts -e KAFKA_ADVERTISED_HOST_NAME=101.200.211.110 -e HOST_IP=101.200.211.110 -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_ZOOKEEPER_CONNECT=1101.200.211.110:2181,101.200.211.111:2181,101.200.211.112:2181 -e KAFKA_BROKER_ID=0 -e KAFKA_HEAP_OPTS="-Xmx8196M -Xms8196M" wurstmeister/kafka:2.11-1.1.1
- 創(chuàng)建topic
訂閱
docker exec -it kafka bash /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 101.200.211.110:9092,101.200.211.111:9092,101.200.211.112:9092 --topic test --from-beginning
發(fā)送消息
docker exec -it kafka bash /opt/kafka/bin/kafka-console-producer.sh --broker-list 101.200.211.110:9092,101.200.211.111:9092,101.200.211.112:9092 --topic test

