지난 글에서 mongoose를 이용해서 몽고디비를 사용하는 법에 대해 간단하게 다루었는데, 이번엔 docker-compose를 활용한 도커 컨테이너 구축에 대해 작성해보려고 한다.
docker compose는 여러 컨테이너의 구축과 실행을 자동화하기 위해 사용하며, docker-compose.yml
파일에 컨테이너의 이미지, 실행 명령어 등을 정의해두고
docker compose up
이라는 명령어로 간단하게 실행할 수 있다.
docker, Dockerfile, docker compose 등에 대해서는 나중에 정리한 글을 한번 올릴 예정이다!
MongoDB는 NoSQL로 스키마 없이 사용할 수 있지만, 그렇다해도 데이터베이스의 초기 설정은 필요하다. 우선 루트 유저 생성은 환경변수를 통해서 할 수 있다. docker-compose.yml에 직접 작성할 수도 있지만 그렇게 되면 깃허브에 바로 업로드 되기 때문에 패스워드 노출 위험이 있다. 따라서 env_file
로 환경변수를 넘겨주고, .env
파일은 .gitignore
에 추가하여 업로드를 막았다.
.env
MONGO_INITDB_ROOT_USERNAME=rootName
MONGO_INITDB_ROOT_PASSWORD=rootPassword
MONGO_INITDB_DATABASE=dbName
MONGO_PORT=27017
MONGO_URI=mongodb://rootName:rootPassword@mongodb:27017/dbName
이렇게 환경 변수 설정을 통해 기본적인 세팅을 할 수 있다.그러나 그 외 추가적인 유저 생성이 필요하거나, 초기 데이터를 삽입하는 등의 설정이 필요할 때도 있다. 컨테이너를 생성한 뒤 명령어를 통해 할 수 있지만, 그렇게 하는 경우 개발상 문제가 생겨 컨테이너를 삭제하고 다시 올릴 때마다 새로 입력해야 해서 효율이 떨어진다.
이럴 때 entrypoint
를 사용한다. 도커파일의 ENTRYPOINT
와는 조금 다르니까 헷갈리지 말자!
도커 mongoDB 공식 이미지를 사용하면, 기본적으로 docker-entrypoint-initdb
이하에 있는 js
파일이나 쉘 스크립트가 컨테이너가 처음 올라갈 때 실행된다. (data 폴더가 없을 때)
mongoose
에서 루트 권한으로 접속하는 것이 찝찝해 이걸 위해 조회, 작성 권한이 있는 새로운 계정을 만들어주었다.
database/monogDB/initdb.d/mongo-init.js
db.createUser({
user: "user1",
pwd: "password",
roles: [
{
role: "readWrite",
db: "DATABASE_NAME",
},
],
});
마지막으로 docker-compose.yml
파일은 다음과 같이 작성하였다.
docker-compose.yml
version: "3"
services:
frontend:
...
backend:
container_name: backend
...
depends_on:
- mongodb
mongodb:
container_name: mongodb
image: mongo:5.0.9
ports:
- 27017:27017
env_file: .env
volumes:
- ./database/mongoDB/data:/data/db
- ./database/mongoDB/initdb.d:/docker-entrypoint-initdb.d:ro
networks:
- app-tier
restart: always
command: mongod -quiet
networks:
app-tier:
driver: bridge
특이사항
depends_on: - mongodb
이렇게 옵션을 주면 몽고디비가 완전히 올라간 후에 백엔드를 올리므로 해당 에러를 피할 수 있다.
command: mongod -quiet
를 추가해봤으나 별 다른 효과는 없었다...