주의할점은 Docker의 컨테이너는 각각 격리가 되어있다.
크게 나누어보면, 프론트엔드 컨테이너, 백엔드 컨테이너, db 컨테이너 총 3개로 이루어져있다.
이 3가지의 컨테이너가 서로 통신할수 있도록 네트워크를 생성해주어야한다.
docker network create 네트워크 이름
docker network ls
를 입력해보면 현재 도커 내에서 실행중이 네트워크들이 나온다.
docker run --rm --name mysql-container --net=test-network -e MYSQL_ROOT_PASSWORD=mysql비밀번호 -e MYSQL_DATABASE=생성하고싶은스키마 -v data:/data/db -d mysql:latest
docker ps
를 실행해보면 현재 mysql-container라는 이름으로 컨테이너가 실행중인것을 확인할 수있다.
또한 컨테이너가 삭제 됐다가 다시 생성되어도 데이터가 지속될수 있도록 명명 볼륨을 추가해주었다.
FROM node
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
CMD [ "node", "app.js" ]
docker build -t 이미지태그이름 .
docker run --net=아까 생성한 네트워크 이름 -p 80:80 // Dockerfile내에서 EXPOSE한 포트번호 --name 컨테이너 이름 --rm 이미지태그
여기서 Dockerfile에서 포트를 EXPOSE해준다고 하더라도, 프론트쪽에서 백엔드와 통신해야하기때문에 포트를 직접 로컬환경과 연결해주어야한다.
정상적으로 실행된다.
여기서 중요한점은 시퀄라이즈 환경 변수 파일들이다.
const Sequelize = require("sequelize");
const dotenv = require("dotenv");
dotenv.config({ path: "./env/mysql.env" });
const db = {};
const Goal = require("./goal");
const sequelize = new Sequelize(
process.env.MYSQL_DATABASE,
process.env.MYSQL_USER,
process.env.MYSQL_ROOT_PASSWORD,
{
port: process.env.MYSQL_PORT,
host: process.env.MYSQL_HOST,
dialect: "mysql",
logging: false,
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000,
},
}
);
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.Goal = Goal.init(sequelize);
module.exports = db;
const db = require("./models");
const Goal = require("./models/goal");
const app = express();
db.sequelize
.sync({ force: false })
.then(() => {
console.log("Database connect is succeed!");
})
.catch((err) => {
console.log(err);
});
MYSQL_DATABASE=mysql
MYSQL_ROOT_PASSWORD=mysql비밀번호
MYSQL_DATA_DIR=./mysql_data
MYSQL_USER=root
MYSQL_PORT=3306
MYSQL_HOST=mysql-container // 만들어주었던 sql 컨테이너 이름
여기서 HOST를 아까 도커 내에서 mysql을 실행시켜주었던 컨테이너 이름으로 해야한다.
또한 백엔드 컨테이너도 실행시킬때, 똑같은 컨테이너 내에서 실행시켜줌으로써 같은 네트워크를 공유할수 있도록 해야한다.
포스트맨에서 결과를 확인해볼수 있다.