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 파일은 두 가지 서비스를 정의합니다:
- app: Node.js 애플리케이션을 빌드하고 실행하는 서비스. MySQL 데이터베이스와 연결됩니다.
- 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.
'Docker' 카테고리의 다른 글
Docker 실전 예제 및 사례 연구 / 사례 연구: 성공적인 Docker 사용 사례 (7) | 2024.09.14 |
---|---|
Docker 실제 프로젝트 예제/ 파이썬 간단 게임프로그램 컨테이너화 (0) | 2024.09.14 |
Docker 보안 및 최적화 / 성능 최적화: 리소스 관리, 이미지 최적화 (0) | 2024.09.14 |
Docker 보안 및 최적화: 컨테이너 보안 검사 및 취약점 관리 (0) | 2024.09.14 |
Docker와 클라우드 통합 / Kubernetes: Docker와의 연동 및 클러스터 관리 (4) | 2024.09.13 |