본문으로 바로가기

Docker [2/3] - NodeJS 환경 구축

category 개발 공부/Web (웹) 2021. 1. 22. 10:13
작성 날짜 수정 날짜
2020-12-30 2021-01-22

docker로 node를 구동하는 방법은 여러가지가 있다.
하지만 나중에 데이터베이스 서버 연결이나, nginx 같은 프록시 서버 연결할 때 같이 쓰기 용이하기 때문에, 나는 docker-compose를 사용할 것이다.

그리고 본 글의 목적은 개발 환경이 로컬의 docker를 제외한 어떤 것에도 종속되지 않는 것이 목적이므로, 최대한 docker만을 사용한다.

 

일단 도커 이미지들을 받아온다.

> docker pull node:14
14: Pulling from library/node
22f9b9782fc3: Pull complete
072739d44e4f: Pull complete
5111f27e9600: Pull complete
dc22afea6082: Pull complete
0ad0b403cda0: Pull complete
bca65cadbc25: Pull complete
b0870d0ca6f5: Pull complete
d00588a2ed1f: Pull complete
564b924d97f1: Pull complete
Digest: sha256:75e1dc0763f97d0907b81e378d0242ab9034fb54544430898b99a3ac71fa0928
Status: Downloaded newer image for node:14
docker.io/library/node:14

node:latest로 받아오면 LTS가 아닌 15 버전을 받아오기 때문에 LTS인 14 버전을 받아준다.

 

> docker run --rm node:14 node -v
v14.15.3

14버전이 깔린 걸 확인할 수 있다.

일단 도커와 연결해서 작업 디렉토리로 사용할 폴더에서 시작한다.

docker-compose.yml

>version: "3.8"
services:
  node:
    image: "node:14"
    working_dir: /usr/src/app
    environment:
      - NODE_ENV=development
    volumes:
      - ./src:/usr/src/app
    ports:
      - "80:3000"
    command: bash -c "npm install && npm start"

docker-compose.yml을 생성해서 위와 같이 작성해준다.

version docker-compose에는 현재 v1, v2, 그리고 v3가 있다. 웬만하면 최신 버전 사용하자. 기능이 많다.
services 도커 컨테이너를 정의하는 곳이다. 여러 개를 정의할 수 있다. 나중에는 DB도 추가할 거지만, 이번엔 node만 추가한다.
image 도커 이미지를 지정한다.
working_dir 도커 명령어가 실행될 위치를 지정한다. 컨테이너 내에서 앱의 루트 디렉토리로 설정할 곳을 지정하면 된다.
environment node 환경변수 설정이다. 앱 코드 내에서 process.env로 접근할 수 있는데 이건 docker 글에서 설명할 만한 게 아니니 패스한다. 일단 개발 환경이니까 development로 설정한다.
volumes 저번 글을 봤다면 대충 알 것이다. 호스트와 컨테이너의 디렉토리를 마운팅하는 것이다. 위 코드에서는 호스트에서 ./ 위치에서 파일을 수정하면 컨테이너 내에서의 /usr/src/app에서 파일이 수정되도록 짜여져 있다.
ports 컨테이너 외부/내부 포트를 연결해준다. 저번에 설명했으니 스킵
command 컨테이너 내에서 실행할 명령어를 설정한다.

 

> docker-compose up -d
Creating network "docker-node_default" with the default driver
Creating docker-node_node_1 ... done

작업 디렉토리에서 위 명령어를 실행하면 yml 파일에서 설정한 대로 컨테이너가 실행되고 엮인다. -d 옵션은 백그라운드 모드 옵션이다.

 

> docker-compose ps
       Name                     Command                State     Ports
----------------------------------------------------------------------
docker-node_node_1   docker-entrypoint.sh npm start   Exit 254

State를 보면 Exit인데, 현재 작업 디렉토리에 아무런 파일도 없기 때문이다. 작업 디렉토리에 간단한 코드만 작성한다.
보통은 그냥 로컬에 npm을 설치해서 하면 되지만, 나는 깨끗한 로컬 환경을 바라는 사람들을 위해 한 가지 과정을 더 거칠 것이다. /usr/node/app 디렉토리에 기본적인 npm 구조를 설정해둘 것이다.

로컬에서 진행할 사람은 최하단 링크를 따라가서 nodejs를 설치하면 된다. 사실 맘 편하게 설치하는 것이 정신건강에 이롭다.

src/package.json

{
  "name": "app",
  "version": "0.0.0",
  "description": "description",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.16.4"
  }
}

src/app.js

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

작업 디렉토리에 src 디렉토리를 만들고, 위와 같이 2개의 파일을 작성한다.

이렇게 작성해두면 npm install 명령으로 인해 서버 운영에 필요한 node module이 설치될 것이고, npm start로 서버를 실행할 수 있게 된다.

 

> docker-compose up -d
Creating docker-node_node_1 ... done

docker-compose로 실행한다.

 

> docker-compose ps
       Name                     Command               State          Ports        
----------------------------------------------------------------------------------
docker-node_node_1   docker-entrypoint.sh bash  ...   Up      0.0.0.0:80->3000/tcp

컨테이너가 정상 작동하는 걸 확인할 수 있다.

 

> docker exec -it docker-node_node_1 curl http://localhost:3000
Hello World!

도커 내에서 curl로 확인해보면, 서버가 정상 작동하는 걸 확인할 수 있다.

 

또한 외부 포트 80번과도 정상적으로 연결되어 있다.

이미 작성된 프로젝트 파일이나, 자신이 보통 사용하는 디폴트 코드가 있다면 src 디렉토리에 넣고 다시 docker-compose up -d를 실행하면 이것 또한 정상적으로 작동한다.

 


이제 NodeJS 환경 구축은 끝났고, 데이터베이스를 구축할 차례이다. 이건 다음 글에서 다뤄보겠다.