도커 - 간단한 배포 개발 환경 세팅
in Docker
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
- 개발환경에서 개발 서버와 연결되있는 파일들은 public에 있는 것들
- 운영환경에서 Nginx와 연결되있는 파일들은 build에 있는 것들
- Dockerfile을 보면 CMD까지가 build 파일을 만들기 위한 작업
- 아래부터는 Nginx를 시작하여 빌드파일을 이용해서 웹브라우저에서 요청이 올때 알맞게 제공
운영환경을 정리하자면 다음과 같다.
- Builder Stage : 빌드 파일들을 생성
- 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번으로 포트 매핑한다는 의미