꼬꼬마 블로그

꼬꼬마의 기술 블로그

안녕하세요. 평소에 Node.js를 이용한 서버를 배포할 때 항상 pm2를 사용하곤 했습니다. 하지만 팀에서는 도커를 사용하였고, 팀 프로젝트의 배포를 위해서는 도커 공부가 필수적이게 되었습니다.

계속 도커 공부를 미루기만 하다가 오늘 간단한 명령어들을 공부해서 글로 남겨보려고 합니다. 

 

설치 및 설정

많은 블로그에서 소개하기 때문에 넘어가도록 하겠습니다. 저는 Mac 환경에서 brew를 통해 설치하였습니다.

 

설치를 진행한 후 간단한 웹앱을 만들어 주도록 하겠습니다.

$ mkdir server
$ cd server
$ yarn init
$ yarn add express

위의 명령어를 통해 간단한 프로젝트를 초기화 합니다.

 

const express = require('express');
const fs = require('fs');

const app = express();

app.get('/', (req, res, next) => {
  res.send('hello world');
});

app.get('/create-file', (req, res, next) => {
  fs.writeFile('./data/test.txt', 'hello', () => {
    res.send('success');
  });
});

app.get('/file', (req, res, next) => {
  fs.readFile('./data/test.txt', (err, ctx) => {
    if (err) {
      res.send(err.message);
    } else {
      res.send(ctx);
    }
  });
});

app.listen(3000, () => {
  console.log('run');
})

app.js를 만든 후 위의 코드를 넣어줍니다. 총 3개의 엔드포인트를 만듭니다.

/ hello world를 전송합니다 - 서버가 작동하는지 확인
/create-file 파일을 생성 - 추후 사용
/file 파일을 전송 - 추후 사용 

그리고 data라는 폴더를 만들어주세요

파일/폴더 구조

 

이미지 빌드 with Dockerfile

도커는 컨테이너가 구동되기 위한 정보를 이미지로 만듭니다. 저희는 dockerfile을 작성하여 이미지를 만드는 방식으로 하겠습니다.

 

dockerfile이라는 파일을 만들어주세요

dockerfile

만약 vscode일 경우 Docker Extension을 설치하라고 하는데 설치하시면 됩니다
FROM node:6.2.2
RUN mkdir /source
WORKDIR /source
ADD . /source

RUN npm install

EXPOSE 3000

CMD node app.js

위와 같이 작성합니다. 

 

FROM
기본이 될 base image를 지정합니다.

RUN
명령어를 실행합니다

WORKDIR
작업할 디렉터리를 설정합니다

ADD
호스트의 파일, 디렉토리를 도커 이미지로 추가합니다. 하지만 현재 폴더의 외부의 파일, 디렉터리는 추가가 불가능하며 압축파일의 경우 자동으로 압축을 풀어줍니다.

EXPOSE
통신할 포트를 설정합니다.

CMD
컨테이너가 만들어질 때 실행합니다

저렇게 dockerfile 작성한 후 이 파일을 토대로 이미지를 만들어줍니다.

 

$ docker build -t test/app .

docker build -t <repository>/<image name> .

 

여기서 -t(--tage) 옵션으로 이미지의 이름과 태그를 설정할 수 있습니다. 태그를 따로 설정하지 않는다면 latest로 설정됩니다.

 

컨테이너 만들기

컨테이너를 만들기 위한 명령어는 아래와 같습니다.

$ docker run -d -p 3000:3000 test/app

옵션 -d는 detached mode로 백그라운드 실행을 말합니다. -p는 외부 포트와 연결합니다.

 

이후 http://localhost:3000으로 접속하여 잘 실행되었는지 확인합니다

 

볼륨

위의 코드에서 /create-file 후 /file을 접속한다면 잘 실행될 것입니다. 하지만 만약 수정 사항으로 이미지를 다시 빌드하여 컨테이너를 다시 만든다면 기존의 data/text.txt는 유지될까요?

 

당연하게 안될 것입니다.

왜냐하면 컨테이너가 지워지며 같이 지워졌을 것이고 새로운 컨테이너에서는 아직 파일이 생성되지 않았습니다. 그 상태로 /file을 접속한다면 아래와 같은 오류 메시지를 볼 수 있습니다.

오류..

이런 일을 해결하기 위해 호스트와 도커 컨테이너 내부의 디렉터리를 연결할 수 있습니다. 

$ docker run -d -p 3000:3000 -v <host_dir>:/source/data test/app

-v 옵션을 통해 볼륨을 설정할 수 있습니다. <host_dir>에 호스트의 경로를 작성 후 마운트 시킬 컨테이너 경로를 적어줍니다. 이렇게 된다면 컨테이너를 삭제 후 다시 만들어도 파일이 유지됩니다.

 


참고 문서

http://pyrasis.com/Docker/Docker-HOWTO

https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html

https://rampart81.github.io/post/dockerfile_instructions/

'개발' 카테고리의 다른 글

Dtil, 자바스크립트 Date 패키지  (0) 2021.01.07
Git-flow를 사용한 프로젝트 관리  (0) 2020.12.02
웹과 인터넷, 차이점  (0) 2020.06.21
HTTP란?  (0) 2020.06.21
컴파일과 빌드 (feat. Gradle)  (0) 2020.06.21