도커를 올려보기로 했다.
이미 라즈베리 파이 서버에 인프라가 다 준비돼 있지만,
내가 만져보면서 이해해보고 싶었던 것이기도 했고, 아마존 ECS에 올려보기 위함이기도 하다.
일단 현재 서버는 다음과 같은 상태다.
- Node.js 서버
- MySQL
- Redis
- Grafana
그럼 각각의 것들을 다 컨테이너로 만들어 ``Compose``로 묶어서 빌드 후 배포할 수 있어야 하겠다.
먼저 노드 서버를 위한 ``Dockerfile``을 다음과 같이 만들었다.
# Node.js 베이스 이미지 사용
FROM node:20-alpine
# 작업 디렉토리 설정
WORKDIR "작업 디렉토리"
# 패키지 파일 복사 및 의존성 설치
COPY package*.json ./
RUN npm install
# 소스 코드 복사
COPY . .
# 포트 노출
EXPOSE 5555
# 애플리케이션 실행
CMD ["npx", "pm2-runtime", "start", "ecosystem.config.cjs"]
별 다른 특별한 일은 하지 않는다.
다르다면 ``pm2``를 위한 설정이 있다는 것.
그리고 DB 등의 나머지 것들에 대한 설정은 ``docker-compose.yml``에서 이루어진다.
services:
nodejs:
build: .
ports:
- "5555:5555"
env_file:
- .env
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
mysqld_exporter:
condition: service_healthy
redis_exporter:
condition: service_healthy
node_exporter:
condition: service_healthy
restart: on-failure
networks:
- app-network
// ...
이런 식으로 필요한 모든 서비스를 컴포즈 파일에 정의했다.
각 DB와 익스포터들에 대해 헬스 체크도 수행하게 했고,
``depends_on``이기 때문에 저것들이 다 올라와야 노드 서버가 올라올 수 있다.
하다 보니 익스포터마저 별개 컨테이너로 빠지게 됐는데, 이게 괜찮은지에 대해선 생각을 좀 해봐야 할 것 같다.
컨테이너가 8개가 돼버렸기 때문...
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['prometheus:9090']
- job_name: 'mysql'
static_configs:
- targets: ['mysqld_exporter:9104']
- job_name: 'redis'
static_configs:
- targets: ['redis_exporter:9121']
- job_name: 'node'
static_configs:
- targets: ['node_exporter:9100']
물론 프로메테우스 설정도 잊지 않았다.
컴포즈로 빌드 후 컨테이너가 올라오는 것을 보자.
컨테이너들도 잘 올라오고 서버가 정상적으로 동작하는 것도 확인할 수 있었다.
물론 그라파나와 프로메테우스도 잘 올라온다.
이전엔 도커와 도커 컴포즈를 남이 말아놓은 걸 "사용"만 해봤었다.
내가 처음부터 구성해서 올리는 건 처음이었는데, 꽤 좋은 경험이었다.
처음엔 어떻게 해야 하나 싶었지만, 계속 보다 보니 보이는 게 생기는 것 같았다.
혹시 모를 에러가 있을 수 있으니 시간을 두고 지켜보며 개선할 수 있을 것이다.
'Camp > T.I.L.' 카테고리의 다른 글
[TIL #35] 데드락에 죽다 살다 (0) | 2024.12.15 |
---|---|
[TIL #33] 마법의 엘리베이터 (0) | 2024.11.20 |
[TIL #32] 자바스크립트와 싱글톤 (0) | 2024.11.18 |
[TIL #31] 상태 업데이트의 벽 (0) | 2024.10.31 |
[TIL #30] 모의 면접을 준비하며 (0) | 2024.10.30 |