주요 내용으로 건너뛰기

간단한 Docker + Mongodb/Redis/Nginx 설정

도커 맛보기

이 포스트는 정말 간단한 설정만을 다룹니다. 

세부적인 프로덕션 설정 등을 원하신다면 다른 블로그를 참조해주세요.



지난 포스트에서는 최신 버전의 babelwebpack 을 통해 node.js 개발환경을 구축하는 것까지 같이 해보았습니다.

이번 포스트에서는 Docker 를 활용해서 Mongodb/Redis/Nginx 를 설정하는 방법을 배워보도록 하겠습니다.

깃 저장소 주소: https://github.com/leejh3224/modern-nodejs


도커
도커

Why Docker?


방학이 한창이던 1 월 말 즈음, 저는 allHumor 프로젝트에 몰두해있었습니다.

이것저것 새로운 기술도 써보고, 코드도 처음부터 리팩토링해보면서 꽤나 큰 고생을 했습니다.

다행스럽게도 개강 직전에 미약하나마 프로젝트를 완성할 수 있었고, 만족스럽지는 않았지만 잘 돌아가긴(?) 했습니다.

근데 막상 AWS 에 배포할 때가 되니 개발환경에서는 예상치도 못했던 문제들이 터져나왔습니다.

제 개발 환경은 맥 + OS Sierra 입니다. 하지만 배포 서버에는 주로 linux 의 여러 배포판들이 사용되죠. (대포적으로 ubuntu, debian, fedora 등) 그

러다보니 라이브러리의 호환성 문제도 터져나왔고(이미지 리사이징을 위해 사용했던 node-sharp 라이브러리가 linux 환경에서 말썽을 일으켰습니다), 서버를 처음부터 세팅할 생각에 막막해졌습니다.

어찌어찌해서 NginxMongodb, node.js 등을 세팅하긴 했으나 그 모든 과정을 두 번 하라면 그럴 자신이 없어지더군요.

모든 세팅 명령어를 외워버리거나 어딘가에 적어둘 수도 있지만 버전 업데이트를 해야하거나 새로운 소프트웨어를 설치해야한다면 문제가 이만저만이 아닐 것입니다.

여기서 도커가 등장합니다.

Dockerfile 과 Docker-compose


도커를 사용하는 가장 좋은 방법은 Dockerfiledocker-compose 설정 파일(.yml)을 사용하는 것입니다.

먼저 node.js app 을 위한 Dockerfile 을 작성해봅시다.

프로젝트의 가장 바깥쪽 디렉토리에 Dockerfile 이라는 이름을 가진 파일을 만들어줍니다. (확장자는 필요없습니다.)

그리고 아래와 같이 작성해줍니다.



도커 파일 작성 시 가장 헷갈릴만한 부분은 역시 경로와 관련된 것입니다.

이와 관련해서 기억해두어야할 세 가지는


1. Dockerfile의 각 줄은 경로를 공유하지 않는다.

즉, 명시적으로 WORKDIR 명령어를 통해 새로운 루트 경로를 설정하지 않는 이상 경로는 /에 고정됩니다.

2. WORKDIR을 사용하면 경로를 고정할 수 있다.

만약 같은 경로에서 여러 작업을 해야한다면 WORKDIR을 사용할 수 있습니다.

3. 왼쪽은 호스트 머신의 파일 경로, 오른쪽은 컨테이너의 파일 경로

이는 추후에 volumes을 다룰 때도 똑같이 적용됩니다.


Dockerfile 을 작성했으니 build 를 해봅시다.

이제 도커 컨테이너를 실행시켜봅시다.

참고) 기본적인 도커 명령어

잘 실행되시나요? localhost:3030에서 확인해보세요.


이렇게 Dockerfile 을 작성해서 개별로 db/nginx/node.js app 을 실행시킬 수도 있지만 Docker-compose 를 활용하면 한결 간편하게 이 과정을 진행할 수 있습니다.


Docker-compose 설치

https://docs.docker.com/compose/install/#prerequisites


설치가 완료되었다면 docker-compose.yml 파일을 작성해줍니다.

Dockerfile 과 같은 디렉토리에 docker-compose.yml 파일을 만들고

다음으로 package.json 에 아래와 같이 추가해줍니다.


모듈을 다운로드 받지 않나구요?

어차피 컨테이너를 빌드하면서 모듈을 컨테이너 다운로드 받기 때문에 호스트 컴퓨터에는 어떤 모듈도 다운로드 받지 않아도 됩니다.

그냥 위와 같이 package.json 에 명시만 해주면 되죠.

이제 src 아래에 db.js 를 추가해줍니다.

이제 index.js 에서 db 를 연결해줍니다.


이제 두 가지 명령어만 입력하면 됩니다.


잘 실행되시나요? 좋습니다.

혹시 mongodb 커넥션 에러가 발생한다면 environment 에서 변수 값을 잘못 준건 아닌지 체크해주세요!

또 디비 컨테이너가 서버와 같은 네트워크를 사용하고 있는지도 확인해주세요.

Redis 설정


위에서 우리는 아주 간단한 Mongodb setup 을 마쳤습니다.

다음 차례는 Redis 입니다.

Redis 설정은 Mongodb 설정과 상당히 유사합니다.



Redis client 생성을 위한 파일을 만들어주고,


아까와 마찬가지로 redispackage.json 에 추가해줍니다.


실행만 남았군요.

항상 build 커맨드를 실행시켜주시는거 잊지 말아주세요.


이렇게 간단한 설정 몇 줄과 명령어 몇 번만으로 디비 세팅이 완료되었습니다.

DockerDocker-compose의 가장 강력한 힘은 설정이 간단하고 곧바로 프로덕션 환경으로 넘어갈 수 있다는 점에 있습니다.

개발단계에서 이렇게 테스트를 바로 진행해볼 수 있기 때문에 개발-프로덕션 환경 간에 차이가 줄어들게 되죠.

계속해서 Nginx 설정으로 마무리 짓겠습니다.


Nginx 설정


아래와 같이 docker-compose.yml 파일에 추가해준 다음,


nginx.conf 파일을 준비해줍니다.


이제 nginx 를 위한 Dockerfile 을 작성해봅시다.

저장하실 때 이름은 Dockerfile.nginx로 구분해줘야 다른 Dockerfile과의 충돌을 막을 수 있습니다.



어떤가요? nginx 로그가 보이시나요?

이로써 정말 간단한 서버 설정이 완료됐습니다.

다음에는 Docker + ELK 스택(엘라스틱서치 + 로그스태시 + 키바나) 설정편으로 돌아오겠습니다.

감사합니다.


참고: 같이 읽으면 좋은 글들


1. 초보를 위한 도커 안내서 - 도커란 무엇인가?: https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

2. Building Efficient Dockerfiles - Node.js: http://bitjudo.com/blog/2014/03/13/building-efficient-dockerfiles-node-dot-js/

3. 자주쓰는 Dockerfile instruction들: https://rampart81.github.io/post/dockerfile_instructions/

이준형 님의 창작활동을 응원하고 싶으세요?

댓글