본문 바로가기

About/Docker

[Docker] Docker에서 node.js 웹 서버 실행

Docker에서 node.js 이미지를 다운로드 받아 node.js 웹 서버를 실행 시키는 예제 입니다.


1. node.js 이미지 다운로드

우선 hub.docker.com 에서 다운로드 받을 node 이미지의 버전을 확인합니다.

hub.docker.com/_/node

 

node

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

alpine linux 기반의 node를 사용하겠습니다. (alpine linux가 가볍습니다.)

 

이미지를 다운로드 받기위해 터미널에 다음과 같이 입력합니다.

1
$ docker pull node:15.12.0-alpine3.12
cs

 

항상 버전을 명시해 주는 것이 좋습니다. (latest 사용 비추!!)

다음 명령어를 통하여 이미지가 잘 다운로드 되었는 지 확인합니다.

1
2
$ docker images | grep node
node                        15.12.0-alpine3.12   cadf40043c37   10 months ago   110MB
cs

 

node 이미지가 정상적으로 다운로드 되었으며, 용량은 110MB로 상당히 가볍습니다.

 

2. node.js 웹 소스 작성

간단한 웹 소스를 작성하겠습니다. nodejs_tert.js 파일을 다음과 같이 작성합니다.

1
2
3
4
5
6
7
8
//nodejs_test.js
var http = require('http');
var content = function(req, res){
        res.end("Welcome to JingO's Devlog!" + "\n");
        res.writeHead(200);
}
var server = http.createServer(content);
server.listen(8000);
cs

 

8000번 포트에서 접속 가능한 node.js 웹 소스 입니다.

 

3. node 컨테이너 실행

다운로드 받은 node 이미지를 이용하여 컨테이너를 실행하고, 작성한 소스코드를 docker cp 명령어를 이용하여 복사하겠습니다.

 

node 컨테이너 실행

1
$ docker run -it --8000:8000 --name=nodejs_test node:15.12.0-alpine3.12
cs

 

위 명령어를 해석하자면 다음과 같습니다.

  • docker run node:15.12.0-alpine3.12 node:15.12.0:alpine 이미지를 이용하여 컨테이너를 생성 후 실행시켜라.
  • --name : nodejs   컨테이너의 이름을 nodejs로 지정해라
  • -d  Container를 백그라운드에서 실행시켜라(detatch)
  • -p 8000:8000 Container의 8000번 포트를 Host OS(내 PC)의 8000번 Port와 연결시켜라(중요!)

컨테이너가 정상 실행되면 컨테이너의 id가 터미널에 출력됩니다.

docker ps 를 통하여 컨테이너가 정상실행되었는지 확인해봅니다. 컨테이너 이미지, 포트 정보, 이름등 설정한 내용을 확인할 수 있습니다.

1
2
3
$ docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
1147ba75ef5b   node:15.12.0-alpine3.12   "docker-entrypoint.s…"   28 seconds ago   Up 28 seconds   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   nodejs_test
cs

 

 그 후 위에서 작성한 소스코드를 docker cp 명령어를 이용하여 컨테이너 내부로 복사하겠습니다.

1
$ docker cp nodejs_test.js nodejs_test:/nodejs_test.js
cs

 

위 명령어를 해석하자면 다음과 같습니다.

현재 경로의 nodejs_test.js 파일을 nodejs_test라는 이름의 컨테이너의 '/' 경로에 nodejs_test.js라는 파일로 복사하라!

 

잘 복사되었는지 확인해볼까요?

Docker의 exec 명령어를 이용하여 컨테이너  ls 명령어의 결과를 받아옵니다. nodejs_test.js 라는 파일이 복사된 것을 확인할 수 있습니다.

1
2
3
4
5
6
$ docker exec -it nodejs_test ls
bin             media           root            tmp
dev             mnt             run             usr
etc             nodejs_test.js  sbin            var
home            opt             srv
lib             proc            sys
cs

4. node 서버 실행

컨테이너도 실행되었고, 웹 소스파일도 복사하였으니 이제 node 서버만 실행하면 끝입니다.

 

먼저 컨테이너의 bash를 실행하겠습니다. 사실 alpine 리눅스는 bash 가 없어 busybox인 /bin/sh를 실행합니다. 정상 실행된다면 컨테이너를 명령어로 제어할 수 있게 됩니다.

1
$ docker exec -it nodejs_test /bin/sh
cs

 

이제 node 를 실행시켜줍니다.

1
$ node nodejs_test.js # 컨테이너 안에서 실행
cs

 

5. 웹서버 접속 및 ip확인

웹서버 까지 실행하였으니 브라우저를 열어 웹서버에 접속해봅니다.

HostOS의 8000번 포트와 컨테이너의 8000번 포트를 연결하였으니

localhost:8000 주소로 접속합니다. 브라우저로 직접 접속하여도 되지만, curl 명령어로 간단하게 요청을 보내보겠습니다.

1
2
$ curl localhost:8000
Welcome to JingO's Devlog!
cs

 


docker에서 node image를 다운받고 node.js 서버를 실행시켜보았습니다.

소스코드를  docker cp를 이용하여 컨테이너에 복사하고 직접 node 명령어로 실행해보았습니다.

docker를 제대로 이용하기 위해서는 위의 모든 작업을 dockerfile 혹은 .yml코드로 작성하여 docker-compose를 통하여 모두 자동화시켜야합니다.

위 작업을 위해서는 지금 단계에서는 명령어를 제대로 이해하고 있는 것이 중요하다고 생각하여 명령어를 직접 실행하며 실습해보았습니다.