본문 바로가기
Docker

Docker 실전 예제 및 사례 연구 / 실제 프로젝트 예제: 웹 애플리케이션, 데이터베이스 컨테이너화

by Maccrey Coding 2024. 9. 14.
728x90
반응형

 

Docker는 다양한 환경에서 일관된 애플리케이션 실행을 보장하는 컨테이너 기반 플랫폼입니다.

이번 블로그에서는 실제 프로젝트에서 Docker를 사용해 웹 애플리케이션과 데이터베이스를 컨테이너화하는 방법을 예제로 설명합니다.

초보자도 이해할 수 있도록 단계별로 코드를 작성하고 설명하겠습니다.

1. 프로젝트 개요

우리가 컨테이너화할 예제는 간단한 Node.js 웹 애플리케이션MySQL 데이터베이스입니다.

웹 애플리케이션은 MySQL 데이터베이스에 연결되어 데이터를 처리하고, 이를 브라우저에 표시하는 기능을 갖추고 있습니다.

1.1 프로젝트 구조

먼저 프로젝트 디렉토리 구조를 설정합니다.

docker-project/
│
├── app/
│   ├── Dockerfile
│   ├── package.json
│   └── index.js
├── db/
│   └── init.sql
├── docker-compose.yml
└── README.md

2. 웹 애플리케이션 컨테이너화

2.1 Node.js 애플리케이션 작성

우선 간단한 Node.js 애플리케이션을 작성합니다.

app/index.js

const express = require('express');
const mysql = require('mysql2');

// Express 앱 생성
const app = express();
const port = 3000;

// MySQL 데이터베이스 연결 설정
const connection = mysql.createConnection({
  host: 'db', // docker-compose에서 정의한 서비스 이름
  user: 'root',
  password: 'password',
  database: 'testdb'
});

// 기본 경로 요청 처리
app.get('/', (req, res) => {
  connection.query('SELECT * FROM users', (err, results) => {
    if (err) throw err;
    res.send(results);
  });
});

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

이 애플리케이션은 Express.js 프레임워크를 사용해 간단한 웹 서버를 구성하고, MySQL 데이터베이스에서 데이터를 조회해 클라이언트에게 응답합니다.

2.2 Node.js 의존성 설정

애플리케이션의 의존성을 정의하기 위해 package.json 파일을 생성합니다.

app/package.json

{
  "name": "docker-node-app",
  "version": "1.0.0",
  "description": "A simple Node.js app with MySQL",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.17.1",
    "mysql2": "^2.2.5"
  }
}

2.3 Node.js Dockerfile 작성

이제 Dockerfile을 작성해 Node.js 애플리케이션을 컨테이너로 빌드합니다.

app/Dockerfile

# Node.js 이미지를 베이스로 사용
FROM node:14

# 작업 디렉토리 설정
WORKDIR /usr/src/app

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

# 애플리케이션 파일 복사
COPY . .

# 애플리케이션 실행
CMD ["npm", "start"]

이 Dockerfile은 Node.js 14 버전을 사용해 애플리케이션을 빌드하고, 의존성을 설치한 후 서버를 시작하는 내용을 포함하고 있습니다.

3. 데이터베이스 컨테이너화

3.1 MySQL 초기화 SQL 작성

MySQL 데이터베이스는 기본적으로 init.sql 스크립트를 통해 초기화됩니다.

이 스크립트는 데이터베이스와 테이블을 생성하고 초기 데이터를 삽입하는 작업을 수행합니다.

db/init.sql

CREATE DATABASE IF NOT EXISTS testdb;

USE testdb;

CREATE TABLE IF NOT EXISTS users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL
);

INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');

이 스크립트는 testdb라는 데이터베이스와 users라는 테이블을 생성하고, 샘플 데이터를 삽입합니다.

4. Docker Compose로 컨테이너화

웹 애플리케이션과 데이터베이스를 함께 실행하기 위해 Docker Compose 파일을 작성합니다.

docker-compose.yml

version: '3'

services:
  app:
    build: ./app
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      - MYSQL_HOST=db
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password
      - MYSQL_DATABASE=testdb

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "3306:3306"

docker-compose.yml 파일은 두 가지 서비스를 정의합니다:

  1. app: Node.js 애플리케이션을 빌드하고 실행하는 서비스. MySQL 데이터베이스와 연결됩니다.
  2. db: MySQL 데이터베이스를 컨테이너화하며, 초기 데이터베이스 설정을 위해 init.sql 스크립트를 사용합니다.

4.1 컨테이너 실행

이제 프로젝트 루트 디렉토리에서 docker-compose 명령어를 실행해 컨테이너를 시작할 수 있습니다.

docker-compose up --build

이 명령어는 Docker Compose를 사용해 Node.js 애플리케이션과 MySQL 데이터베이스를 동시에 실행합니다.

5. 실행 결과

컨테이너가 성공적으로 실행되면, 웹 애플리케이션은 http://localhost:3000에서 실행됩니다. 브라우저에서 이 URL에 접속하면 MySQL 데이터베이스에서 가져온 사용자 목록을 확인할 수 있습니다.

[
  { "id": 1, "name": "Alice" },
  { "id": 2, "name": "Bob" },
  { "id": 3, "name": "Charlie" }
]

이 예제는 Docker를 사용해 애플리케이션과 데이터베이스를 각각 독립된 컨테이너로 실행하면서도, 이들이 서로 통신할 수 있도록 구성된 실전 프로젝트입니다.

6. 최적화 및 관리 팁

1. 볼륨 관리: 데이터베이스의 데이터를 지속적으로 유지하려면 Docker 볼륨을 사용해 데이터를 로컬 파일 시스템에 저장할 수 있습니다.

volumes:
  - db-data:/var/lib/mysql

 

 

2. 환경 변수 파일 사용: 환경 변수를 docker-compose.yml에 직접 작성하는 대신, .env 파일을 사용해 관리할 수 있습니다.

3. 이미지 최적화: 다단계 빌드(Multi-stage Build)를 사용해 애플리케이션 이미지를 더욱 작고 효율적으로 만들 수 있습니다.

 

이 블로그에서는 Docker를 사용해 웹 애플리케이션과 데이터베이스를 컨테이너화하는 실전 예제를 살펴보았습니다.

Docker Compose를 통해 애플리케이션과 데이터베이스를 쉽게 연결하고, 독립적인 환경에서 실행할 수 있는 방법을 배웠습니다.

이러한 컨테이너화는 배포 환경에서도 동일하게 적용할 수 있어, 개발 및 배포 과정을 크게 개선합니다.

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

728x90
반응형