도커의 컨테이너 볼륨을 사용하여 실행 중인 도커 컨테이너에 Node 소스 코드를 연결하는 방법을 알아보겠습니다. node 코드는 실제로 로컬 pc에서 작동되는 코드이고 컨테이너의 볼륨에 연결되게 됩니다. 이렇게 하면 실행환경은 컨테이너에서 담당하고 소스코드는 나의 작업 폴더에서 쉽게 변경하면서 확인할 수 있어서 개발시 매우 편리한 환경을 갖출 수 있습니다.
Node 소스 코드 준비
볼륨에 연결할 코드는 아래와 같은 포트번호가 3000인 express 서버 입니다.
현재 노드 소스 코드가 존재하는 위치는 c:\study\docker\macke-container 입니다.
node app 명령으로 서버가 실행되고 브라우저에서는 아래와 같은 화면을 볼 수 있습니다.
이러한 로컬에서 개발 중인 코드를 컨테이너 노드 환경에서도 같은 파일을 사용해서 돌아가게 하고 싶습니다.
컨테이너 볼륨 만들기
먼저 컨테이너 볼륨을 만드는 연습을 해보겠습니다. 우선 docker image list 로 로컬에 있는 이미지를 확인해 보겠습니다.
docker hub에서 가져온 node 이미지가 있는 걸 확인할 수 있습니다. 준비한 프로그램은 node환경에서 실행되는 express 웹 서버이므로 node 이미지를 사용할 계획입니다. 이미지로 컨테이너를 만들고 실행할 때는 Docker run 커맨드를 사용합니다.
docker run -p 8080:3000 -v /var/www node
우리 프로그램은 3000번 포트에서 기동되니 -p 옵션으로 포트를 지정하고 있고, node 이미지로 컨테이너를 만들라고 명령하고 있습니다. -v로 볼륨을 /var/www로 지정하였습니다. 하지만 이경로는 실제로 우리의 소스코드를 가리키고 있지는 않습니다.
하지만 실행하면 컨테이너는 시작하지만 실행할 명령이 없으므로 종료되는 걸 볼 수 있습니다.
docker inspect id로 검사를 해보겠습니다. inspect로 특정 컨테이너의 대한 많은 정보를 확인해 볼 수 있습니다.
docker inspect 70
Mount 영역을 찾아서 보면 Source에 매우 긴 호스트 시스템의 경로가 할당된 걸 볼 수 있습니다. name은 이 볼륨에 지정되는 유니크한 이름입니다. 컨테이너 자체에서 호스트의 이 경로에 대한 별칭은 var/www입니다. 즉 /var/www/에 쓰기 작업을 하면 실제로 쓰이는 위치는 Source에 나와있는 곳이 됩니다. 이 경로는 실제로 작업하고 싶은 경로가 아니어서 그다지 도움이 되는 것 같지 않네요.
컨테이너 삭제
일단 컨테이너를 지우고 다시 만들어 보도록 하겠습니다. container list -a 로 우리가 지울 컨테이너를 확인하고 컨테이너의 ID가 70으로 시작하는 것을 확인했습니다.
docker container rm -v 70(컨테이너 ID) 으로 해당 컨테이너를 지우겠습니다.
docker container rm -v 70
-v옵션을 주면 컨테이너를 제거할 때 호스트 컴퓨터에 있는 볼륨도 같이 제거하게 됩니다.
제거 후 컨테이너를 조회해 보면 모두 정리된 걸 확인할 수 있습니다.
볼륨에 node 작업 폴더 연결
이제 직접 볼륨에 쓰이는 패스를 지정해 보도록 하겠습니다. 현재 커맨드 창에서 node 소스코드가 있는 폴더로 이동한 상태입니다.
그리고 아래 명령어로 컨테이너를 실행해 줍니다. pwd를 쓸 때 power shell인 경우 ${pwd}로 써야 하는 걸 주의해주세요. linux계열은 $(pwd)입니다. 예제는 파워쉘에서 실행하고 있습니다.
# 리눅스
docker run -p 8080:3000 -v $(pwd):/var/www -w "/var/www" node node app.js
# 파워쉘
docker run -p 8080:3000 -v ${pwd}:/var/www -w "/var/www" node node app.js
- -p 옵션으로 8080 포트를 3000 포트로 제공하고 있습니다.
- -v로 볼륨을 만들고 있는데 $(pwd)를 쓰면 현재 작업 디텍토리(node 소스 코드가 있는 곳)를 쉽게 지정할 수 있습니다. 그리고 이것은 컨테이너의 볼륨이 실제로 가리키는 디렉터리가 되는데, 콜론 뒤에 :/var/www을 써줌으로 컨테이너의 볼륨 /var/www가 실제 호스트 위치 pwd 즉 현재 커맨드를 치는 디렉터리를 가리키게 됩니다.
- -w 옵션을 사용했는데 그것은 컨테이너의 작업 디렉토리(working directory)를 의미합니다. 컨터이너에서 명령이 실제로 실행되는 폴더를 무엇이 되어야 할까요? 우리는 node 소스를 실행시키고 싶고 그 소스는 /var/www 볼륨으로 연결한 상태입니다. 따라서 워킹 디렉터리도 /var/www가 되어야 할 것입니다.
- 그 뒤의 node는 실행시킬 컨터이너화 하는 이미지 이름을 적어주고 있습니다.
- 마지막으로 node app.js 실행하라고 적어주었고 이 명령어가 워킹 디렉터리에서 실행될 것입니다.
실행되고 Example app listening on port 3000이라고 출력된 게 보이시나요? 이 라인은 예제의 express 서버에서 출력하고 있는 문자열입니다.
브라우저를 열어 웹서버가 잘 돌아가는지 확인해 보겠습니다.
소스코드의 express 서버는 3000 포트를 사용하고 있지만, 호스트 피시의 8080 포트를 3000 포트로 연결해 놓았으니 8080 포트로 확인하고 있습니다. 잘 동작하네요.
마지막으로 정말 컨테이너에 있는 소스가 아니라 내 pc 호스트 pc의 소스코드로 웹서버가 돌아가고 있는지 의심이 되는군요. 이걸 확인해 보기 위해 소스 코드 app.js를 로컬에서 바로 수정해 보도록 하겠습니다.
response를 수정하였습니다. 이제 브라우저에서 확인해 볼까요?
그전에 컨테이너를 정지하고 다시 시작하겠습니다. 만약 nodemon으로 express 서버를 실행시켰다면 수정사항이 바로 반영되어 컨테이너를 다시 시작할 필요가 없습니다.
소스코드는 내 작업 PC에서 수정하고 실행환경만 컨테이너에서 실행을 했다는 게 증명되었습니다.
개발 시에만 쓰는 환경을 컨테이너에서 사용하고 코드는 내 작업 폴더를 사용한다면 깔끔하게 피시를 유지할 수 있을 것 같습니다.
여기까지 읽어주셔서 감사합니다.
'Container > Docker' 카테고리의 다른 글
[Docker] Dockerfile 만들기 (0) | 2022.04.20 |
---|---|
[Docker] Dockerfile 이란? 도커파일 개념 잡기 (0) | 2022.04.18 |
[Docker] Volume 사용자 정의, 볼륨 저장 위치 지정하기 (0) | 2022.04.12 |
[Docker] 볼륨(Volume)이란? (0) | 2022.04.11 |
[Docker] 도커, Layered File System 이해하기 (0) | 2022.04.11 |
최근댓글