Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

ssuperjun 님의 블로그

[과제6-7] 발표자료 최종 - 도커를 이용한 DB 운영툴 환경 구축 자동화 본문

인턴

[과제6-7] 발표자료 최종 - 도커를 이용한 DB 운영툴 환경 구축 자동화

ssuperjun 2026. 2. 6. 18:11

프로젝트 기간: 2주(실제 소요 기간 8일)

개인 프로젝트로 진행, 최종 발표 3일 전 멘토님 피드백 반영

[1] 프로젝트 배경 및 목적

 

  • 회사 인프라는 각기 다른 망에 구축됨
  • 분리된 수많은 망에 DB 운영 환경 구축 필요
  • 하지만 망 별 설치 과정이 어렵고 복잡

 

=> 도커 사용해 문제 해결

 

목표: 수백 개의 망에 쉽고 빠르게 DB 운영 환경 구축

(mymon-web 패키징 중점)

[2] 시연

새로 만든 인스턴스에 접속해

 

  • docker image 다운로드(scp로 파일 복사 또는 docker pull)
  • env파일 수정
  • ./start-mymon-web.sh

 

이후 크롬에서 http://새인스턴스IP:15361 입력해 웹 확인

3가지 명령만으로 mymon dev환경 세팅 완료

 

[3] 도커 도입 이유

 

  • 도커 이미지 파일 = 프로그램을 실행하는 데 필요한 모든 파일을 포함
  • 빌드로 이미지 만들고, 다른 환경에서 이미지 실행하면 배포 완료
  • 각기 다른 환경에 빠르게 배포, 일관성 있는 동작이 큰 장점

 

[4] 각기 다른 환경에 DB 운영 환경을 구축할 때 고려할 부분

[4-1] .env파일에서 신경쓸 부분

DB config 부분

 

  • 각 환경마다 접속할 DB 정보가 다 다르기 때문
  • 각 환경에 맞춰 env 파일의 DB 정보를 수정하면 됨

 

[.env 코드 일부분]

# ========================
# main/config/settings/settings.py
# MYMON
DB_DEFAULT_ENGINE=django.db.backends.mysql
DB_DEFAULT_NAME=MYMON
DB_DEFAULT_USER=admin_2026
DB_DEFAULT_PASSWORD=생략
DB_DEFAULT_HOST=생략
DB_DEFAULT_PORT=13306

# Log DB
DB_LOG_ENGINE=django.db.backends.mysql
DB_LOG_NAME=log
DB_LOG_USER=django
DB_LOG_PASSWORD=생략
DB_LOG_HOST=10.x.x.x
DB_LOG_PORT=13306

 

 

  • 여기 저장한 환경변수는 백엔드의 settings.py가 읽어 감

 

settings.py의 역할

사용자가 process list 탭을 보려면 백엔드에서 다음과 같은 흐름으로 동작한다.

 

