docker compose 를 이용하고, 몽고DB 루트 관리자 정보는 .env.db
파일에 저장해서 사용한다. .env.db
파일은 git 저장소로 푸시하지 않도록 주의한다. docker-compose.yml
파일은 배포 구성 정보이므로 git 저장소로 푸시해준다.
docker compose 를 이용해 실행해준다. 굳이 사용하지 않아도 되는데, docker-compose
명령어를 통해, 간편하게 살리고 죽일 수 있으며, volume 삭제까지 한번에 할 수 있어 편리하다. 게다가 yml
파일 자체가 가독성이 좋아서 설정을 한눈에 보고 수정하기도 편하다.
services:
servicedb:
image: mongo:latest
container_name: servicedb
logging:
driver: "json-file"
options:
max-size: "1g"
max-file: "1"
volumes:
- servicedb:/data/db
ports:
- "27017:27017"
env_file: .env.db
volumes:
servicedb:
우선 volumes
설정을 통해, 컨테이너를 지워도 몽고DB 데이터가 날라가지 않도록 해준다. 예전엔 호스트 머신 파일시스템의 폴더를 직접 마운트해주었는데, 이제 도커의 자체 볼륨을 쓰도록 하는 편이다. 불필요한 폴더가 프로젝트 폴더 내에 생겼다 지워졌다 하지 않고, 일부 Go 언어 도구(go mod tidy
같은) 동작시 DB에 마운트해둔 폴더의 권한 문제가 가끔 꼬일 수도 있기 때문이다.
그리고 env_file
설정을 통해 이 컨테이너 실행 시 환경변수를 읽어올 파일을 정해줄 수 있다. .env.db
파일을 지정해주자. 그러면 .env.db
파일의 환경변수 내용을 읽어들여 컨테이너 실행 시 지정해준다.
이 외에, 추가로 난 항상 logging
설정을 넣어준다. 예전에 한번 파일 로그가 넘쳐나다가 디스크 용량 부족으로 죽은 적이 있다. Docker 의 기본 로깅 설정은 제한을 걸고, 로깅 정보 자체는 별도의 파이프라인으로 처리해주는걸 목표로 하자. 어짜피 GCP 같은 클라우드에 올리게 되면, 로깅 정도는 알아서 처리해줄테니.
MONGO_INITDB_ROOT_USERNAME=admin
MONGO_INITDB_ROOT_PASSWORD=password
.env.db
파일 안에 위와같이 루트 관리자 정보를 삽입해주자. 이 외에 몽고DB 관련 환경변수들을 추가로 지정할 수 있다.
docker-compose up -d
-d
는 detach
모드로 실행되는 것을 의미한다.
docker logs servicedb
를 통해 로그를 확인하면 아래와같이 루트 사용자가 잘 생성됨을 알 수 있다.
...
{"t":{"$date":"2021-08-27T02:07:40.368+00:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"conn2","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"admin.system.users","index":"user_1_db_1","commitTimestamp":{"$timestamp":{"t":0,"i":0}}}}
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
...
컨테이너만 죽이고, 데이터는 보존하고 싶을 경우, 간단히 docker-compose down
을 수행한다. 만약 테스트용이라 데이터까지 모두 지우고 싶으면, 아래와같이 -v
를 붙여준다.
docker-compose down -v