Java学习踩坑:在Docker中创建Elasticsearch容器以及创建时出现的问题

本文详细介绍了如何在Docker中部署Elasticsearch 5.6.8版本,包括解决9300端口不可用的问题,修改配置文件允许远程访问,以及系统调优步骤。同时,还涉及了IK分词器及Head插件的安装方法。

本篇文章只记录本人这个菜鸟学习的笔记以及遇到的问题,如有不对,欢迎指正!

要在Docker中安装ES,首先需要拉取ES的镜像

docker pull elasticsearch:5.6.8

我在学习的时候用的为ES5.6.8,其他版本应该通用
然后创建容器

docker run ‐di ‐‐name=ES5.6.8 ‐p 9200:9200 ‐p 9300:9300
elasticsearch:5.6.`在这里插入代码片`8

通过本地浏览器访问

http://你的虚拟机IP:9200/

看到以下json数据,为创建成功

{
"name" : "WmBn0H‐",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "2g‐VVbm9Rty7J4sksZNJEg",
"version" : {
"number" : "5.6.8",
"build_hash" : "688ecce",
"build_date" : "2018‐02‐16T16:46:30.010Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}

<================================================================================>
发现的问题
但是通过Postman来给SpringCloud项目发送请求,发现Docker中的ES的9300端口不可用

NoNodeAvailableException[None of the configured nodes are available:
[{#transport#‐1}{exvgJLR‐RlCNMJy‐hzKtnA}{192.168.10.136}
{192.168.10.136:9300}]
]
at
org.elasticsearch.client.transport.TransportClientNodesService.ensureNodes
AreAvailable(TransportClientNodesService.java:347)
at
org.elasticsearch.client.transport.TransportClientNodesService.execute(Tra
nsportClientNodesService.java:245)
at
org.elasticsearch.client.transport.TransportProxyClient.execute(TransportP
roxyClient.java:59)

这是因为elasticsearch从5版本以后默认不开启远程连接,需要修改配置文件

修改配置文件需要进入容器内部

docker exec ‐it ES5.6.8 /bin/bash

使用ls命令可以看到config文件夹,进入config可以看到elasticsearch.yml文件

但是我们无法使用vi命令来操作,所以只能选择将配置文件挂载到容器外部

退出容器,将elasticsearch.yml文件拷贝到宿主机

docker cp ES5.6.8:/usr/share/elasticsearch/config/elasticsearch.yml
/usr/share/elasticsearch.yml

停止,删除原来的容器

docker stop tensquare_elasticsearch
docker rm tensquare_elasticsearch

重新创建容器

docker run ‐di ‐‐name=ES5.6.8 ‐p 9200:9200 ‐p 9300:9300 ‐v
/usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch
.yml elasticsearch:5.6.8

修改/usr/share/elasticsearch.yml 将 transport.host: 0.0.0.0 前的#去掉后保
存文件退出。其作用是允许任何ip地址访问elasticsearch .开发测试阶段可以这么做,生
产环境下指定具体的IP。

重新启动

docker restart ES5.6.8

重启后,一直使用来查看是否启动成功

docker ps

我们会发现启动失败了,这是为啥?

这与我们刚才修改的配置有关,因为elasticsearch在启动的时候会进行一些检查,比如最多打开的文件的个数以及虚拟内存区域数量等等,如果你放开了此配置,意味着需要打开更多的文件以及虚拟内存,所以我们还需要系统调优。

一共需要修改两个文件
修改/etc/security/limits.conf ,追加内容

* soft nofile 65536
* hard nofile 65536
#nofile是单个进程允许打开的最大文件个数 
#soft nofile 是软限制
#hard nofile是硬限制

修改/etc/sysctl.conf,追加内容

vm.max_map_count=655360
#限制一个进程可以拥有的VMA(虚拟内存区域)的数量

修改后执行下面命令

#修改内核参数后,立马生效
sysctl ‐p

重新启动虚拟机,再次启动容器
再次通过项目来访问,发现已经可以远程访问了
<================================================================================>
IK分词器以及head插件的安装在LInux中以及Windows中的安装大同小异
直接将IK的文件夹放置在ES的plugin中即可
只是head插件需要在docker中创建容器

Docker创建Logstash容器,若希望使用 `--link` 参数连接多个容器(例如Elasticsearch和MySQL),需要确保参数格式正确,并且理解其背后的网络机制。 ### 使用 `--link` 连接多个容器Docker命令中,可以多次使用 `--link` 参数来连接多个容器。以下是一个示例命令,用于创建一个Logstash容器并将其链接到名为 `elasticsearch` 和 `mysql` 的两个现有容器: ```bash docker run --name logstash \ -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 \ --link elasticsearch:es \ --link mysql:mysql \ -v /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \ -d logstash:7.17.3 ``` 在这个命令中: - `--link elasticsearch:es` 表示将名为 `elasticsearch` 的容器链接到当前容器,并在当前容器中通过主机名 `es` 访问它。 - `--link mysql:mysql` 表示将名为 `mysql` 的容器链接到当前容器,并在当前容器中通过主机名 `mysql` 访问它[^2]。 ### 配置文件中的连接设置 在Logstash的配置文件 `logstash.conf` 中,可以通过指定对应的主机名来访问这些服务。例如,在输出部分指定Elasticsearch的地址为 `es:9200`,而在输入或过滤器部分可以指定MySQL的地址为 `mysql:3306`。 以下是一个简单的 `logstash.conf` 示例片段: ```ruby input { jdbc { jdbc_connection_string => "jdbc:mysql://mysql:3306/mydb" jdbc_user => "user" jdbc_password => "password" jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-8.0.28.jar" jdbc_driver_class => "com.mysql.cj.jdbc.Driver" statement => "SELECT * FROM mytable WHERE last_modified > :sql_last_value" } } output { elasticsearch { hosts => ["es:9200"] index => "myindex-%{+YYYY.MM.dd}" } } ``` 在这个配置中: - Logstash通过 `mysql:3306` 连接到MySQL数据库。 - 输出数据到Elasticsearch,使用了别名 `es:9200` 来访问Elasticsearch服务[^3]。 ### 注意事项 尽管 `--link` 是一种传统的方式,但在较新的Docker版本中,建议使用自定义桥接网络(custom bridge network)来管理容器之间的通信。这可以通过创建一个自定义的Docker网络并将所有相关容器加入该网络来实现。例如: ```bash docker network create -d bridge elk_network ``` 然后启动各个容器指定该网络: ```bash docker run --name elasticsearch --network elk_network -d elasticsearch:7.17.3 docker run --name mysql --network elk_network -d mysql:5.7 docker run --name logstash --network elk_network -d logstash:7.17.3 ``` 这种方式提供了更好的可维护性和灵活性,特别是在处理多个容器之间的网络连接。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值