로컬 머신에 NPM을 (직접 설치하지 말고) Docker Container로!

왜?

먼저 하나 고백한다. 나는 로컬 머신을 최대한 깨끗하게 유지하려는 로컬 머신 결벽증 이 있다. 예전에 한창 개발을 시작했을 때, 멋 모르고 우분투를 사용하기 시작했고 처음 만져보는 신문물에 당황하여 몇 번이나 로컬 머신의 여러 가지를 건드리고 말았다. 그리고 당연하게도 결과는 참담했다. 꼬여버릴 대로 꼬여버린 설정들이 나의 마음을 옥죄었고, 결국 나는 몇 번이나 운영체제 재설치를 감행해야 했다.

아니, 개발할 시간도 부족한데(사실 반쯤은 핑계다…) 운영체제 재설치를 해야 한다니?! 그리고 운영체제 재설치할 때마다 다시 세팅해야 하는 개발 환경도 한 두 가지가 아닌데 시간이 너무 아깝고 번거로웠다!

그러던 나에게 도커(Docker)는 한줄기 빛이었다. 아니, 애플리케이션 영역을 고립시킬 수 있다니?! 그리고 이미지만 잘 만들어두면 언제든지 똑같은 설정의 컨테이너(Container)를 띄워서 동작할 수 있다니?! 컨테이너를 지우고 다시 만들고 하는 일련의 작업이 이렇게 쉽다니?!

그래서 나는 로컬 머신에 개발 환경 및 서버, DBMS 등을 설치할 때 도커 컨테이너를 띄워서 하는 것이 익숙해져 버렸다. 이게 전부 이름도 생소한 로컬 머신 결벽증 때문이다!

그런데?

이번에 사이드 프로젝트를 진행하고 있던 와중에 프론트엔드가 필요한 시점이 되었다. 그리고 프론트엔드 개발에서 사용할 여러 가지 의존성 관리를 NPM(Node Package Manager)으로 할 수 있다는 정보를 입수했다. 그래서 결국 이번에도 도커를 꺼내들어 NPM 컨테이너를 띄우기로 했다.

그래서?

1
2
3
4
~ docker run -it -d --name npm-test -v ~/npm-docker:/npm-docker node:lts
~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6e702dd97d7 node:lts "node" 1 minutes ago Up 1 minutes npm-test

docker run ~~ 한 줄이면 컨테이너는 생성 OK다. 저게 뭐냐고? 도커 컨테이너를 생성하고 실행시키는 명령인데, node:lts 이미지를 사용했으며 컨테이너 이름을 npm-test 라고 지정했고 볼륨으로 로컬 머신과 컨테이너 간의 특정 경로를 연결했다. 그리고 docker ps 명령으로 해당 컨테이너가 잘 실행되었는지 확인했다.

그럼 컨테이너 실행까지는 했는데, 이걸 실제로 어떻게 써야하는 걸까?

1
~ docker exec -it npm-test /bin/bash

docker exec ~~ 명령은 컨테이너 외부에서 컨테이너 내의 명령을 실행하는 것이다. 그럼 위 명령을 실행하면?

1
root@d6e702dd97d7:/#

컨테이너 내부에 직접 셸(Shell) 명령을 실행시킬 수 있다. 그럼 NPM이 컨테이너에 잘 설치되어 있는지 먼저 확인해보자.

1
2
root@d6e702dd97d7:/# npm -version
6.4.1

잘 설치되어 있다! 물론 내가 설치한 건 아니고 도커 이미지에 이미 설치되어 있는 것이라서 당연한 결과다.

일단 다른 건 제쳐두고 로컬 머신과 컨테이너 간에 볼륨이 잘 연결되어 있는지 확인해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@d6e702dd97d7:/# cd /npm-docker
root@d6e702dd97d7:/npm-docker# npm init -y
Wrote to /npm-docker/package.json:

{
"name": "npm-docker",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}

root@d6e702dd97d7:/npm-docker# ls
package.json

npm init -y 명령을 실행하면 현재 디렉터리 경로에 package.json 파일이 생성된다. 그럼 컨테이너에서는 파일 생성이 확인되었으니 로컬 머신으로 다시 돌아가보자.

1
2
3
4
5
root@d6e702dd97d7:/npm-docker# exit
exit
~ cd ~/npm-docker
~ ls
package.json

신기한가? 도커 컨테이너에서 생성했던 파일이 로컬 머신에도 생성되어 있다. 볼륨을 통해 특정 경로가 연결되어 있는 상태라서 가능한 일이다. 사실 볼륨 연결은 반드시 필요한 것은 아니지만, 컨테이너를 지워버리면 컨테이너의 파일 시스템 역시 함께 지워지기 때문에 계속 보관하고 싶은 파일이라면 이런 방법을 사용해야 한다.

끝?

사실 내 기억력이 좋지 않아서 기록으로 남기고자 겸사겸사 블로깅하는 것이라 내용이 좀 빈약한 면이 있지만, 위 방법으로 NPM을 로컬 머신에 설치하지 않고도 NPM을 사용할 수 있다.

물론 여러 가지 한계가 있는 방법이며, 더 좋은 방법이나 의견 있으면 언제나 피드백은 대환영이다!