Docker를 알게 된 이후
docker를 모르고 개발할 당시 크게 불편한 점은 없었던 것 같지만 docker를 경험한 이후 api 서버를 개발할 때면 가장 먼저 infra를 어떻게 구축할지 생각하게 됩니다. 깊이 있게 Docker를 알지는 못하지만 사용하면서 가장 편리했던 점은 django nodejs reactjs 등 여러개의 서버를 nginx로 묶어서 사용할 수 있고 os에 관계없이 동일한 환경으로 구성해서 개발하거나 배포할 수 있다는게 가장 큰 장점이었습니다.
예를 들어,
reactjs => localhost:3000
nodejs => localhost:3333
django => localhost:8000
세가지 서버를 사용한다고 가정했을 떄 docker를 사용한다면
reactjs => localhost/reactjs
nodejs => localhost/nodejs
django => localhost/django
위와 같이 80포트로 묶어서 서버를 구동할 수 있다는게 가장 큰 장점으로 다가왔습니다.
(이번 글에서는 nginx는 사용하지 않습니다.)
자세한 내용은 Docker overview를 확인하셨으면 좋겠습니다.
Docker 설치하기
Download and install Docker
우선 위 링크에서 Docker를 설치합니다.
nodejs 서버 만들기
nodejs 설치 후
특정 폴더에
npm init -y (package.json 생성)
npm install express (installation express module)
touch server.js
커맨드를 입력 후 server.js에 아래 내용을 입력합니다.
const express = require('express')
const app = express()
const port = 3000;
app.get('/', (req, res) => {
res.send('Docker with nodejs')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
package.json을 열어서 script 하위 depth에
"start" : "node server.js" 를 입력합니다.
terminal에 npm run start 입력 후
localhost:3000에 접속하게 되면 Docker with nodejs가 보이실 겁니다.
Docker 사용해서 nodejs 서버 구동
이제 docker를 사용해서 서버에 띄워보도록 하겠습니다.
root 경로의 터미널에 touch Dockerfile 커맨드로 Dockerfile 생성 후 아래와 같이 작성합니다.
# image
FROM node:14-alpine
# WORKDIR은 명력을 실행하기 위한 디렉토리를 설정합니다.
WORKDIR /usr/src/node
# root 폴더에 있는 package-lock.json를 /usr/src/node 복제합니다
COPY package-lock.json /usr/src/node
# root 폴더에 있는 package.json를 /usr/src/node 복제합니다
COPY package.json /usr/src/node
# package.json에 있는 module을 install합니다
RUN npm install
# node_modules가 설치 된 이후 root(.) directory전체를 복제합니다.
COPY . /usr/src/node
# script를 실행합니다.
CMD ["npm","run","start"]
terminal에 docker image를 build 합니다
docker build . --tag docker_nodejs
build 후 docker container를 실행합니다.
docker run -p 3000:3000 docker_nodejs
nodejs 서버만 구동했을 때와 같이 서버가 실행됩니다.
이렇게 불편한데 굳이 쓰는 이유가 뭔가요?
위처럼 사용한다면 여전히 docker를 왜 사용해야 하는지 도저히 알 수 없습니다.. os에 관계없이 동일한 환경을 구성할 수 있다지만 너무 불편해 보이는건 사실입니다. 매번 npm run start보다 긴 command를 입력해야 되니까 번거롭게 느껴지시겠지만.. 다음 글에서는 docker-compose를 사용해서 서버를 구동시키는 방법에 대해서 글을 적도록 하겠습니다. 감사합니다.