Etc

TIL | Docker CRA Dockerizing, 컨테이너 생성

Docker CRA Dockerizing, 컨테이너 생성

프로젝트 root 경로에 Dockerfile, Dockerignore 파일 설정하기

1. Dockerfile

# node 베이스 이미지(v17이 최신 버전이고 v16이 LTS 버전인데, 17로 사용할 경우 오류가 발생하므로 v16.x로 이용하자 )
FROM node:16-alpine3.13

# 임시 컨테이너 내에 파일들이 위치할 디렉토리(WORKDIR을 설정하지 않아도 라이징은 가능하지만, 기존에 존재하던 파일을 오버라이딩하거나 디렉토리의 구조가 깔끔하지 않을 수 있기 때문에 지정해주는 것이 좋다.)
WORKDIR /src/app

# 임시 컨테이너 안에는 package.json 파일이 없기 때문에 이후에 실행될 RUN yarn가 정상적으로 제기능을 하지 못한다. 때문에 package.json 파일을 컨테이너 안으로 복사하자.
# COPY '복사할 파일' '임시 컨테이너 내 복사하게 될 경로'
COPY package.json ./

# RUN은 docker image가 생성되기 전에 수행할 쉘 명렁어이다. 임시 컨테이너로 복사된 package.json의 종속성 모듈을 다운받도록 하자.
RUN yarn

# 프로젝트 경로에 있는 파일들을 컨테이너에 복사한다.(package.json 파일과 따로 copy를 해주는 이유는, build시 생기는 리드타임을 최소화시키기 위함이다.)
COPY ./ ./

# 컨테이너가 시작될 때 수행할 커맨드들을 지정하자.
CMD ["yarn", "start"]

2. .dockerignore

# node_modules 파일들은 위 dockerfile의 RUN yarn 과정에서 설치가 되기 때문에 로컬에서 복사가 될 필요가 없으므로 .dockerignore을 통해 제외시켜주도록 하자. (그대로 이미지를 생성하게 되면, dockerizing 속도도 느릴 뿐더러 파일 크기가 매우 무거워지게 된다.)

node_modules

3. 프로젝트 root directory

├── README.md
├── dockerfile.dev
├── package.json
├── public
├── src
├── tsconfig.json
└── yarn.lock
  • dockerfiledockerfile.dev로 해준 이유는, devprod의 환경이 다를 수 있기 때문에 따로 지정해주는 것이 좋다.

Docker image 생성

sudo docker build -f dockerfile.dev -t docker_cra ./
  • Dockerizing의 기준은 default로 dockerfile이 되지만, dockerfile.dev 기준으로 image를 생성해야 하므로 -f dockerfile.dev를 추가해준다.
  • 위와 같이 image 생성에 성공하였다.

Docker run image

sudo docker run --name port_test3 -p 3000:3000 docker_cra
  • 생성된 docker image의 run을 통해 container를 생성한다.
  • -p 3000:3000: local3000 포트와 실행중인 컨테이너의 포트(yarn start을 통해 실행된 dev local port3000이다.)를 연결한다. 이를 포트 포워딩 또는 포트 매팽이라고 한다.

Reference

docker docs