항해 99

항해 99 5기 TIL_92

Dream Herb 2022. 4. 13. 10:21

▶ Today I Learned

 

<실전 프로젝트 - 도커>

 

우리 프로젝트에 적용된 도커를 하나씩 뜯어보며 공부해보자.

 

.dockerignore:

docker 이미지를 빌드할 때 제외할 파일을 정해준다.

 

현재 우리는 아래와 같이 노드의 모듈들과 .gitignore 파일은 올라가지 않도록 하고 있다.

# Dependency directories
node_modules/

.gitignore

 

Dockerfile.dev:

 

도커 공식문서에 보면 아래와 같은 문구가 있다.

 

In order to build the application, we need to use a Dockerfile. A Dockerfile is simply a text-based script of instructions that is used to create a container image.

즉, 도커 파일은 컨테이너 이미지를 만드는 데 사용되는 텍스트로 된 지침서이다.

참조: https://docs.docker.com/get-started/02_our_app/

 

현재 우리의 프로젝트에 쓰인 코드는 아래와 같다.

 

# 노드를 베이스로 생성
FROM node:16.13.1

# app 디렉토리 , working 디렉토리 생성
RUN npm install -g nodemon
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install dependencies
COPY package*.json ./
RUN npm install

# Bundle app source
COPY . .

# Set env
# RUN /usr/src/app -c ".env"

# RUN npm install -dev sequelize-cli
# RUN npx sequelize db:create
# RUN npx sequelize db:seed:all

# Exports
EXPOSE 80

CMD ["npm", "run", "dev"]

 

FROM: 베이스 이미지를 명시해주는 곳이다. 앞으로의 빌드를 어떤 이미지로 시작할지 나타낸다.

도커파일은 기본적으로 FROM이 가장 앞서야하지만 간혹 ARG가 FROM보다 앞서는 경우가 있다고 공식문서에 나온다.

 

RUN: RUN에는 기본적으로 두 가지 폼이 있다고 한다.

RUN <command>

RUN ["executable", "param1", "param2"] // execform이라고 불리는 형태이다.

 

이 중 우리 프로젝트에서 사용된 것은 command 형태이다.

컨테이너에 노드16.13.1버전을 넣고 nodemon을 설치하여 코드 수정이 일어나도 바로 서버가 돌아가게끔 한다.

또한 -p /usr/src/app라는 경로도 만들어준다.

 

cf) 참고로 알아둘 것은 명령어를 실행할 때 마다 레이어가 생긴다는 것이다.

 

The RUN instruction will execute any commands in a new layer on top of the current image and commit the results. The resulting committed image will be used for the next step in the Dockerfile.

Layering RUN instructions and generating commits conforms to the core concepts of Docker where commits are cheap and containers can be created from any point in an image’s history, much like source control.

풀어쓰자면, RUN command는 실행될 때 마다 현재 이미지 상에서 새로운 레이어를 만들어 레이어 하나당 명령어를 하나씩 수행하고 그 결과를 커밋한다. 또 커밋된 이미지는 도커 파일에서 다음 단계를 위해 사용된다.

이를 통해 우리는 이미지 히스토리에서 어떠한 커밋 지점이든 찾아서 특정 지점의 컨테이너를 만들어낼 수 있게되는 것이다.

 

WORKDIR: Dockerfile에서 RUN, CMD, ENTRYPOINT, COPY, ADD라는 명령어들의 작업 경로를 지정해주는 것,

WORKDIR를 사용하지 않는다면 그 다음 도커파일 instruction에서 사용되지 않더라도 자동적으로 만들어진다.

또한 경로를 별도로 설정하지 않으면 기본 경로는 / 가 된다. 의도치않은 경로로 설정되는 것을 원치 않을 테니

보통은 명시적으로 지정해주는 것이 좋다.

 

COPY: 

이 역시 두가지 형태가 있다.

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

 

이 중 우리는 전자에 해당한다.

 

공식문서에 이런 문구가 있다.

The  is an absolute path, or a path relative to WORKDIR, into which the source will be copied inside the destination container.

우리의 경우 Install dependency 주석을 보면 package로 시작하고 확장자가 .json인 파일 모두를 절대 경로에 있는 컨테이너 파일시스템들에 붙여넣어주고 있다.

 

COPY . . 부분은 Docker 이미지 안에 앱의 소스코드를 넣기 위해 COPY 지시어를 사용하는 부분이다.

 

그 다음은 env를 세팅하여 환경변수를 설정해주는 작업, seed 파일을 넣어주는 작업에 쓰이는 코드들이고 이들은 사용할 때를 제외하곤

주석처리를 해놓았다.

 

EXPOSE:

어떤 포트를 이용할 건지 명시해주는 부분이다. 포트 번호 뒤에 별도로 명시하지 않는다면 기본적으로 TCP와 UDP중에 TCP로 설정된다.

또한 EXPOSE를 썼다고 해서 그 포트로 실제 배포가 되는 것은 아니고 EXPOSE는 그저 어떤 포트로 배포될지 지정해주는 역할이다.

우리의 경우 http의 기본포트인 80번을 사용하였다.

 

CMD:

CMD는 Dockerfile마다 한 가지 씩만 사용가능하며 여러 개를 쓸 경우 가장 마지막에 나온 것이 이용된다.

모든 설정들이 끝난 다음 npm run dev가 실행되도록 한다.

 

▶ 느낀 점

 

도커를 도입한 이유는 인스턴스를 새로 만들 때 마다 여러 명령어들을 직접입력하여 환경을 맞춰주는 수고를 덜기 위해서이다.

로컬과 배포 서버 간 노드 버전의 차이 때문에 모듈 인스톨이 제대로 되지 않아 서버 실행에 차질이 있기도 했기 때문이다.

우리 팀에서 사용한 도커 파일을 하나씩 뜯어보며 도커의 구성에 대하여 공부하였다.

하지만 실제 사용 경험은 아직 없기에 도커에 대해 좀 더 공부하고 활용해보는 것이 필요하다.

 

▶ 공부 시 참고 링크들

도커를 다룬 팀원의 게시물 1

https://l-0-l.tistory.com/59?category=991909 

 

프로젝트에 도커 도입

1. .dockerignore 파일 docker 이미지를 빌드할 때 제외할 파일을 정해준다. # Logs logs *.log npm-debug.log* # Dependency directories node_modules/ # dotenv environment variable files .env .gitignore 2..

l-0-l.tistory.com

 

도커를 다룬 팀원의 게시물 2

https://l-0-l.tistory.com/60?category=991909 

 

DOCKER, TRAVIS CI, GITHUB 연결 (1)

프로젝트를 도커로 띄우는 데 성공했다. 이제는 travis CI를 이용해 git push 할 때마다 docker image를 새로 띄우는 작업을 자동화 했으면 좋겠다. 내가 원하는 프로세스는 travis CI가 push를 인식 -> 테스

l-0-l.tistory.com

 

도커 파일에 쓰이는 각종 명령어들이 수록된 공식 문서

https://docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com

 

node.js와 도커라이징에 관한 문서

https://nodejs.org/ko/docs/guides/nodejs-docker-webapp/

 

Node.js 웹 앱의 도커라이징 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org