Express Server Docker 적용기 (ft. Typescript)

Soobeen Yoon·2022년 11월 20일
0

컨테이너

각각의 어플리케이션을 고립된 환경에서 구동할 수 있게 해줌

VM은 운영체제를 포함하고, 컨테이너는 운영체제를 포함하지 않고 컨테이너 엔진이 설치된 HOST OS를 공유한다. 이로 인해, 컨테이너는 VM에 비해 용량이 적다!

컨테이너가 구동되기 위해서는 container Engine이 필요한데, 이러한 컨테이너 엔진 중에 가장 많이 쓰이는 것은 도커이다.

Docker Engine

1. 도커파일

dependency, 환경변수 등 포함

2. 도커 이미지

  • Application을 실행하는 데 필요한 코드, 런타임 환경 등 모든 세팅이 들어있음. 실행되고 있는 application의 상태를 snapshot (변경 불가능)

  • 이미지는 캡쳐 당시 프로젝트 상태를 가짐 (불변)

3. 컨테이너

image를 고립된 환경에서 동작하게 함

이미지 = class

컨테이너 = 인스턴스

직접 적용해보기

docker desktop 설치

https://www.docker.com/

간단한 서버 만들기

ReferenceError: exports is not defined in ES module scope

(node:20157) ExperimentalWarning: Custom ESM Loaders is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
ReferenceError: exports is not defined in ES module scope
  • tsconfig.json 파일의 module을 변경해줌
"module": "es2015",

Dockerfile 만들기

Dockerfile에 어떤 이미지를 만들지 정의한다.

1.FROM + base Image

  • 어떤 베이스 이미지를 사용할 것인지
  • 기본적으로는 순수한 리눅스 베이스 이미지를 사용하기도 하지만, node는 여기에 버전을 명시할 수 있다.
  • alpine: 최소 단위의 리눅스

2. WORKDIR

  • 컨테이너 안에서 어떤 경로의 파일을 실행할 것인지 명시
  • image file 안에 어떤 디렉토리에 application file 복사할지 설정하는 것!

3. COPY: 빈번히 변경될 파일일수록 맨 밑에 쓰면 좋다.

  • 프로젝트 파일들을 복사할 때는 빈번히 변경될 파일일수록 맨 밑에 쓰면 좋다.(layer system으로 구성되어 있기 때문)
  • 변경된 최상단의 레이어만 업데이트 가능하기 때문. 변경이 되지 않은 파일들은 캐시로 저장하여 재사용하고, 변경된 파일부터 그 위에 있는 레이어만 업데이트함.
  • ex. 소스파일은 package.json보다 자주 변경될 것임
    - package.json > 소스파일 순서로 작성함

4. RUN

  • 버전 문제를 막기 위해 npm을 사용한다면 npm ci를, yarn을 사용한다면 yarn install --immutable --immutable-cache --check-cache을 사용한다.

5. COPY

  • 소스 파일 copy

6. ENTRYPOINT

  • 실행할 파일 지정
  • ENTRYPOINT [ "yarn", "start"]

build Docker file

docker build -f Dockerfile -t [이름] .

  • 다시 빌드하면 캐시된 파일을 사용하여 속도가 훨씬 빨라진다!

Docker Container 실행

docker run -d -p 8080:8080 [이름]

  • -p: host 머신-컨테이너 포트 연결함!

  • 빌드가 완료되면 docker ps 명령어를 실행하여 빌드된 어플리케이션이 뜬 것을 확인할 수 있다.

  • localhost에서 확인하면 빌드 성공!

  • docker logs -t [hash번호] : 로그 확인

docker image 배포

1. 도커 허브 가입 및 레포지토리 생성

2. tag 이름 repository와 일치하게 변경

docker tag [application이름] [계정/repository이름]

3. docker push

docker push [계정/repository이름]

결과

github 주소

https://github.com/kumsil1006/practice-ci-cd/tree/10-docker-%EC%84%A4%EC%A0%95

참고 자료

https://www.youtube.com/watch?v=LXJhA3VWXFA&t=125s
https://velog.io/@qhgus/Node-Express-TypeScript-%ED%99%98%EA%B2%BD-%EC%84%B8%ED%8C%85
https://duck-blog.vercel.app/blog/web/npm-ci-do-how-about-yarn

문제 있을 시 댓글 부탁드립니다!

profile
클린코드, 자동화에 관심이 많은 FE 개발자입니다.

0개의 댓글