도커 - 간단한 배포 개발 환경 세팅

1. Dockerfile 분류


  • Dockerfile은 개발단계를 위한 것과 실제 배포 후를 위한 것을 따로 작성하는게 좋다.
  • 관행적으로 개발환경을 위한 도커파일명은 Dockerfile.dev 로 작성한다.
  • 개발은 Dockerfile.dev 운영은 Dockerfile이라고 보면 된다.


이미지 만들기

docker build -f Dockerfile.dev .

dockerfile.dev 인 경우 일반적인 방식으로는 이미지를 만들지 못하고 옵션을 추가해야 한다.

2. docker compose로 run 설정하기


docker compose를 이용하면 run에 이것저것 옵션으로 길게 붙여야 했던 것을 깔끔하게 정리할 수 있다.

# docker-compose.yml

version: "3"
services:
  react:
    build: 
      context: .
      dockerfile: Dockerfile.dev
    ports:
     - "3000:3000"
    volumes:
     - /usr/src/app/node_modules
     - ./:/usr/src/app
    stdin_open: true
  • version : 도커 컴포즈 버전
  • services : 이곳에서 실행하려는 컨테이너들을 정의 시작
  • react : 컨테이너 이름
  • build : Dockerfile 관련 설정 시작
  • context : Dockerfile 위치
  • dockerfile : 도커 파일명 지정
  • ports : 포트 맵핑, 로컬 포트 : 컨테이너 포트
  • volumes : 로컬에 있는 파일들 맵핑
    • :가 없으면 해당 파일은 맵핑 안한다는 뜻
    • :가 있으면 매핑한다는 뜻
  • stdin_open : 리액트 앱을 끌때 필요(버그 수정)


3. 도커 컴포즈에 test 설정 추가


 docker-compose.yml

version: "3"
services:
  react:
    build: 
      context: .
      dockerfile: Dockerfile.dev
    ports:
     - "3000:3000"
    volumes:
     - /usr/src/app/node_modules
     - ./:/usr/src/app
    stdin_open: true
  tests:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - /usr/src/app/node_modules
      - ./:/usr/src/app
    command: ["npm", "run", "test"]   
  • 기존 docker compose 내용에서 tests 관련 내용 추가


4. 운영환경을 위한 Nginx


그림1 그림2

  • 개발환경에서 개발 서버와 연결되있는 파일들은 public에 있는 것들
  • 운영환경에서 Nginx와 연결되있는 파일들은 build에 있는 것들


그림3

  • Dockerfile을 보면 CMD까지가 build 파일을 만들기 위한 작업
  • 아래부터는 Nginx를 시작하여 빌드파일을 이용해서 웹브라우저에서 요청이 올때 알맞게 제공

운영환경을 정리하자면 다음과 같다.

  1. Builder Stage : 빌드 파일들을 생성
  2. Run Stage : Nginx를 가동하고 첫번째 단계에서 생성된 빌드폴더의 파일들을 웹 브라우저의 요청에 따라 제공


dockerfile 작성

FROM node:alpine as builder
WORKDIR '/usr/src/app'
COPY package.json .
RUN npm install
COPY ./ ./
RUN npm run build

FROM nginx
EXPOSE 80
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
  • as builder : 해당 from 부터 다음 from 전까지는 모두 builder stage라는 것을 명시
    • 빌드 파일을 생성하는 것이 목적
    • /usr/src/app/build로 생성된 파일과 폴더들이 들어감
  • COPY
    • –from= : 다른 stage에 있는 파일을 복사할때 다른 Stage 이름 명시
    • /user/src/app/build에 생성된 파일들을 /user/share/nginx/html 로 복사
    • 해당 장소로 복사하는 이유는 Nginx의 설정
  • EXPOSE : Nginx를 외부 80번으로 포트 매핑한다는 의미



본 포스팅은 인프런 John Ahn님의 ‘따라하며 배우는 도커와 CI환경’ 강의를 듣고 정리한 내용을 바탕으로 복습을 위해 작성하였습니다. [강의 링크]


© 2021. By Backtony