Tích hợp Elasticsearch vào Docker Image – Phần 3: Cấu hình, bộ nhớ, supervisor

Hướng dẫn tích hợp Elasticsearch vào Docker image backend, cấu hình bộ nhớ, supervisor và chạy đa tiến trình.

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!

Xin chào! Mình là BaoTrongIT – một lập trình viên đam mê chia sẻ kiến thức lập trình, đặc biệt là về JavaScript, Node.js, NestJS, và các công nghệ backend/frontend hiện đại. Trên blog này, mình thường xuyên đăng tải các bài viết thủ thuật, kinh nghiệm thực chiến, ví dụ minh họa dễ hiểu, giúp bạn tiếp cận và hiểu sâu các khái niệm tưởng như phức tạp trong lập trình.