이전에도 Docker를 다룬적이 있는데 이번에는 이전과 다르게 Mysql과 함께 병합하여 사용하고 Aws의 Ec2로 배포해볼 것이다.
이전과 같이 Node.js환경에서 테스트할 것이고 Postman을 통해 동작 확인을 해보겠다.
우선 Docker에 본격적으로 들어가기전에 테스트에 사용될 Node.js의 코드부터 살펴보겠다.
app.js
const express = require('express');
const connection = require('./connection');
const app = express();
const PORT = 3000;
app.use(express.json());
// 테이블이 존재하지 않으면 생성하는 함수
function createTableIfNotExists() {
const createTableQuery = `
CREATE TABLE IF NOT EXISTS your_table (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(255)
)
`;
connection.query(createTableQuery, (err, result) => {
if (err) {
console.error('Error creating table:', err);
return;
}
console.log('Table created successfully');
});
}
app.post('/save-data', (req, res) => {
createTableIfNotExists(); // 테이블 생성 함수 호출
const { data } = req.body;
const query = 'INSERT INTO your_table (data) VALUES (?)';
connection.query(query, [data], (err, result) => {
if (err) {
console.error('Error saving data:', err);
res.status(500).send('Error saving data');
return;
}
console.log('Data saved successfully');
res.status(200).send('Data saved successfully');
});
});
app.get('/get-data', (req, res) => {
const query = 'SELECT * FROM your_table';
connection.query(query, (err, results) => {
if (err) {
console.error('Error fetching data:', err);
res.status(500).send('Error fetching data');
return;
}
res.json(results);
});
});
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
connection.js
const mysql = require('mysql');
const connection = mysql.createConnection({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME
});
connection.connect((err) => {
if (err) {
console.error('Error connecting to MySQL:', err);
return;
}
console.log('Connected to MySQL!');
});
module.exports = connection;
Mysql과 연동하고 저장 및 조회를 수행하는 매우 간단한 Node.js코드이다.
Mysql를 수행할 환경인 host와 사용자 계정과 비밀번호인 user, password와 데이터를 저장에 사용할 데이터베이스를 명시적으로 지정하지 않고 process.env.변수명을 사용하였는데 Docker를 build 시킬 때 지정시켜줄 것이기 때문에 동적으로 처리하기 위하여 변수명에 따라 값을 받아오게 해주었다.
테스트에 사용될 node.js의 코드를 살펴보았으니 이번에는 Docker에 핵심적으로 사용될 Dockerfile과 docker-compose.yml의 코드를 살펴보겠다.
Dockerfile
# Node.js 이미지를 기반으로 Docker 이미지를 빌드합니다.
FROM node:14
# 작업 디렉토리를 설정합니다.
WORKDIR /app
# 의존성 설치를 위해 package.json 및 package-lock.json을 복사합니다.
COPY package*.json ./
# npm 패키지를 설치합니다.
RUN npm install
# 소스 코드를 현재 작업 디렉토리로 복사합니다.
COPY . .
# 컨테이너가 시작될 때 애플리케이션을 실행합니다.
CMD ["node", "app.js"]
docker-compose
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DATABASE_HOST=host.docker.internal
- DATABASE_USER=user
- DATABASE_PASSWORD=password
- DATABASE_NAME=dockertest
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: dockertest
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "2306:3306"
Dockerfile의 코드는 이전에 다룬적이 있기 때문에 Dockerfile에 대한 설명은 주석으로 대체하고 곧바로 docker-compose부터 살펴보겠다.
docker-compose는 docker를 build할때 지정해줘야할 인자값을 미리 지정해줄 수 있으며 여러개의 컨테이너를 하나로 묶어서 관리할 수 있는 매우 편리한 도구이다.
필자의 경우에는 데이터 베이스의 값을 저장하고 조회를 처리하는 app과 실제로 mysql이미지를 사용하여 mysql테이블에 값을 저장 및 조회를 수행하는 db라는 두개의 컨테이너를 사용하였다.
아마도 처음보는 형식에 의해 코드가 익숙치 않을텐데 위에서 부터 천천히 훑어보겠다.
version: '3': 이 Compose 파일은 Docker Compose 버전 3의 구문을 사용한다는걸 알림.
build: . : 현재 디렉토리에서 Dockerfile을 사용하여 이미지를 빌드한다는걸 알림.
ports: - "3000:3000": 호스트의 3000번 포트를 컨테이너의 3000번 포트로 매핑.
depends_on: - db: 이 서비스가 시작되기 전에 "db" 서비스가 먼저 시작되어야 함을 나타내기 위해 사용.
environment: 이 서비스에서 사용할 환경 변수를 설정.
DATABASE_HOST=host.docker.internal: 데이터베이스의 호스트를 지정할 때 사용되는 변수인데 로컬로 실행할 때에는 컨테이너의 IP를 사용해야하기 때문에 host.docker.internal로 설정하였음 추후에 다시 언급하겠지만 Ec2에서 실행할 때에는 Ec2의 퍼블릭 주소로 사용해야함.
DATABASE_USER=user: 데이터베이스 사용자 설정
DATABASE_PASSWORD=password: 데이터베이스 비밀번호 설정
DATABASE_NAME=dockertest: 데이터베이스 이름을 설정
image: mysql:latest: MySQL의 최신 버전 이미지를 사용.
environment: MySQL 컨테이너에서 사용할 환경 변수를 설정.
MYSQL_ROOT_PASSWORD: password: MySQL 루트 사용자의 비밀번호 설정.
MYSQL_DATABASE: dockertest: MySQL에 "dockertest"라는 이름의 데이터베이스를 만듬.
MYSQL_USER: user: MySQL에 사용자를 만듬
MYSQL_PASSWORD: password: MySQL 사용자의 비밀번호를 설정.
ports: - "2306:3306": 호스트의 2306번 포트를 컨테이너의 3306번 포트로 매핑.
팁) 컴퓨터에 Mysql이 깔려 있다면 mysql의 ports설정에서 3306:3306을 사용하면 이미 3306포트번호를 사용하고 있다고 오류가 발생할 수도 있는데 2306:3306이나 1306:3306같이 포트번호를 수정해주자.
위의 모든 과정을 수행하고 터미널에서 docker-compose up --build를 실행하면 Docker에서 이미지및 컨테이너를 생성하고 컨테이너 실행까지 모든 과정을 수행하여 로컬에서 실행될 것이다.
'클라우드' 카테고리의 다른 글
| 가비아 클라우드를 통해 배포하기 # 1 가비아 클라우드 생성 (0) | 2024.10.30 |
|---|---|
| Docker와 Mysql연동 및 Ec2 배포 #下 (0) | 2024.04.28 |
| Docker 배포해보기 #下 node.js 프로젝트 배포해보기 (1) | 2024.03.12 |
| Docker 배포해보기 #上 Docker란 무엇인가? (0) | 2024.03.11 |
| Node 백그라운드 실행 및 종료 (0) | 2024.03.08 |