전 회에서 docker compose를 설치하셨다면 아래 커맨드를 사용해서 설치 완료된걸 확인해주세요.
docker-compose version
위 커맨드를 실행했을 때 아래와 비슷한 응답이 오면 잘 설치하신 겁니다.
꼭 읽어주세요!
이 강의는 Docker, Docker Compose 그리고 Kubernetes 강의이지 nodeJS, Javascript, database 강의가 아닙니다. 이 회 이후 나오는 프레임워크 및 언어는 기본적으로 이해하신다는 가정하에 진행하도록 하겠습니다. 코드에 대한 더 깊은 이해를 하고 싶을 경우 제 다른 강의를 참고해주세요.
Docker Compose로 기획할 서버 구조
docker compose 가 orchestration 툴이기 때문에 docker compose의 강점을 체감하기 위해서는 조금 더 복잡한 서버 구조가 필요합니다. 저희는 아래와 같은 서버 구조를 docker compose를 사용해 구성해보도록 하겠습니다.
저희는 위와 같은 구조를 docker compose로 한 번에 운영해보도록 하겠습니다. Hacker News API를 제외한 모든 네모칸들은 각각의 컨테이너로 운영이 될 것이고 6개의 컨테이너를 한 번에 운영하기 위해 docker compose를 사용하게 될 것입니다. 이 프로젝트가 하게 될 역할은 아래와 같습니다.
- 유저가 저희 서버로 접속을 합니다. 이때 nginx가 Reverse Proxy로 작용하여 (Reverse Proxy가 뭔지 모르실 경우 강의 진행하시면서 배우시게 될 겁니다.) React Front와 Express nodeJS 서버에 트래픽을 전달해주고 프론트엔드 요청 시 React 어플리케이션이 응답이 됩니다.
- React Front 에는 hacker news (https://news.ycombinator.com/)를 볼 수 있으며 모든 요청을 Express Server에 보내게 됩니다.
- Express Server가 뉴스 리스트 요청을 받으면 우선 mongodb에 요청하여 현재 데이터베이스에 존재하는 뉴스를 React Front로 리턴해주게 됩니다. 뉴스가 존재하지 않는 경우 또는 id만 존재하는 경우 Polling Server에 뉴스 정보를 Hacker News API를 통해 가져오라는 추가 요청을 합니다.
- Polling Server는 맨 처음 서버를 시작할 때 mongodb를 확인하고 데이터가 없을 경우 Hacker News API를 통해 약 500개의 베스트 뉴스의 ID들을 가져옵니다. 추가적으로 Express Server에서 뉴스의 상세정보를 가져와달라고 요청할 경우 Hacker News API에서 해당 뉴스의 ID를 사용하여 상세정보를 요청하는 API를 실행하여 상세정보를 Mongodb에 추가적으로 저장합니다.
물론 제가 만약 정말 해당 목적의 서버를 구성한다면 이런 식으로 오버킬을 하지는 않을 테지만 Docker Container Orchestration을 처음 하는 사람들에게 간단히 컨셉를 설명하고 강점을 몸소 체험해볼 수 있는 좋은 아키텍처라고 생각합니다. 가장 먼저 docker compose를 사용한 Mongodb 작업부터 해보도록 하겠습니다.
Mongodb 작업하기
Mongodb는 NoSQL 다큐멘트형식의 데이터베이스입니다. 보수적인 기업들에선 data integrity 및 transaction 때문에 꺼려 하는 경우도 많지만 해외에서는 프라이머리 데이터베이스로 사용하는 금융 스타트업도 있을 정도로 인기가 좋습니다. 다큐멘트 형식이기 때문에 수많은 테이블의 join을 고려할 필요가 없고 javascript에 자연스러운 JSON 형식의 데이터구조를 사용할 수 있다는 강점이 있다고 볼 수 있습니다. Mongodb에 대한 자세한 정보는 아래 링크를 참조해주세요.
Docker compose를 사용하면서 컨테이너를 사용해보지 않으셨다면 평범하진 않은 프로젝트 폴더 구조를 가져가게 되실 겁니다. 루트 폴더에 각각 서비스들의 폴더들이 존재하고 도 커 컨테이너들이 해당 폴더들을 컨테이너의 루트 폴더로 사용하게 됩니다. 저희가 제작하려는 아키텍처를 폴더 구조로 표현하면 아래와 같이 되겠습니다.
- project root
- Nginx
- React
- Express Server
- Polling Server
- Mongodb
- Redis
먼저 Mongodb 폴더를 생성하고 폴더 안에 Dockerfile을 생성하도록 하겠습니다. Dockerfile에 들어갈 내용은 아래와 같습니다.
FROM mongo:4-xenial
Mongodb v4 이미지이며 설명 및 세팅에 대한 상세정보는 아래 링크를 참조하시면 됩니다.
Mongodb 폴더에서 아래 커맨드를 사용하여 이미지를 빌드 해보도록 하겠습니다.
docker build .
아래와 같은 결과가 나오면 됩니다.
제대로 빌드가 되는 걸 확인했으니 docker compose를 활용하여 실행해보도록 하겠습니다.
project root로 이동하여 docker-compose.yaml이라는 파일을 생성하고 아래 코드를 붙여놓도록 하겠습니다.
version: '3' # docker compose 버젼이름
services:
mongodb: # 서비스 이름
build: ./Mongodb # 빌드 타겟 폴더
ports:
- "${MONGO_PORT}:27017" # 개방할 포트 ${}에는 환경변수 설정가능
volumes:
- ./Mongodb/data:/data/db # 도커컨테이너와 로컬 파일시스템과 공유할 폴더
env_file:
- .env # 환경변수로 사용할 파일
docker compose의 yaml 파일은 가장 먼저 버전을 설정하고 services라는 키 아래에 컴포즈로 실행할 모든 서비스들을 나열합니다. 서비스마다 여러 설정을 할 수 있는데 mongodb 서비스에는 build, ports, volumes, envfile에 대한 설정을 진행한 모습입니다. build는 mongodb 서비스를 빌드 할 폴더의 위치를 정의하는 부분입니다. ./Mongodb 폴더에서 도 커 기본 설정 파일인 Dockerfile을 사용하여 필드를 진행하라는 뜻입니다. ports는 기존 docker run을 할 때 사용했던 -p 플래그와 같은 역할을 합니다. 다만 여기서는 ${MONGOPORT}라는 환경 변수를 사용하여 로컬 시스템 포트를 지정할 수 있도록 설정하였습니다. Volumes는 mongodb 컨테이너와 공유할 로컬 파일시스템을 지정할 수 있습니다. 현재 설정은 로컬 파일시스템의 ./Mongodb/data 폴더를 Mongodb 컨테이너의 /data/db 폴더와 매핑을 하는 것입니다. Docker compose 도 일반 docker run을 할 때와 같이 컨테이너를 삭제할 경우 컨테이너 내부의 파일시스템이 모두 삭제되기 때문에 mongodb의 데이터 폴더를 로컬 시스템과 매핑하여 mongodb를 재시작하더라도 데이터는 유지될 수 있도록 설정한 것입니다. env_file은 말 그대로 환경 변수 파일을 지정하게 됩니다. 위에서 제공해드린 mongodb 이미지 링크를 잘 읽어보셨다면 아시겠지만 mongodb 이미지는 아래와 같은 환경 변수들을 기본적으로 사용합니다.
MONGO_INITDB_ROOT_USERNAME
MONGO_INITDB_ROOT_PASSWORD
MONGO_INITDB_DATABASE
위 환경설정 정보를 사용하여 mongodb의 루트 유저 및 패스워드, 그리고 기본 데이터베이스를 설정하게 됩니다. 그럼 mongodb의 환경설정을 위해 project root에. env라는 파일을 생성해 아래 코드를 붙여 넣겠습니다.
## Mongodb
MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=root
MONGO_INITDB_DATABASE=kubernetes-tutorial
완료가 되셨다면 project root에서 아래 커맨드를 사용해 mongodb를 docker compose로 실행해보도록 하겠습니다.
docker-compose up --build
docker compose는 커맨드를 실행한 위치에서 docker-compose.yaml이라는 설정 파일을 찾아 설정되어있는 서비스들을 실행합니다. 또한 docker compose에서는 실행은 up, 중지는 down으로 표현하고 있습니다. 위 커맨드를 실행하면 docker-compose.yaml 설정 파일을 바탕으로 컨테이너를 빌드하고 실행하게 됩니다. 커맨드를 실행하게 되시면 많은 로그와 함께 mongodb가 실행이 되시는 걸 볼 수 있으실 겁니다. 아래와 비슷한 결과가 나오면 docker compose를 사용해 mongodb 서비스를 성공적으로 실행하신 겁니다.
이번 글은 여기서 마무리하고 다음 회에서 뵙도록 하겠습니다.