docker 도입기 (1): Dockerfile 및 docker-compose.yml 작성하기

동화·2023년 3월 17일
0

docker

목록 보기
1/1
post-thumbnail

문제 상황

  • kiosk와 유사한 프로젝트를 운영하고 있는데, 기존 방식은 해당 프로젝트를 실행할 pc에 ssh로 접속하여 git clonecd (dir)npm installnpm start 과정을 거치고 있었음
  • 해당 작업을 sw 지식이 전무한 현장 대응 요원이 수행했기 때문에 각 명령어의 의미를 이해하지 못해 human error가 빈번하게 발생
  • 추가적으로 node로 개발한 가벼운 backend 서버가 붙게 되면서 cd (dir)npm installnpm start의 과정이 한번 추가되어 human error의 발생 빈도 증가
  • 기존엔 vue 기반으로 개발하다가 react 기반으로 개발하게 되었는데, 이 때문에 기기마다 설치되어있고 활성화 되어있는 node 버전이 다른 문제가 있었다.
    이로 인해 package 설치 시 오류가 발생하는 경우가 있었는데, 빈번하게 발생하는 문제가 아니었기 때문에 오류가 났을때 node 버전 때문이라고 파악도 어려웠다.

docker를 선택한 이유

docker를 기존에 실무에서 사용해본 경험은 없고, 실무와 비슷한 환경을 임의로 구성하여 사용해본 경험이 있었다.
docker를 사용해야겠다고 생각한 이유는

  • Dockerfile을 사용하면 입력해야 하는 명령어를 하나로 줄일 수 있으며, docker가 명령어를 순차적으로 수행하기 때문에 human error 발생 확률이 크게 줄어들 것으로 예상
  • docker-compose.yml 을 사용하면 backend 서버까지 명령어 한 줄으로 수행할 수 있음 (backend 서버와 frontend 서버를 순차적으로 실행시켜야 하는데 depends_on을 사용하면 순서가 보장된다는 점도 좋았음)
  • node 버전 또한 로컬에 귀속되는 것이 아니고 Dockerfile에 적혀있는 버전으로 고정되기 때문에 node 버전이 틀릴 위험도 없음

실제 사용 과정

🔴 주의! docker를 처음 사용해보는 초보가 작성한 파일과 파일구조입니다. 틀린 부분이나 더 좋은 방법이 있을(많을) 수 있습니다.

파일구조는 프로젝트 안에 node로 작성한 backend 프로젝트와 react를 사용한 frontend 프로젝트가 있다.
각각의 Dockerfile을 가지고 있으며, 프로젝트의 루트 디렉토리에 docker-compose.yml이 위치하도록 했다.

작성된 코드는 다음과 같다.

node 버전은 기존에 사용하던 16의 LTS버전 중에 많은 개발자들에게 선호되는 버전을 선택했다.
각 파일을 아래와 같이 작성하고 프로젝트의 루트 디렉토리에서 docker-compose up -d를 입력하면 프로젝트가 실행된다.

#frontend/Dockerfile

FROM node:16.19.1
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .

EXPOSE 3000
CMD ["npm", "start"]
#backend/Dockerfile

FROM node:16.19.1
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .

EXPOSE 4000
CMD ["npm", "start"]
#/docker-compose.yml

version: '3'

services:
  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    volumes:
      - './frontend:/app'
      - '/app/node_modules'
    ports:
      - '3000:3000'
    depends_on:
      - backend

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - '4000:4000'
    volumes:
      - './backend:/app'
      - '/app/node_modules'

문제점

frontend 디렉토리와 backend 디렉토리에는 각자의 .env 파일이 있는데 기존에는 이 파일들을 cd frontendvi .env 해서 직접 작성해줬었는데 docker 컨테이너를 실행시키고 나서는 어떻게 작성 해야할 지를 모르겠는 문제가 있었다.
(사실 글을 작성하는 이 시점에서 생각하기로는 docker-compose up -d 전에 각 디렉토리로 이동해서 vi .env로 작성한 후 하면 되는거였구나 생각이 들긴 하지만)

열심히 찾아본 바로는
1. --env-file 옵션으로 설정 파일을 지정
2. docker-compose.ymlenv_file 선언하기
두 방식이 있었고, 나는 현장 대응 요원들이 사용해야 하는 명령어이므로 최대한 간결했으면 해서 2번 방식을 사용했다.

해결 과정

docker-compose.yml 파일에

env_file:
 - (project_name).env

를 추가해준 후 docker-compose.yml과 같은 디렉토리에 frontend.env 파일과 backend.env 파일을 생성해줌으로써 해결

결과

docker-compose up -d만으로 전체 프로젝트를 순차적으로 실행시킬 수 있게 되어 human error가 감소함

마무리

전 회사 책임님이 타사에서 MLops를 하고 계셔서 .env 파일을 어떻게 관리하는지 물어봤는데 gitlab의 CI/CD 툴에 등록해놓고 쓴다고 하셨다.
기회가 된다면 이 방식으로 개선해보고 싶다. 🧚

0개의 댓글