DevOps 환경에서 마이크로서비스 아키텍처는 최근 몇 년간 많은 주목을 받고 있습니다. 여러 서비스가 독립적으로 배포되고 확장 가능하다는 점에서 큰 장점을 제공합니다. 이러한 아키텍처를 손쉽게 구현하기 위한 도구 중 하나가 바로 Docker입니다. 특히 Docker Compose는 여러 컨테이너를 정의하고 실행하는 데 도움을 주어, 마이크로서비스 환경을 간편하게 구축할 수 있게 해줍니다. 이번 포스트에서는 Docker Compose를 활용하여 마이크로서비스 환경을 구축한 경험담을 공유하겠습니다.

Docker Compose란?

Docker Compose는 YAML 파일을 사용하여 여러 Docker 컨테이너를 정의하고 관리할 수 있는 도구입니다. 이 도구를 사용하면 서비스, 네트워크, 볼륨 등을 한 번에 정의하고 실행할 수 있습니다. 여러 개의 서비스를 필요로 하는 마이크로서비스 아키텍처에 적합한 솔루션입니다.

실습 환경 설정

우선, Docker와 Docker Compose를 설치해야 합니다. 대부분의 리눅스 배포판에서 다음 명령어로 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install -y docker.io

# Docker Compose 설치
sudo apt-get install -y docker-compose

이제 간단한 마이크로서비스 환경을 구성해보겠습니다. 이번 예제에서는 간단한 사용자 관리 서비스를 구현해보겠습니다. Node.js와 Express를 이용한 REST API 서비스와, MongoDB를 데이터베이스로 사용할 것입니다.

프로젝트 구조

아래와 같이 디렉토리 구조를 설정합니다.

microservice-example/
├── docker-compose.yml
└── user-service/
    ├── Dockerfile
    ├── index.js
    └── package.json

사용자 서비스 구현

user-service 디렉토리로 이동하여 간단한 Express 서버를 구현합니다.

1. package.json 파일 작성

package.json 파일을 생성하고 다음 내용을 추가합니다.
{
  "name": "user-service",
  "version": "1.0.0",
  "description": "User management service",
  "main": "index.js",
  "dependencies": {
    "express": "^4.17.1",
    "mongoose": "^5.12.3"
  },
  "scripts": {
    "start": "node index.js"
  }
}

2. Dockerfile 작성

Dockerfile을 생성하여 다음 내용을 추가합니다.
# Node.js 이미지 사용
FROM node:14

# 작업 디렉토리 생성
WORKDIR /usr/src/app

# 의존성 파일 복사 및 설치
COPY package*.json ./
RUN npm install

# 소스 코드 복사
COPY . .

# 앱 실행
CMD ["npm", "start"]

# 컨테이너가 사용할 포트
EXPOSE 3000

3. Express 서버 코드 작성

index.js 파일을 생성하고 다음 코드를 작성합니다.
const express = require('express');
const mongoose = require('mongoose');

const app = express();
const PORT = process.env.PORT || 3000;

// MongoDB 연결
mongoose.connect('mongodb://mongo:27017/userdb', { useNewUrlParser: true, useUnifiedTopology: true });

// 미들웨어 설정
app.use(express.json());

// 사용자 스키마 설정
const userSchema = new mongoose.Schema({
  name: String,
  email: String,
});

const User = mongoose.model('User', userSchema);

// 사용자 생성 API
app.post('/users', async (req, res) => {
  const user = new User(req.body);
  await user.save();
  res.status(201).send(user);
});

// 서버 시작
app.listen(PORT, () => {
  console.log(User service is running on port ${PORT});
});

Docker Compose 설정

이제 docker-compose.yml 파일을 작성하여 서비스를 정의하겠습니다.

version: '3'
services:
  user-service:
    build: ./user-service
    ports:
      - "3000:3000"
    depends_on:
      - mongo
    environment:
      - MONGO_URI=mongodb://mongo:27017/userdb
      
  mongo:
    image: mongo
    ports:
      - "27017:27017"

실행하기

모든 설정이 완료되었다면, 다음 명령어를 통해 서비스를 실행할 수 있습니다.

docker-compose up --build

이 명령어를 실행하면 Docker Compose가 user-service와 mongo 컨테이너를 생성하고 실행할 것입니다. 이제 http://localhost:3000/users에 POST 요청을 보내어 새로운 사용자를 생성할 수 있습니다.

마무리

이번 포스트에서는 Docker Compose를 활용하여 간단한 마이크로서비스 환경을 구축해보았습니다. Docker Compose를 사용하면 여러 컨테이너를 손쉽게 관리할 수 있어, 복잡한 마이크로서비스 아키텍처의 개발을 더욱 용이하게 만들어줍니다. 실제 프로젝트에서는 다양한 서비스가 복잡하게 얽혀있지만, Docker Compose를 통해 이를 효과적으로 관리할 수 있다는 점은 큰 장점입니다. 앞으로도 DevOps 환경에서 Docker와 Docker Compose를 활용하여 더 많은 서비스를 효율적으로 구축할 수 있기를 기대합니다.