DevOps의 세계에서 효율적인 애플리케이션 배포는 매우 중요한 요소입니다. 오늘은 Docker와 Nginx를 활용하여 간단한 웹 애플리케이션을 배포하는 미니 프로젝트를 진행해보겠습니다. 이 프로젝트는 Docker를 이용해 컨테이너화하고, Nginx를 사용해 리버스 프록시 역할을 수행하도록 하겠습니다. 이를 통해 기본적인 DevOps 원칙을 이해할 수 있습니다.

1. 환경 설정

먼저, Docker와 Nginx를 설치해야 합니다. Docker와 Docker Compose가 설치되어 있지 않다면, 다음 명령어를 사용해 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce

# Docker Compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

설치가 완료되면, Docker가 정상적으로 작동하는지 확인해봅시다.

docker --version
docker-compose --version

2. 웹 애플리케이션 개발

이번 프로젝트에서는 간단한 Node.js 웹 애플리케이션을 만들 것입니다. app.js라는 이름으로 아래 코드를 작성합니다.

// app.js
const express = require('express');
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
    res.send('안녕하세요! Docker와 Nginx를 활용한 간단한 웹 애플리케이션입니다.');
});

app.listen(PORT, () => {
    console.log(서버가 http://localhost:${PORT} 에서 실행 중입니다.);
});

위 코드는 Express.js를 사용하여 간단한 웹 서버를 만들어 클라이언트에게 메시지를 반환합니다. 이 애플리케이션을 Docker에서 실행할 수 있도록 Dockerfile을 작성하겠습니다.

3. Dockerfile 작성

프로젝트 디렉토리를 생성하고, 그 안에 Dockerfile을 생성합니다.

# Dockerfile
FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000
CMD ["node", "app.js"]

위의 Dockerfile은 Node.js 이미지를 기반으로 애플리케이션을 설정합니다. npm install을 통해 의존성을 설치하고, 애플리케이션을 실행합니다.

4. Nginx 설정

Nginx를 리버스 프록시로 설정하여 클라이언트 요청을 Docker 컨테이너에 전달하도록 하겠습니다. nginx.conf 파일을 생성합니다.

# nginx.conf
server {
    listen 80;
    location / {
        proxy_pass http://app:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Nginx는 80번 포트에서 요청을 듣고, app이라는 컨테이너로 요청을 전달합니다.

5. Docker Compose 설정

이제 Docker Compose를 사용하여 애플리케이션과 Nginx를 동시에 실행할 수 있도록 docker-compose.yml 파일을 생성합니다.

# docker-compose.yml
version: '3'
services:
  app:
    build: .
    container_name: node_app
    restart: always

  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app

위의 docker-compose.yml 파일은 두 개의 서비스를 정의합니다. 하나는 Node.js 애플리케이션이며, 다른 하나는 Nginx입니다.

6. 애플리케이션 실행

모든 설정이 완료되었습니다. 이제 Docker Compose를 사용하여 애플리케이션을 실행해보겠습니다. 터미널에서 다음 명령어를 입력합니다.

docker-compose up --build

명령어가 실행되면, Docker는 애플리케이션과 Nginx 컨테이너를 생성하고 실행합니다. 배포가 완료되면 브라우저에서 http://localhost를 방문하여 애플리케이션이 정상적으로 동작하는지 확인합니다.

마무리

이번 포스트에서는 Docker와 Nginx를 활용하여 간단한 웹 애플리케이션을 배포하는 방법을 알아보았습니다. 이 미니 프로젝트를 통해 Docker와 Nginx의 기본적인 사용법을 익히고, DevOps의 중요성을 느낄 수 있었기를 바랍니다. 더 나아가, 다양한 기술을 활용하여 복잡한 애플리케이션을 개발하고 배포하는 데 기여할 수 있을 것입니다. 다음 시간에는 더 발전된 주제로 돌아오겠습니다.