Tích hợp Elasticsearch vào Docker Image – Phần 3: Cấu hình, bộ nhớ, supervisor
Phần 3: Tích hợp Elasticsearch vào Docker Image – Xử lý Java, bộ nhớ và volume
Tóm tắt: Trong phần này, bạn sẽ học cách tích hợp Elasticsearch vào cùng Docker image với ứng dụng backend của mình. Bài viết bao gồm hướng dẫn cài Elasticsearch, quản lý bộ nhớ, cấu hình tối ưu, và sử dụng supervisord
để chạy Elasticsearch song song với ứng dụng Node.js.
1. Vì sao tích hợp Elasticsearch?
Elasticsearch là một search engine mạnh mẽ, thường được dùng cho:
- Log search (ELK stack)
- Full-text search
- Analytics theo thời gian thực
- Lưu trữ dữ liệu có cấu trúc hoặc bán cấu trúc
Tuy nhiên, cài đặt riêng Elasticsearch và ứng dụng backend đôi khi không cần thiết cho dev hoặc demo. Vì vậy, tích hợp Elasticsearch vào 1 Docker image có thể giúp:
- Deploy nhanh – chỉ 1 image
- Gọn nhẹ cho local, CI/CD
- Giảm cấu hình mạng & volume trong dev
2. Yêu cầu hệ thống của Elasticsearch
Để chạy Elasticsearch trong container, bạn cần:
- Có Java (OpenJDK 17 trở lên)
- Phân bổ đủ RAM (ít nhất 1GB)
- Đảm bảo user không chạy dưới
root
Chúng ta sẽ xử lý từng bước trong Dockerfile phía dưới.
3. Cấu trúc thư mục dự án
project/ ├── index.js ├── package.json ├── supervisord.conf ├── Dockerfile └── elasticsearch.yml
Note: File elasticsearch.yml
sẽ là config tối giản cho ES.
4. Viết file cấu hình Elasticsearch
# elasticsearch.yml cluster.name: docker-single-node network.host: 0.0.0.0 http.port: 9200 discovery.type: single-node xpack.security.enabled: false
Chúng ta tắt security để dễ chạy thử, không cần login bằng user/pass.
5. Viết file supervisord.conf
; supervisord.conf [supervisord] nodaemon=true [program:elasticsearch] command=/elasticsearch/bin/elasticsearch directory=/elasticsearch autostart=true autorestart=true [program:app] command=node /app/index.js autostart=true autorestart=true
Lưu ý đường dẫn đến elasticsearch sẽ phụ thuộc vào nơi bạn cài.
6. Viết Dockerfile tích hợp Elasticsearch
Giờ là phần chính – Dockerfile tích hợp ES + Node.js + Supervisor:
# Dockerfile FROM openjdk:17-slim as base # Cài các gói cần thiết RUN apt-get update && apt-get install -y \ curl \ gnupg \ ca-certificates \ unzip \ apt-transport-https \ supervisor \ && apt-get clean # Cài Node.js (v18) RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ apt-get install -y nodejs # Tải Elasticsearch (bản OSS) ENV ES_VERSION=8.13.0 RUN curl -L -o elasticsearch.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-$ES_VERSION-linux-x86_64.tar.gz && \ tar -xzf elasticsearch.tar.gz && \ mv elasticsearch-$ES_VERSION /elasticsearch # Copy config Elasticsearch COPY elasticsearch.yml /elasticsearch/config/elasticsearch.yml # Cài backend app WORKDIR /app COPY package.json ./ RUN npm install COPY index.js . . # Copy cấu hình supervisor COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # Mở cổng EXPOSE 3000 9200 # Lệnh chính CMD ["/usr/bin/supervisord"]
Chú ý: Với ES v8+, bạn có thể tắt security tạm thời bằng config như trên.
7. Chạy image và kiểm tra
docker build -t myapp-with-es .
docker run -p 3000:3000 -p 9200:9200 myapp-with-es
→ Truy cập http://localhost:9200
để xác minh Elasticsearch hoạt động
→ Truy cập http://localhost:3000
để test backend app
8. Kiểm tra từ ứng dụng Node.js
Đoạn code mẫu để kết nối tới ES trong file index.js
:
const { Client } = require('@elastic/elasticsearch'); const express = require('express'); const app = express(); const esClient = new Client({ node: 'http://localhost:9200' }); app.get('/', async (req, res) => { const result = await esClient.search({ index: 'test-index', query: { match_all: {} } }); res.json(result); }); app.listen(3000, () => console.log("App + Elasticsearch ready"));
9. Một số lưu ý sản xuất
- Không nên dùng image này trong production – nên tách ES ra container riêng
- ES cần memory tối thiểu 1GB – nhớ set RAM đủ trong Docker Desktop
- Để persist dữ liệu ES, bạn cần mount volume vào
/elasticsearch/data
10. Tổng kết
Bạn vừa hoàn thành một image tích hợp Elasticsearch + Node.js backend bằng Supervisor. Đây là một bước quan trọng nếu bạn muốn có môi trường dev/test nhanh chóng, CI/CD image-based hoặc các demo offline.
Tiếp theo: Phần 4 – Tối ưu hóa image, multi-stage build, và tự động hóa build Redis + ES + App chỉ với 1 Dockerfile duy nhất.
Follow mình tại: www.baotrongit.com để đọc phần tiếp theo!
Tham gia cuộc trò chuyện