ssuperjun 님의 블로그
[과제6-7] 발표자료 최종 - 도커를 이용한 DB 운영툴 환경 구축 자동화 본문
프로젝트 기간: 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
'인턴' 카테고리의 다른 글
| [스터디2] [인프라 엔지니어의 교과서] 11장 인프라 운영 (0) | 2026.02.09 |
|---|---|
| [스터디2] [인프라 엔지니어의 교과서] 10장 솔루션 및 보안 (0) | 2026.02.09 |
| [스터디2] [인프라 엔지니어의 교과서] 2장 서버 발표용 (1) | 2026.02.06 |
| [스터디2] [인프라 엔지니어의 교과서] 4,5,6,7,8,9,12장 스터디 (0) | 2026.02.05 |
| [과제6-6] 고도화: MyMon Dev환경 세팅(웹 소스코드 도커라이징) (0) | 2026.02.05 |