Docker에서 ElasticSearch로 Full-Text 검색하기(1)
Docker에서 ElasticSearch로 Full-Text 검색하기(2)
Docker에서 ElasticSearch로 Full-Text 검색하기(3)
지난 시간에 이어서, 마지막으로 elasticSearch로 작성 된 App을 배포하고 사용해보도록 하겠습니다.
App을 배포하기 전에 express로 클라이언트 route를 구성해서 browser에서 검색 결과를 바로 확인할 수 있도록 하고, 불필요한 코드를 정리 해보겠습니다.
express를 설치해주세요.
npm i express
const express = require("express");
const app = express();
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log("server connected");
});
app.get("/search", async (req, res) => {
const query = req.query.q;
try {
const results = await searchQuery(query);
res.json(results);
} catch (error) {
console.error(error);
res.status(500).json({ message: "Internal sever error" });
}
});
const { Client } = require("elasticsearch");
const client = new Client({
host: "http://host.docker.internal:9200",
log: "trace",
});
const searchQuery = async function (query) {
const { hits } = await client.search({
index: "indexing",
body: {
query: {
fuzzy: {
content: {
value: query,
fuzziness: "AUTO",
},
},
},
},
});
return hits.hits ?? [];
};
index.js 파일의 상단에 express를 호출하고, 3000 포트로 띄우는 코드를 삽입했습니다.
route를 /search로 하여 /search?q=elk 와 같이 검색 했을 시에 searchQuery함수를 실행하여, 해당 fuzzy 검색 결과의 hits를 반환하도록 했습니다.
만약에 검색 결과가 없을 시에는 빈 배열이 나오도록 해두었습니다.
docker에 배포하기 위해서 host의 주소를 http://localhost:9200가 아닌 http://host.docker.internal:9200로 해줘야 합니다.
{
"dependencies": {
"elasticsearch": "^16.7.3",
"express": "^4.18.2"
},
"scripts": {
"start": "node index.js"
}
}
최종 package.json파일 입니다.
scripts는 하단 npm start가 실행될 수 있도록 설정 해두었습니다.
Docker에 Node.js 앱을 배포하려면 먼저 앱의 Docker 이미지를 빌드해야 합니다.
이는 필요한 구성을 지정하는 앱 디렉터리의 루트에 Dockerfile을 생성하여 수행할 수 있습니다.
node app의 root에 "Dockerfile"을 생성하세요.
# Use the official Node.js image as the base image
FROM node:latest
# Set the working directory to /app
WORKDIR /app
# Copy the package.json and package-lock.json files to the container
COPY package*.json ./
# Install the app dependencies
RUN npm install
# Copy the rest of the app files to the container
COPY . .
# Set the environment variables for ElasticSearch
ENV ELASTICSEARCH_HOST=elasticsearch
ENV ELASTICSEARCH_PORT=9200
# Expose the port that the app will run on
EXPOSE 3000
# Start the app
CMD ["npm", "start"]
위와 같이 작성한 코드의 설명은 다음과 같습니다.
- 공식 Node.js 이미지를 기본 이미지로 지정
- 작업 디렉토리를 /app으로 지정
- package.json 및 package.lock.json 파일을 컨테이너에 복사
- 앱 종속성을 설치하는 명령어
- 나머지 앱 파일들도 컨테이너에 복사
- 호스트 및 포트에 대한 환경 변수 설정
- 포트 설정
- 노드 앱 실행
Docker 이미지를 빌드하려면 다음 명령어를 실행해보세요.
docker build -t docker-elk
docker-elk는 제가 생성한 node 앱의 폴더 명입니다.
docker-elk로 Docker image가 생성됩니다.
이제 배포를 해보시죠.
ocker run -p 3000:3000 --name docker-elk --link elasticsearch:elasticsearch docker-elk
배포 하고 난 뒤에 localhost:3000/search?q=elk으로 접속하면 이전에 indexing으로 데이터 생성해두었던 것들이 검색되어 화면에 노출될 것입니다.
그 외에도 elasticsearch에서 데이터들을 확인할 수 있는 주소들이 있습니다.
http://localhost:9200/_cat/indices
http://localhost:9200/indexing(먼저 indexing으로 데이터를 생성해두었던 부분)
http://localhost:9200/_cluster/health?pretty=true(클러스터의 헬스체크)
http://localhost:9200/indexing/_doc/_search(sarch시에 데이터 결과)
결과 코드는 해당 링크에 첨부 되어있습니다.
https://github.com/oinochoe/docker_elk
여기까지 입니다. 더 궁금한 사항은 언제든지 댓글로 남겨주세요 : )
fin.
'SERVER DEVELOPMENT > Docker' 카테고리의 다른 글
Docker에서 ElasticSearch로 Full-Text 검색하기(3) (0) | 2023.03.05 |
---|---|
Docker에서 ElasticSearch로 Full-Text 검색하기(2) (0) | 2023.03.05 |
Docker에서 ElasticSearch로 Full-Text 검색하기(1) (0) | 2023.03.05 |
댓글