

그림을 보면 docker로 flask랑 4개의 DBMS를 띄울 예정이다. Data는 따로 분리할 것이다.
우선 DBMS 4개를 띄우기위해 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연결들은 따로 설정하는 법을 글로 쓸 예정이다.
우선 현재 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)에서 접속한 것이다.