别再手动敲命令了!用Docker Compose一键部署带密码的Elasticsearch 7.14.1
告别重复劳动:Docker Compose全自动部署安全版Elasticsearch实战
每次新项目上线都要重新配置Elasticsearch集群?还在为不同环境下的配置差异头疼?运维工程师的时间不该浪费在重复劳动上。本文将带你用Docker Compose打造一套可复用的安全部署方案,从单节点到集群配置,从基础认证到资源调优,全部通过声明式配置实现。无论你是需要快速搭建开发环境,还是为生产系统建立标准化部署流程,这套方法都能让你告别手动操作的繁琐。
1. 为什么选择Docker Compose管理Elasticsearch
传统Elasticsearch部署需要经历下载安装包、修改配置文件、设置系统参数、配置安全认证等一系列步骤。在不同环境中部署时,这些步骤往往需要重复执行,不仅效率低下,还容易因人为疏忽导致配置不一致。而Docker Compose通过基础设施即代码的方式,将整个部署过程抽象为可版本控制的配置文件。
对比几种常见部署方式:
| 部署方式 | 配置复杂度 | 可重复性 | 安全基线 | 适合场景 |
|---|---|---|---|---|
| 手动安装 | 高 | 差 | 需手动 | 学习测试 |
| Docker单容器 | 中 | 中 | 需额外 | 快速验证 |
| Docker Compose | 低 | 优秀 | 内置 | 开发/测试/生产全流程 |
使用Docker Compose的核心优势在于:
- 环境一致性:开发、测试、生产环境使用完全相同的配置
- 快速重建:几分钟内即可重建完整环境
- 版本控制:配置文件可纳入Git管理
- 安全预置:内置的安全配置模板
2. 基础部署:单节点安全集群搭建
我们先从最基础的单节点部署开始。创建一个docker-compose.yml文件,内容如下:
version: '3.8' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.14.1 environment: - discovery.type=single-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms1g -Xmx1g" - ELASTIC_PASSWORD=YourSecurePassword123! volumes: - es_data:/usr/share/elasticsearch/data ports: - "9200:9200" ulimits: memlock: soft: -1 hard: -1 volumes: es_data:关键配置解析:
discovery.type=single-node:指定单节点模式ELASTIC_PASSWORD:设置默认用户elastic的密码ES_JAVA_OPTS:配置JVM堆内存大小memlock:禁用内存交换以保证性能
启动服务只需执行:
docker-compose up -d注意:首次启动时会自动生成安全证书和密钥,这可能需要几分钟时间
验证服务是否正常运行:
curl -u elastic:YourSecurePassword123! https://localhost:9200 -k3. 生产级配置:集群部署与性能调优
对于生产环境,我们需要考虑更多因素:节点角色分离、资源限制、持久化存储等。下面是一个三节点集群的配置示例:
version: '3.8' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.14.1 environment: - node.name=es01 - cluster.name=es-docker-cluster - discovery.seed_hosts=es02,es03 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms4g -Xmx4g" - ELASTIC_PASSWORD=YourSecurePassword123! volumes: - es01_data:/usr/share/elasticsearch/data ulimits: memlock: soft: -1 hard: -1 deploy: resources: limits: cpus: '2' memory: 8G es02: image: docker.elastic.co/elasticsearch/elasticsearch:7.14.1 environment: - node.name=es02 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es03 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms4g -Xmx4g" volumes: - es02_data:/usr/share/elasticsearch/data ulimits: memlock: soft: -1 hard: -1 deploy: resources: limits: cpus: '2' memory: 8G es03: image: docker.elastic.co/elasticsearch/elasticsearch:7.14.1 environment: - node.name=es03 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms4g -Xmx4g" volumes: - es03_data:/usr/share/elasticsearch/data ulimits: memlock: soft: -1 hard: -1 deploy: resources: limits: cpus: '2' memory: 8G volumes: es01_data: es02_data: es03_data:生产环境配置要点:
- 节点角色分离:可通过
node.roles配置专用主节点、数据节点等 - 资源限制:使用
deploy.resources确保容器不会占用过多主机资源 - 独立存储卷:每个节点使用独立卷避免数据冲突
- 网络配置:建议使用自定义网络提高安全性
4. 高级安全配置:多用户与TLS加密
基础密码认证只是安全的第一步。企业级部署还需要考虑:
1. 创建多用户角色
通过Elasticsearch的API创建不同权限的用户:
# 创建只读用户 curl -u elastic:YourSecurePassword123! -X POST "https://localhost:9200/_security/user/reader" -H "Content-Type: application/json" -d' { "password": "ReaderPass123!", "roles": ["reader"], "full_name": "Read Only User" }' # 创建读写用户 curl -u elastic:YourSecurePassword123! -X POST "https://localhost:9200/_security/user/writer" -H "Content-Type: application/json" -d' { "password": "WriterPass456!", "roles": ["ingest_admin", "index_user"], "full_name": "Write User" }'2. 启用TLS加密传输
修改docker-compose.yml增加TLS配置:
environment: - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - xpack.security.http.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-certificates.p12 - xpack.security.http.ssl.verification_mode=certificate然后生成证书并挂载到容器:
# 生成PKCS#12格式的证书 docker run --rm -v $(pwd)/certs:/usr/share/elasticsearch/config/certs docker.elastic.co/elasticsearch/elasticsearch:7.14.1 \ bin/elasticsearch-certutil cert -out config/certs/elastic-certificates.p12 -pass "" # 在docker-compose.yml中添加卷挂载 volumes: - ./certs:/usr/share/elasticsearch/config/certs5. 集成Kibana与监控组件
完整的ELK栈还需要Kibana的支持。扩展我们的docker-compose.yml:
services: kibana: image: docker.elastic.co/kibana/kibana:7.14.1 environment: - ELASTICSEARCH_HOSTS=https://es01:9200 - ELASTICSEARCH_USERNAME=kibana_system - ELASTICSEARCH_PASSWORD=YourKibanaPassword456! ports: - "5601:5601" depends_on: - es01 - es02 - es03Kibana配置注意事项:
- 需要先在Elasticsearch中设置
kibana_system用户的密码 - 确保Kibana能访问Elasticsearch的HTTPS端口
- 生产环境建议为Kibana也配置TLS
对于监控,可以添加Elasticsearch的监控组件:
services: metricbeat: image: docker.elastic.co/beats/metricbeat:7.14.1 user: root command: --strict.perms=false volumes: - ./metricbeat.yml:/usr/share/metricbeat/metricbeat.yml - /var/run/docker.sock:/var/run/docker.sock depends_on: - es016. 环境变量管理与敏感信息保护
直接在docker-compose.yml中硬编码密码存在安全风险。更好的做法是使用环境变量文件:
- 创建
.env文件:
ELASTIC_PASSWORD=YourSecurePassword123! KIBANA_PASSWORD=YourKibanaPassword456! ES_JAVA_OPTS=-Xms4g -Xmx4g- 修改docker-compose.yml引用环境变量:
environment: - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - "ES_JAVA_OPTS=${ES_JAVA_OPTS}"- 启动时指定环境文件:
docker-compose --env-file .env up -d重要:确保将.env文件加入.gitignore,避免敏感信息泄露
对于团队协作场景,可以考虑使用Docker Secrets或第三方密钥管理服务:
secrets: elastic_password: file: ./secrets/elastic_password.txt kibana_password: file: ./secrets/kibana_password.txt services: elasticsearch: environment: - ELASTIC_PASSWORD_FILE=/run/secrets/elastic_password secrets: - elastic_password