반응형

본 내용은 인프런의 데브위키님의 강의 "개발자를 위한 쉬운 도커" 내용을 바탕으로 정리한 내용입니다.

기존 방식의 문제점

  • Nginx 서버 설정에 백엔드 애플리케이션의 주소가 고정되어 있는데 환경 별로 Nginx가 프록시 해야 하는 주소가 바뀔 수 있다.
  • 프록시 설정의 주소를 바꾸기 위해 이미지 빌드를 다시 해야 한다.

환경 변수를 활용한 동적 서버 설정

  • 환경 별로 달라지는 정보는 시스템 환경 변수로 처리하면 컨테이너 실행 시 결정할 수 있다.
  • 더 유연한 애플리케이션 이미지를 설계할 수 있다.

그림 1) 환경변수를 활용한 Nginx 프록시 설정


 

예시 1) leafy-frontend 도커파일 수정 및 캐싱 테스트

# 1. easydocker/leafy/leafy-frontend 디렉터리 이동 및 소스코드 상태 변경
git reset --hard HEAD && git clean -fd
git switch 03-proxy
# 또는 git switch 04-dynamicconfig

 

예시 2) easydocker/leafy/leafy-frontend/nginx.conf 파일수정

server {
    listen 80;
    server_name localhost;
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
    location /api/ {
        # 웹서버로오는요청중 /api/로시작하는경로의요청을 해당 환경변수 url로 전달
        proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT};  
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

 

예시 3) easydocker/leafy/leafy-frontend/Dockerfile 수정

FROM node:14 AS build
WORKDIR /app
COPY package.json .
COPY package-lock.json .
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:1.21.4-alpine
# 소스코드의 nginx.conf 파일을 template 파일로 복사 기본 환경 변수 지정
COPY nginx.conf /etc/nginx/conf.d/default.conf.template 

# 기본 환경 변수 지정
ENV BACKEND_HOST leafy
ENV BACKEND_PORT 8080

# 컨테이너 실행시자동으로 실행될 스크립트 지정
# 파일 복사
COPY docker-entrypoint.sh /usr/local/bin/
# docker-entrypoint.sh을 실행할 수 있는 권한 부여
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80

# 컨테이너 실행시 자동으로 실행될 스크립트 지정
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

 

예시 4) easydocker/leafy/leafy-frontend/docker-entrypoint.sh 생성

#!/bin/sh
# 오류 발생시 스크립트 중지
set -e
# default.conf.template 파일에서 환경 변수를 대체하고 결과를 default.conf에 저장
envsubst '${BACKEND_HOST} ${BACKEND_PORT}' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf
# < 템플릿 파일과 환경 변수를 읽은 뒤 nginx.conf 파일을 구성하여 nginx 설정으로 복사

# 다음 명령어를 실행
exec "$@"

 

예시 5) leafy-frontend 이미지 빌드 및 애플리케이션 구동 테스트

# 1. 이미지 빌드
docker build -t leafy-front:4.0.0-env .

# 2. network가 제대로 생성되어 있는지 확인
docker network create leafy-network

# 3. 애플리케이션 구동 및 테스트, 백엔드 애플리케이션의 접속 도메인 변경
# localhost:80 접속하여 정상 접속 확인
docker run -d --name leafy-postgres -v mydata://var/lib/postgresql/data --network leafy-network devwikirepo/leafy-postgres:1.0.0

# 컨테이너 명을 leafy > leafy-backend로 수정함
docker run -d -e DB_URL=leafy-postgres --name leafy-backend --network leafy-network devwikirepo/leafy-backend:1.0.0

# leafy-frontend 컨테이너 실행 및 BACKEND_HOST를 leafy-backend로 지정
docker run -d -e BACKEND_HOST=leafy-backend -p 80:80 --name leafy-front --network leafy-network leafy-front:4.0.0-env

# 4. 설정 파일에 환경 변수가 적용되었는지 확인
docker exec leafy-front cat etc/nginx/conf.d/default.conf

# 5. 환경 정리
docker rm -f leafy-postgres leafy-backend leafy-front
반응형

+ Recent posts