아니 그러니까 말이에요
제가, 로컬에서 도커 파일 만들고 깃으로 올려서 aws서버를 jupyter로 접속한 뒤 docker build를 했더니 화면이 멈춘 게 아니에요?
보니까 도커파일에 주석을 제 맘대로 적은 게 원인인 것 같았죠. 일단 build 행위를 멈추기 위해 서버를 재시작한다는 걸 인스턴스 종료를 해버린 게 아니에요? 다시 인스턴스 생성부터 해야겠죠. 그래서 다시 시작했어요. 그러다가 backend 파일을 구동시키려고 보니까 지금 진행하는게 도커를 쓰는 의미를 잃어버렸네요? 결론은. 어떻게 되었냐면요.
1️⃣ 리팩토링, backend>App.js
현재 파일 구조
~ backend ~
📁 config
- 🗄️ config.js
📁 models
- 🗄️ index.js
- 🗄️🗄️🗄️🗄️🗄️🗄️🗄️ model 파일들 여러개
📁 routes
🔒 env
🗄️ app.js
🗄️ package-lock.json
🗄️ package.json
sequelize 수정하기
require("dotenv").config();
const express= require('express');
const cors = require('cors') //front와 연결
const app =express();
/* connect Mysql */
const db = require("./models");
db.sequelize.sync();
/* connect front */
corsOptions = {
origin: "<http://127.0.0.1:3030>"
}
app.use(cors(corsOptions));
app.get('/', (req, res) => {
res.send('Hello WITH')
})
const port = 3005
app.listen(port, () => {
console.log("this server on 3005");
})
- db 연결을 위한 sequelize 사용
- cors를 통한 frontend 포트와의 연결
2️⃣ 리팩토링, db(sequelize)연결
- env파일을 통해 배포 이전에 데이터베이스 정보 과정을 거침
- 기존의 config.json파일을 config.js로 바꿈
- 파일 형식이 달라짐
- 이에 따라 models> index.js의 파일의 코드도 바뀜
📁backend>.env
MYSQL_USERNAME=
MYSQL_PASSWORD=
MYSQL_DATABASE=
MYSQL_HOST=
MYSQL_DIALECT=
MYSQL_PORT=3306
📁 backend>config>config.js
require('dotenv').config();
const env = process.env;
const development = {
username: env.MYSQL_USERNAME,
password: env.MYSQL_PASSWORD,
database: env.MYSQL_DATABASE,
host: env.MYSQL_HOST,
dialect: env.MYSQL_DIALECT,
port: env.MYSQL_PORT
};
const test = {
username: env.MYSQL_USERNAME,
password: env.MYSQL_PASSWORD,
database: env.MYSQL_DATABASE,
host: env.MYSQL_HOST,
dialect: env.MYSQL_DIALECT,
port: env.MYSQL_PORT
};
const production = {
username: env.MYSQL_USERNAME,
password: env.MYSQL_PASSWORD,
database: env.MYSQL_DATABASE,
host: env.MYSQL_HOST,
dialect: env.MYSQL_DIALECT,
port: env.MYSQL_PORT
};
module.exports ={ development, test, production};
📁backend>models>index.js
const env = process.env.NODE_ENV || 'development';
const Sequelize = require('sequelize');
const config = require(__dirname + '/../config/config.js')[env];
const db = {};
const sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
db.User = require('./user')(sequelize, Sequelize);
... 모델 연결 생략 ...
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
- 여기까지 했으니, 이것을 도커화 해서 npx seqyekuze db:create했을 때 database 생성이 되어있다면 back과 mysql의 연결이 된 것이다.
3️⃣ Backend 도커파일 만들기
1. dockerignore 작성
node_modules
npm-debug.log
2. Dockerfile 작성
FROM node:17. # 노드 버전 명시
WORKDIR /app # 컨테이너의 작업 공간 명시
COPY package*.json /app/ # package로 시작하는 파일명.json을 컨테이너의 /app 경로에 붙여넣기
RUN npm install #컨테이너 안에서 이 명령어를 수행함
COPY . /app # 모든 파일을 컨테이너의 /app 경로에 붙여넣음
RUN npx sequelize db:create #이 명령어를 수행함
EXPOSE 3085 # backend 역할을 할 포트번호 명시
CMD ["npm", "run", "dev"]
- 주석은 없애야 함.
4️⃣ Jupyter에 가기
sudo apt update
sudo apt install nodejs
nodejs -
sudo apt install npm
//nodejs 최신버전으로 설치하기 (PPA)
$ cd ~
$ curl -sL <https://deb.nodesource.com/setup_14.x> -o nodesource_setup.sh
$ sudo bash nodesource_setup.sh
$ sudo apt-get install nodejs
$ sudo apt-get install build-essential
//npm 업데이트하기
npm install -g npm@latest
npm -v
jupyter로 가서 깃 clone하기
: git clone ..
//나머지 작업 생략, 해당 폴더 이동
: docker build -t backend . # 빌드시킴
jupyter에서 .env파일을 만들어주기
MYSQL_USERNAME=
MYSQL_PASSWORD=
MYSQL_DATABASE=
MYSQL_HOST=
MYSQL_DIALECT=mysql
MYSQL_PORT=
- 여기서 헤맸는데, env파일은 .gitignore로 가렸으니 있을리가 만무하고 직접 만들어줬다. 그런 뒤에 npx 명령어를 실행하면 제대로 원하는 데이터베이스가 서버에 생성됨을 확인 가능하다
이럴 거면 docker파일을 왜 만들었냐고 💢
npx 명령어 조차 스스로 칠거면 왜 했냐고 💢