Docker-compose란 복수 개의 컨테이너를 실행시키는 도커 애플리케이션이 정의를 하기 위한 툴이다.
기본적으로 YAML 파일을 사용하여 애플리케이션의 서비스를 구성할 수 있다.
즉 YAML 파일로 여러 개의 docker 내부 속성을 설정하고 YAML 파일을 실행시켜 마치 docker를 일괄적으로 한 번에 실행시키는 것과 같다고 생각하시면 됩니다.
Docker를 통해 MongoDB를 켜기 위해서는 express 를 켜는 도커 와 mongoDB 를 켜는 도커
총, 도커 컴퓨터는 2대가 필요하다.
다수의 도커 컴퓨터를 실행할 때는 도커를 그룹핑해서 실행하는 방법이 있다.
도커 컴퓨터를 그룹핑하는 것을 Docker-Compose 라고 한다.
이제, Docker-compose를 이용해서 위에서 설명했던 MongoDB를 연결해보자
section04 → 04-03-docker-with-express-package-json 폴더를 복사하고
폴더 명을 04-04-docker-compose-with-mongo 로 변경한다.
먼저 MongoDB를 연결을 위해 MongoDB 컨테이너를 띄워야 한다. 이전에 Dockerfile을 작성하여 하나의 가상 컴퓨터를 만든다고 했다.
backend폴더 안에 Dockerfile.mongo 파일을 만들고
mongo의 버전을 5로 정의하면
FROM mongo:5
이런 식으로 정의할 수 있다.
이제 Dockerfile과 Dockerfile.mongo를 통해 2개의 가상 컴퓨터를 만들었다.
이 때 각자 다른 컴퓨터들의 연결을 위해 포트 포워딩을 해줘야 한다.
도커로 만들어진 각자의 다른 컴퓨터들의 포트 포워딩을 위해 그룹핑하는 것을 Docker-Compose라고 한다.
Express와 MongoDB의 서버를 한번에 실행시키기 위해서 yaml 파일을 정의해주어야 한다.
.yml이나.yaml둘 다 사용 가능함.
backend내에 docker-compose.yaml 파일을 새로 생성해주고. 아래와 같이 코드를 만들어준다.
version: '3.7'
# 컴퓨터들
services:
# 컴퓨터이름
my-backend:
build:
context: .
dockerfile: Dockerfile
ports:
- 4000:4000
# 컴퓨터이름
my-database:
build:
context: .
dockerfile: Dockerfile.mongo
ports:
- 27017:27017
docker-compose.yaml 파일은 version, services, volumes, networks 를 정의한다.
여기서 먼저 services만 정의해 보자
services 정의는 각각의 컨테이너에 적용되는 configuration을 포함하고 있다.
services 내부에 my-backend와 my-database를 정의해 준다. 이는 변수명과 같다.
다른 변수명으로 정의해도 상관없다. services 내부에 정의된 요소는 다음과 같다.
Dockerfile을 포함하는 디렉토리 경로 또는 git repo의 urlDockerfile을 대체하는 파일을 지정해 준다.ports 정의는 Host OS와 컨테이너의 포트를 바인딩 시켜준다.
예를들어 컨테이너의 노출된 포트 3000을 Docker Host 컴퓨터(Linux VM)의 포트 3000에 전달하는 방식이다.
터미널에서 section04 → 04-04-docker-compose-with-mongo → backend 로 이동하여 docker-compose.yaml 파일을 실행시켜 image를 build 하려면
docker-compose build를 입력하여 다음과 같이 image를 build 한다.

docker-compose up을 입력해 컨테이너를 실행시켜 준다.

docker-compose build- docker-compsoe.yaml 에 있는 다수의 도커 컴퓨터 이미지 생성
docker-compose-up- 생성한 이미지의 도커 컴퓨터를 실행
서버를 켜고 docker ps 로 현재 동작중인 도커를 확인해 보면 mongoDB가 작동 중인 것을 볼 수 있다.

containerID로 MongoDB 컨테이너 내부에 접속한다.
docker exec -it [containerID] /bin/bash

mongo를 입력해서 MongDB내부에 접속할 수 있다.

지금, 로컬이 아닌 도커내의 mongoDB에 접속한 것이다.
show databases 명령어를 입력해보면 기존 mongo와 같이 데이터 베이스를 확인할 수 있다.

exit 를 입력하여 접속을 종료 할 수 있다.
MongoDB Compass에서 docker의 MongoDB와 연결해주기 위해서는 로컬의 MongoDB가 비활성화 되어있어야 한다.
터미널에서 Mac 사용자는 brew services list를 입력하여 mongodb-community 서비스가 종료되었는지 확인해 준다.
MongoDB Compass를 실행시켜 준다.

docker-compose.yaml 파일에 데이터베이스 서버의 포트를 27017:27017로 정의해 주었기 때문에 MongoDB Compass의 연결 포트를 27017로 정의후 Connect 하면 접속 가능하다.
연결이 되었다면 정상적으로 DB 서버가 실행 중인 것이다.
Databases를 눌러 확인해 보자.
Docker에서 새로 만든 MongoDB에 접속했기 때문에 로컬에서 만들어준 데이터는 존재하지 않는다.

지금까지, 도커를 통해 몽고db의 기본적인 사용방법을 알아보았다.
끝으로, 터미널을 열어 해당 폴더 위치를 확인한 후, 실행중인 Docker 컨테이너를
docker-compose stop명령어로 종료시켜 주세요.
다수의 docker를 정의한 docker-compse yaml 파일에서의 단축어
docker-compose build- 다수의 도커 컴퓨터를 그룹핑하여 이미지 빌드
docker-compose up- 만들어진 이미지를 통해 도커 컴퓨터를 실행
docker-compose stop- 도커 컴포즈 종료