본문 바로가기
Development Tools/Docker

Docker 를 통해 Node 서버 띄우기

by jjerryhan 2017. 12. 30.
반응형

Docker 를 통해 Node 서버 띄우기

사실 Docker 를 다시 들여다 본 이유는 heroku 에 node 서버를 얹는데 heroku git 방식을 사용할 수 없어서 였습니다.  multi remote, git flow, full stack 등등 설명하기엔 길구요. 

heroku 에 docker file 을 이용해서 node server 를 얹는 것 까지가 아마 포스팅 될 것 같네요. 
일단 로컬에 제가 만든 express 서버를 docker container 를 통해 구동해 보았습니다. 

Node 이미지 검색 및 다운

docker 허브에 이미 해당 이미지가 있을땐 기분이 좋습니다. 그것도 수많은 star 와 pull 을 가진 이미지는요. 내가 글로벌 스탠다드하게 일하고 있구나 느끼게 해주죠. 암튼 이미 이미지가 있으니 사용합니다. 

docker image pull node

이미 이미지를 가지고 있는데 한번 더 pull 해보니 update 를 수행하네요. 그리고 node 이미지는 사이즈가 좀 큽니다. 아마도 내부에 dependency 대상 파일들을 거의 대부분 가지고 있기 때문으로 보입니다. 뭐 이건 추측!. 


호스트의 특정 경로를 컨테이너의 특정 경로에 mount 하기

 당연한 이야기 지만 docker 의 이미지는 클래스와 같고 docker 의 컨테이너 프로세스는 인스턴스와 같아서 인스턴스에 아무리 수정을 가한들 이미지는 변경되지 않습니다. 또한 이미지는 모든 프로세스가 공유하기 때문에 수정도 불가합니다. 이미지를 새로 만드는 것은 가능하지요. 

문제는 서비스를 하려면 이미지에 있는 소스가 아니라 내 소스를 컨테이너 프로세스에 붙여야 하는데 어쩌지? 입니다. 

Docker 는 파일들을 Layered File System 형식으로 관리합니다.  계속 계층적으로 덧붙인다는 거죠. 

아무튼 아래와 같이 호스트의 특정 경로를 컨테이너의 특정 경로에 mount 할 수 있습니다. 

docker run -p 80:4000 -v /var/www node

//node 이미지를 이용해서 컨테이너를 구동하되 호스트의 80 포트를 컨테이너의 4000 에 연결하고 호스트의 임의 경로를 컨테이너의 /var/temp/ 경로에 붙이라는 의미입니다. 

이미지를 사용만 하고 아무  daemon 도 구동하지 않았기 때문에 바로 exited 되었습니다. 

그런데 컨테이너의 /var/temp 경로는 호스트의 어디에 연결된 걸까요? 


inspect 명령어로 확인해 보겠습니다.  (위의 컨테이너 중 c3 으로  id 가 시작하는 컨테이너를 조사해 봅니다.)

docker inspect c3 

수 많은 정보가 출력 되지만,  Mounts 를 보면, Source 즉 호스트의 ....../_data 경로가 Destination 즉 컨테이너의 /var/temp 경로에 mount 된 것을 알 수 있습니다. 


로컬 node 소스를 docker container 에서 구동시키기

로컬에 아래와 같이 소스가 있고, 


아래 명령어로 구동이 됩니다.  (package.json 내용)

npm start


보시는 것처럼 서비스는 4000 번에서 리슨합니다. 


이 경우 아래와 같은 명령을 통해 컨테이너 내에서 실행 할 수가 있습니다.

docker run -p 80:4000 -v $(pwd):/var/www -w "/var/www" node npm start
// 호스트의 80 포트를 컨테이너의 4000 번에 맵핑하고, 현재 경로를 컨테이너의 /var/www 경로에 마운트함. 이미지는 node 이미지를 사용하며, 컨테이너가 구동된 후 'npm start' 명령어를 실행할 것! 'npm start' 명령어를 실행하는 경로 (working path) 는 /var/www 임.

위와 같이 로컬호스트의 80 으로 접속해보면 정상적으로 컨테이너에 구동된 서버가 응답 처리를 합니다. 


이번 포스트는 여기까지 입니다.