[사용자]
  ↓ (http://ip주소:18080-process-list 웹 화면에서 호스트명 선택 -> 검색 요청)
[ProcessList.vue]
  ↓ (HTTP 요청)
[백엔드 API: VUE_APP_API_PROC_BASE_URL/get_processList/]
  ↓ (사용자가 선택한 호스트명을 기반으로 DB 정보 조회)
[main/urls.py]
  ↓ (라우팅: /get_processList/ 엔드포인트(API 호출을 위한 전화번호)는 main/urls.py에서 main/view/db/Monitoring/process_list_view.py의 함수와 연결되도록 정의되어 있다.)
[main/view/db/Monitoring/process_list_view.py]
  ↓ (SQL 쿼리 생성 및 실행)
[logdb 데이터베이스]
  ↓ (결과 반환)
[ProcessList.vue]
  ↓ (데이터 테이블 렌더링)
[사용자]

 

process list 웹을 구현하는 백엔드 파일(process_list_view.py)이 SQL 쿼리를 실행할 때

정확한 DB 접속 정보를 지정해줘야 웹에 오류 없이 결과가 반환될 수 있다.

 


DB 환경변수 외 환경변수

 

  • 각 환경에 맞게 변경하면 됨

 

구현 사항

 

  • env파일에 각 환경변수의 용도, 환경변수를 어느 파일에서 읽어 가는 지 주석 처리
  • 다양한 DB 운영 환경 구축 시 env파일 수정 용이

 

[.env 코드 일부분]

# vue.config.js
# 배포용 publicPath (정적 파일 경로)
VUE_PROD_PUBLIC_PATH=/static/dist/

# ========================
# manage.py
# Django settings module 
DJANGO_SETTINGS_MODULE=main.config.settings.debug

[5] 프로젝트 실제 사용 가이드

[5-1] docker 관련 파일 설명

Dockerfile은 mymon-web-docker/ 안에 위치시켜야 함

/home1/irteam/mymon-web-docker/
├── Dockerfile
├── entrypoint.sh
├── .env.client # (프론트엔드용 환경변수)
├── manage.py # Django 실행 시 참조
├── package.json # npm install(프론트엔드 의존성 설치) 시 참조
├── client/
├── main/
└── ...

 

Dockerfile 내용: 필수 패키지 설치, mymon-web 디렉토리 전체 가져오기, entrypoint 실행

FROM ubuntu:22.04

# 환경변수 및 기본 설정
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul

# 기본 패키지 설치 전: PPA 등록 먼저
RUN apt update && apt install -y software-properties-common

# Python 3.9 설치를 위한 PPA 추가
RUN add-apt-repository -y ppa:deadsnakes/ppa && apt update

# 나머지 패키지 설치
RUN apt install -y \
    curl \
    gnupg \
    lsb-release \
    default-libmysqlclient-dev \
    build-essential \
    python3.9 \
    python3.9-venv \
    python3.9-dev \
    git

# Node.js 16 설치
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
    apt install -y nodejs

# 작업 디렉토리 설정
WORKDIR /home/mymon-web-docker

# 프로젝트 복사 (node_modules, venv 등은 .dockerignore로 제외)
COPY . .

# 로그 디렉토리 및 파일 생성
RUN mkdir -p log && touch log/mymon.log

# Python 가상환경 생성 및 활성화
RUN python3.9 -m venv venv

# uv 설치 및 Python 의존성 설치
RUN bash -c "source venv/bin/activate && \
    curl -Ls https://astral.sh/uv/install.sh | bash && \
    export PATH=$HOME/.local/bin:$PATH && \
    uv pip install -r requirements.txt"

# 프론트엔드 의존성 설치
RUN npm install && npm install dotenv-flow

# 포트 개방
EXPOSE 18080 15361

# 엔트리포인트 스크립트 복사
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# 시작 명령
CMD ["/entrypoint.sh"]

[5-2] 실행 방법

1. 도커 빌드

  • Vue 정적 파일 빌드, Django 백엔드 실행
docker build -t mymon-web-image .

 

2. docker image 저장소에 push

3. 새로운 환경에서 docker image pull

4. docker run으로 컨테이너를 실행

docker run -it --env-file .env -p 15361:15361 --name mymon-web-prod mymon-web-image

[6] 고도화

[6-1] user script로 명령어 단순화(docker 설치, env파일 생성, docker 컨테이너 실행)

  • user script를 사용해 새로운 환경에서 2-3줄 명령으로 mymon-web 환경이 구축

user-script 코드

#!/bin/bash
# ========== Ubuntu EC2 초기 설정 ==========

# 1. Docker 설치
apt-get update -y
# 중략
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 2. Docker를 sudo 없이 사용하도록 설정
usermod -aG docker ubuntu

# 3. start-mymon-web.sh 스크립트 생성 (컨테이너 실행용)
cat << 'EOF' > /home/ubuntu/start-mymon-web.sh
#!/bin/bash

echo "Docker 이미지 로드 중..."
docker load -i ./mymon-web-image.tar
# 중략

# 4. .env 파일 예시로 생성(보안상 민감한 정보는 user script에 넣지 않음)
cat << 'EOF' > /home/ubuntu/.env
# 중략

# 5. 안내 메시지 작성
cat << 'EOF' > /home/ubuntu/README_ENV.txt
============================================================
Docker 설치 및 환경 준비 완료!

.env 파일은 /home/ubuntu/.env 에 저장되어 있습니다.
환경 설정이 변경되면 이 파일을 vi로 수정하세요.

Docker 이미지 파일(mymon-web-image.tar)을 아래 경로에 업로드하세요:
  /home/ubuntu/

컨테이너를 실행하려면 다음 명령어를 입력하세요:

  cd /home/ubuntu
  ./start-mymon-web.sh

============================================================

 

[6-2] 빌드한 docker image를 윈도우(amd64 아키텍처)에도, 맥os(arm64 아키텍처)에도 배포해야 하는 상황에서 작업 간편화

[6-2-1] 실제 환경에서의 docker image 저장소 활용 방식

1. 멀티 아키텍처 이미지 생성

docker buildx build --platform linux/amd64,linux/arm64 -t myrepo/mymon-web-image:latest --push .

 

2. 배포 환경에서 docker pull 및 실행

docker pull myrepo/mymon-web-image:latest
docker run -d --env-file .env -p 15361:15361 --name mymon-web-prod mymon-web-image

[6-2-2] docker image 저장소 없이도 빌드 및 배포 간편화 방식

여러 줄의 명령어를 상황에 맞게 간편하게 실행할 수 있도록

./build_send_image.sh IP주소 amd64
# 혹은
./build_send_image.sh IP주소 arm64

명령어 한줄로 amd64 혹은 arm64 이미지 빌드 및 배포 완료

*실제 환경에선 scp 파일 전송이 불가능하므로, 이미지 빌드 부분만 간편화에 활용 가능

build_send_image.sh 생성

#!/usr/bin/env bash
set -e

IP="$1"

if [ -z "$IP" ]; then
 echo "Usage: $0 <TARGET_IP>"
 exit 1
fi

ARCH="${2:-amd64}"

IMAGE="mymon-web-image:$ARCH"
TAR="../mymon-web-image.tar"
KEY="checkmate.pem"
USER="ubuntu"
REMOTE_PATH="/home/ubuntu"

docker buildx build \
 --platform "linux/$ARCH" \
 -t "$IMAGE" \
 --load .

docker save "$IMAGE" -o "$TAR"

scp -i "$KEY" "$TAR" "$USER@$IP:$REMOTE_PATH"

 

최소 10줄의 명령어 간소화 가능

amd64 이미지 빌드 및 배포 방법
docker buildx build --platform linux/amd64 -t mymon-web-image:amd --load .
docker save mymon-web-image:amd -o mymon-web-image-amd.tar
scp -i checkmate.pem mymon-web-image-amd.tar ubuntu@IP:/home/ubuntu/

새 인스턴스에서
docker load -i mymon-web-image-amd.tar
docker run -d --env-file .env -p 15361:15361 --name mymon-web-prod mymon-web-image:amd

arm64 이미지 빌드 및 배포 방법
docker buildx build --platform linux/arm64 -t mymon-web-image:arm --load .
docker save mymon-web-image:arm -o mymon-web-image-arm.tar
scp -i checkmate.pem mymon-web-image-arm.tar ubuntu@IP:/home/ubuntu/

새 인스턴스에서
docker load -i mymon-web-image-arm.tar
docker run -d --env-file .env -p 15361:15361 --name mymon-web-prod mymon-web-image:arm

 

실행 화면

이미지 빌드 및 배포

받은 이미지 확인, 도커 실행

[7] 트러블 슈팅

[7-1]  환경변수를 env파일로 빼내며 발생한 문제

  • [7-1-1] 문제
    • 웹 띄우기에는 성공했지만, process list 탭에서 호스트 선택창을 클릭하면 No data available이라고 나옴

  • [7-1-2] 원인 파악
    • 컨테이너 외부에서 웹을 띄웠을 때도 동일한 증상
    • => 로컬이냐 docker냐의 문제가 아니라, env로 환경변수를 빼면서 발생한 증상임을 확인

 

  • [7-1-3] 문제 세부 원인
    • 백엔드(django) 실행에 필요한 파일들이 env파일의 환경변수를 읽어오지 못함
    • client 디렉토리 내 파일들이 client/.env파일의 값을 참조하지 못함
    • => 프론트엔드(client) → 백엔드(main) API 호출에 문제 발생
  • [7-1-4] 해결
    • 해결1: 백엔드(django) 실행에 필요한 파일들의 env파일 참조 경로 수정
    • 시행착오: 프론트엔드 서버 구동에만 필요한 최상위 디렉토리 파일 4개(package.json, package-lock.json, babel.config.js, vue.config.js)를 모두 client(프론트엔드) 디렉토리로 이동시킨 뒤 npm install(프론트엔드 의존성 설치 명령)이 client 디렉토리 내에서 이루어지도록 했으나, client 내 파일이 기존 main 디렉토리 내 html 파일을 인식하지 못하는 문제 발생 -> 경로가 더 꼬여버림
    • 해결2: 디렉토리 구조는 그대로 두고, 프론트엔드(vue)용 env파일만 최상위 디렉토리 내 .env.client파일로 저장, 참조 경로 최종 수정

[7-2] 운영 환경 구축에 Vue dev 서버를 사용해 발생한 문제

  • [7-2-1] 문제
    • 테스트서버(cb801)에선 docker image로 컨테이너를 실행해 웹을 띄웠을 때 문제가 없었지만, NHN Cloud 새 인스턴스에서 실행 시 웹 프론트엔드가 안보임
  • [7-2-2] 원인 파악
    • Vue 개발 서버 (vue-cli-service serve)는 로컬 개발 전용으로 동작하기 때문에, Docker 컨테이너 외부에서 정상적으로 접근할 수 없어 문제가 발생
  • [7-2-3] 해결
    • Django(백엔드)가, 빌드된 Vue 정적파일을 서빙하도록 수정

[8] 기타

이 과제를 수행하기 위해 어떤 계획을 세웠는지, 왜 이런 계획을 세웠는지, 문제가 발생했을 때 어떻게 대처하고 어떻게 원인을 파악하려 노력했는지 등은 블로그에 순차적으로 기록함

1: https://ssuperjun.tistory.com/28

2: https://ssuperjun.tistory.com/30

3: https://ssuperjun.tistory.com/31

4: https://ssuperjun.tistory.com/32

5: https://ssuperjun.tistory.com/33

6: https://ssuperjun.tistory.com/37

도커 스터디: https://ssuperjun.tistory.com/29