[Multiple Database Banking Simulation] 2. Docker

dbdbdeep·2025년 9월 10일
post-thumbnail

Docker-compose로 관리


그림을 보면 docker로 flask랑 4개의 DBMS를 띄울 예정이다. Data는 따로 분리할 것이다.

우선 DBMS 4개를 띄우기위해 docker-compose.yml 을 먼저 작성한다.

docker-compose.yml

#도커 파일 포맷 버젼
version: "3.9"

#올릴려는 서비스들 명시
services:
  # -------------------
  # MongoDB 설정
  # -------------------
  mongo:
    image: mongo:6.0
    container_name: mongo
    restart: always
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: rootpass
    volumes:
      - mongo_data:/data/db

  # -------------------
  # MySQL 설정
  # -------------------
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: testdb
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpass
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql_data:/var/lib/mysql

  # -------------------
  # Oracle Database (XE)  설정
  # -------------------
  oracle:
    image: gvenzl/oracle-xe:21-slim
    container_name: oracle
    restart: always
    ports:
      - "1521:1521"   # listener
      - "5500:5500"   # EM Express
    environment:
      ORACLE_PASSWORD: rootpass
      APP_USER: testuser
      APP_USER_PASSWORD: testpass
    volumes:
      - oracle_data:/opt/oracle/oradata

  # -------------------
  # PostgreSQL 설정
  # -------------------
  postgres:
    image: postgres:15
    container_name: postgres
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: testpass
      POSTGRES_DB: testdb
    volumes:
      - postgres_data:/var/lib/postgresql/data

# -------------------
# Volumes - 데이터 영구 보존
# -------------------
volumes:
  mongo_data:
  mysql_data:
  oracle_data:
  postgres_data:

실행

백그라운드로 실행하기위해
docker-compose up -d
명령어를 사용
이미지를 다운로드하고 아래처럼 볼륨이 만들어졌다.

나는 기존에 실행되던 db가 충돌이나서 재실행하였다.

정상적으로 모든 prot에 db들이 열렸다.

포트포워딩&방화벽은 미리 다 해두어서 실제로 연결이 되는지만 테스트하면 될 것같다.

정상적으로 연결이 되었다. 가장 설정하기 쉬운 DB가 mysql이라 mysql로 설정하고 연결했는데, 나머지 DB연결들은 따로 설정하는 법을 글로 쓸 예정이다.

flask 추가 - 2025 09 26

우선 현재 docker-compose.yml은 DB를 띄우도록 되어있다. 여기에 Flask를 띄워야한다. 문제는 Flask는 server,dev 환경에서 다 띄워야한다. 그래서 환경에 따라 설정을 다르게하여 컨테이너를 띄우기로 했다.

docker-compose_dev.yml

services:
  api:
    build:
      context: ..
      dockerfile: Docker/dockerfile
      target: dev
    env_file: ../BE/.env.dev          # 여기에 기본값들 (.env.dev)
    environment:                      # ← 여기 추가
      APP_PROFILE: dev
      PYTHON_ORACLEDB_THIN: "1"       # oracledb 얇은 모드 강제
      TNS_ADMIN: ""                   # TNS 경로 무력화(빈 문자열)
      ORACLE_HOME: ""                 # Thick 모드 유도 방지
      # 필요 시 여기서 .env.dev 값을 덮어써도 됨 (우선순위 ↑)
      # ORACLE_DSN: "211.48.53.76:15211:XE"
      # ORACLE_USER: "MDBS"
      # ORACLE_PASSWORD: "******"
    command: flask --app BE/app.py run --host=0.0.0.0 --port=5000 --debug
    depends_on: []
    ports:
      - "5000:5000"
    volumes:
      - ..:/app:cached

target: dev 으로 되어있다.

dockerfille을 새롭게 만들어서 안에서 local인지 server인지 체크한다.

############################
# base (공통 레이어)
############################
FROM python:3.11-slim AS base
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential curl gcc pkg-config \
    libpq-dev default-libmysqlclient-dev libmariadb-dev \
    && rm -rf /var/lib/apt/lists/*
COPY BE/requirements.txt ./requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN useradd -m flask && chown -R flask:flask /app
EXPOSE 5000

############################
# dev (핫리로드)
############################
FROM base AS dev
ENV FLASK_ENV=development
USER flask
# dev는 flask run
CMD ["flask", "--app", "BE/app.py", "run", "--host=0.0.0.0", "--port=5000", "--debug"]

############################
# prod (gunicorn)
############################
FROM base AS prod
ENV GUNICORN_WORKERS=2 GUNICORN_TIMEOUT=60
USER flask
# prod는 gunicorn
CMD ["gunicorn", "--chdir", "BE", "--bind", "0.0.0.0:5000", "--workers", "2", "--timeout", "60", "app:app"]



위에가 서버 아래가 개발환경(내 pc)에서 접속한 것이다.

profile
DB관련 공부를 합니다.

0개의 댓글