docker-compose로 여러 컨테이너 한번에 빌드(feat.mongoDB)

Atmosphere·2025년 5월 9일

DevOps

목록 보기
3/6
post-thumbnail

docker-compose를 이용해 여러 컨테이너를 빌드하는 실습을 했다.

docker-compose를 사용하는이유

docker-compose : 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구

여러개의 컨테이너로 구성된 어플리케이션을 구축하기 위해 run 명령어를 여러번 사용할 수 있지만 각 컨테이너가 제대로 동작하는지 확인하는 테스트 단계에서는 이런식으로 일일이 여러개의 컨테이너를 실행하기는 번거롭다. 매번 run 명령어에 옵션을 설정해 cli로 컨테이너를 생성하기 보다는 여러개의 컨테이너를 하나의 서비스로 정리해 컨테이너 묶음으로 관리할 수 있다면 좀 더 편리할것. 도커 컴포즈는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있는 작업환경을 제공한다.
(출처: https://seosh817.tistory.com/387)

docker-compose실습을 위해 다른 프로젝트 한개가 더 필요했는데, 그건 mongoDB프로제그로 해결하기로 했다.

근데 mongoDB를 어떻게 쓰는지부터 익혀야해서, 가볍게 데이터베이스를 추가하는 것부터 시작했다.
mongoDB 설치부터!

npm install express mongoose

mongoDB와 mongoose의 차이는 이 링크를 참조하면 잘 알 수 있다.

실습

전에 했던 compose-todo-app의 코드를 참고해 index.js에 app.get을 추가했다.

app.get('/items', async (req, res) => {
  const items = await Item.find(); 
  res.json(items);
});

app.get('/debug', async (req, res) => {
  try {
    const items = await Item.find();
    if (items.length === 0) {
      return res.send('⚠️ 데이터 없음1');
    }
    res.json(items);
  } catch (err) {
    res.status(500).send('❌ 에러 발생: ' + err.message);
  }

});

compose-todo-app프로젝트를 실습했을땐 별다른 프로그램 설치 없이 진행했어서 이번에도 그렇게 하려했는데 구글에 검색해보니 mongoDB를 다운받아야하고 mongosh를 다운받아야하고... 그래서 다 다운 받았다.

docker-compose.yml을 작성하고 프로젝트 구조에 문제가 있어서 조금 변경하고 등등

docker-compose.yml

version: "3.8"

services:
  backend:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - mongo
    environment:
      - PORT=3000
      - MONGO_URL=mongodb://mongo:27017/testDB

  mongo:
    image: mongo
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db 

volumes:
  mongo-data: {}      

맨 밑에 volumes은 gpt가 알려준 데이터 영구저장에 관련됬다. 터미널에서 mongosh로 접속해

db.컬렉션명.insert();
db.item.insert([{"name":"소현","age":24},{"name":"신위","age":24}]);

데이터를 삽입해준 후 mongoDB compass에서 connection을 지웠다가 다시 켜봤는데 데이터가 매번 지워져있었다. 그래서 저 volumes을 추가로 설정해줬다. yml 파일이라 그런지 띄어쓰기가 너무 엄격하다.

문제1(컨테이너 꺼짐)

중간에 컨테이너 두개 중 한개가 자꾸 꺼지는 일이 발생했는데 캐시문제 때문에 그랬었다.

docker-compose down

docker-compose build --no-cache

docker-compose up -d

이렇게 순서대로 실행해주니 정상적으로 컨테이너가 실행되었다.

문제2(json데이터 화면에 안보임)

mongoDB에 저장되어있는 데이터를 불러와서 화면에 띄우기 까지 완성하는게 목표였다.
localhost:3000/items 을 찍어보면 분명히 [] 은 나오는데 계속 데이터가 안나와서 미치는 줄 알았다.

models/Item.js

const mongoose = require('mongoose');

const itemSchema = new mongoose.Schema({
  name: String,
  age: Number,
});

module.exports = mongoose.model('Item', itemSchema, 'item'); // 컬렉션 이름 고정

여기서 컬렉션 이름 때문에 또 몇십분 썼다.
이 문제도 있었고, 위에서 언급한 mongoDB 데이터가 계속 지워지는 현상때문에 [] 이렇게 나오기도 했다.

결과물

JSON데이터가 화면에 잘 뜬것을 볼 수 있다.

컨테이너들 또한 잘 실행되었다.

이 실습에만 3시간 넘게 썼는데.. 다른 실습들은 과연 어떨까.
다음은 gitAction이나 다른 걸 실습해볼 계획이다.

모든 코드는
https://github.com/kgms217068/docker-rebuild
여기에 업로드 되어있으니 참고바랍니다

데브옵스 엔지니어로써 일하기 위해~

profile
작게, 빠르게, 지속가능하게

0개의 댓글