localhost의 MySQL DB를 Docker 컨테이너의 FastAPI 애플리케이션에서 사용하고 싶습니다.

localhost의 MySQL DB를 Docker 컨테이너의 FastAPI 애플리케이션에서 사용하고 싶습니다.

QA

localhost의 MySQL DB를 Docker 컨테이너의 FastAPI 애플리케이션에서 사용하고 싶습니다.

본문

    안녕하세요. 그누보드(6.0.7)사용자 입니다.

 

'FastAPI 애플리케이션을 자유롭게 사용하고자'하던 중 조언(https://sir.kr/qa/536846)을 듣고,

 

그누보드6을 컨테이너에 담아 보려는데, localhost의 MySQL DB를 Docker 컨테이너의

 

FastAPI 애플리케이션(그누보드6)에서는 사용할 수가 없군요.

 

>>> DB를 읽지 못하고(http://w.glitter.kr/) 새로이 만든 DB를 연결하여도

이런 에러(https://policy.glitter.kr/qa_php/db-error-3.png)가 발생합니다.

 

여러모로 시도하였으나, 사용하는 방법을 찾지 못 하고 이렇게 조언을 구합니다.

 

=시스템 정보 =

 1 . localhost


root@HumanpcNAS:~# uname && uname -r 
Linux 6.1.20-efm-standard 
. 
root@HumanpcNAS:~# python3 -V
Python 3.9.9 
. 
root@HumanpcNAS:~# cat requirements.txt 
fastapi>=0.111.0 
. 
root@HumanpcNAS:~# httpd -v 
Server version: Apache/2.4.52 (Unix) .

 

2. Docker / Container


root@HumanpcNAS:/mnt/VOL1/Docker# docker --version
Docker version 20.10.8-ce, build 62eae52c2a
.
Python 3.11.2
.
fastapi>=0.111.0 
.

 

일반인이 접하기엔 어려움이 있어 조언을 구합니다.

 

Dockerfile


# Use Python 3.11.2 base image
FROM python:3.11.2-slim
# Install necessary packages
COPY requirements.txt /
RUN pip install --no-cache-dir -r /requirements.txt
# Copy application code and Gnuboard source files
COPY . /
# Run FastAPI application
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

 

docker-compose.yml


version: '3.8'
services:
  app:
    build: .
    container_name: glitter
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    environment:
      - PYTHONUNBUFFERED=1

 

감사합니다.

 

 

 

이 질문에 댓글 쓰기 :

답변 4

웹서버는 연결이 되어있습니다.

데이타베이스 연결이 않되니 확인해보시기바랍니다.

데이타베이스 포트 가열려있는지 포트가 보안에 오픈되어잇는지 확인해보시기바랍니다.

localhost 대신 glitter 이것을 넣어야 하는것 아닌가요?

테스터 하는 중에 막으셔서 못해봤어요..

      일 주일을 헤매다, 답을 찾았다.

 

 ★★★ Localhost에 Docker 컨테이너 이미지로 만들 수 없는 Host들이 있어,

MySQL DB를 컨테이너 이미지로 만들 수 없는 상황이라는 점이 문제였다. ★★★

 

 그누보드6_컨테이너가 호스트(MySQL DB)의 네트워크와 동일한 네트워크 스택을 공유하게 하여야,

Localhost의 MySQL DB를 인식하고 사용할 수 있었다. ㅠ ㅠ ㅠ ㅠ

 

   ※ ※ ※ Docker 컨테이너 이미지(그누보드6)를 만들기 전에 ~ ※ ※ ※

   !. 그누보드6을 사용자가 특정한 디렉터리(/mnt/VOL1/base2)에 설치 완료 한다.

       >> 실사용 중인 그누보드6을 Docker 컨테이너 이미지로 만드는 상황 임.

    !.  보드초기설치시; MySQL DB의  "DB_사용자:사용자_비번:3306/DB_이름" 설정을 메모.

    !.  그누보드6 사용중에 추가된 모듈(패키지)를 메모.

    !.  Docker 서비스 정상 작동 확인 - ★ SSH의 서버 사용자는 root ; 명령 접두어, sudo 생략 함 ★


systemctl daemon-reload
systemctl status docker

 

  Dockerfile


# Use Python base image
FROM python:3.12.4
# Set the working directory
WORKDIR /mnt/VOL1/base2
# Copy the requirements file into the container
COPY requirements.txt .
# Install dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the application code into the container
COPY . .
# Expose the port the app runs on
EXPOSE 8000
# Command to run the application
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

   -그누보드6 작업 디렉터리(/mnt/VOL1/base2) = 그누보드6 소스파일

 

docker-compose.yml


version: '3.8'
services:
  m_glitter:
    container_name: con_m_glitter
    build:
      context: .
    environment:
      - DATABASE_URL=mysql+pymysql://DB_사용자:사용자_비번:3306/DB_이름
    network_mode: host  # Use host network mode
    volumes:
      - /mnt/VOL1/base2:/mnt/VOL1/base2
      - /mnt/VOL1/hwi:/mnt/VOL1/hwi
     

 

      그누6설치시 DB의 -  "DB_이름", "호스트명(localhost)", "DB_사용자", "사용자_비번" ;

"DATABASE_URL=mysql+pymysql://DB_사용자:사용자_비번:3306/DB_이름" ,

이 내용과 일치하게 작성한다.

 

  !. 자신의 컨테이너_디렉터리에 alembic, 디렉터리를 만든다.

  !. 위의 두 파일과 그누보드6 소스파일 Root에 있는 requirements.txt를

자신의 컨테이너_디렉터리로 옮긴다.

    

  !.  cd <자신의 컨테이너_디렉터리>

  !.  mkdir alembic

  !.  사용자 모듈(패키지)을 requirements.txt에 추가한다. (그누보드6이 설치 되었다는 상황임)

   글쓴이는 aiohttp==3.9.5 등을 추가하였다.


root@HumanpcNAS:/mnt/VOL1/Docker/m_glitter# vi requirements.txt
aiohttp==3.9.5
.
fastapi>=0.111.0

♠ 그누6설치, requirements.txt, Dockerfile, docker-compose.yml, alembic.ini 편집 후 -

 

Docker 설치 확인:


docker --version

Docker Compose 설치 확인:


docker-compose --version

Docker Compose 파일을 사용하여 컨테이너 시작:


docker-compose up --build

그누보드6이 정상 실행 된다면,  'Ctrl+C'로 종료 후, 백그라운 실행으로 전환:


docker-compose up -d

 

    호스트의 디렉터리(/mnt/VOL1/base2, /mnt/VOL1/hwi)를 컨테이너에 

같은 디렉터리(/mnt/VOL1/base2, /mnt/VOL1/hwi)로 마운트하여 기존의 코딩 내용을 유지하였다.

 

>> 디렉터리(/mnt/VOL1/hwi)는 이 localhost내의 모든 host들이 공유하는 디렉터리로,

    robots.txt, site_map.xml, image, css, 등의 stasic 파일들을 구조적으로 관리하는 폴더.

    stasic 파일들을 한적한 곳에  두어, Upgrade시 편리함 등이 있음.

 

    알고 보면 가벼운데, 몇 일을 고생하고 돌아 보니 ㅠ ㅠ.

 

  +++ Docker 기본 설정이 본인의 시스템에 잘 어울리게 구성한 후, 시도하시는 것이 ~~ +++

 

※ 초보의 심정으로 ~~ 필자의 디렉터리 구조이다.


│
/mnt/VOL1/base2/ ( 그누보드6 )
│   ├── .env
│   ├── api/
│   ├── core/
│   ├── lib/
│   ├── service/
│   ├── venv/
│   ├── . . .
│   └── main.py
│
/mnt/VOL1/Docker/ ( 도커/컨테이너 디렉터리 )
│   ├── docker/ ( 도커 S/W )
│   │   ├── buildkit/
│   │   ├── containerd/
│   │   ├── containers/
│   │   ├── image/
│   │   ├── network/
│   │   ├── overlay2/
│   │   ├── plugins/
│   │   ├── runtimes/
│   │   ├── swarm/
│   │   ├── tmp/
│   │   ├── trust/
│   │   └── volumes/
│   ├── m_glitter/  ( 그누보드6 컨테이너 )
│   │   ├── alembic/
│   │   ├── alembic.ini
│   │   ├── Dockerfile
│   │   ├── docker-compose.yml
│   │   └── requirements.txt
│
/mnt/VOL1/hwi/ ( static 파일 디렉터리 )
│   ├── gimg/
│   │   ├── img/
│   │   └── favicon/
│   ├── css/
│   │   ├── glitter.css
│   │   ├── m.glitter_default.css
│   │   ├── . . .
│   │   └── policy.glitter_default.css
│   ├── robots.txt
│   ├── m.robots.txt
│   ├── policy.robots.txt
│   ├── . . .
│   ├── glitter_sitemap.xml
│   ├── m.glitter_sitemap.xml
│   ├── policy.glitter_sitemap.xml
│   └── site_map.xml
│

 

♠♤ 브라우저에서 컨테이너에 요청을 보내, 작동 확인 - 필자와 같은 초보를 위해 ~

    -- 아래의 port 8000은 호스트의 포트 8000입니다.

    -- "EXPOSE 8000" 실행으로 > 8000:8000 , 이렇게 맵핑 된 것입니다.

 

!. 필지와 같이, 로컬 네트워크에 서버(홈 서버)가 있는 경우 -

    - 홈 서버의 내부_IP : http://내부_IP:8000  (192.168.xxx.xxx)

    - 홈 서버의 공인_IP : http://공인_IP:8000  (ISP에서 부여 받은 IP)

 

!. localhost에 서버가 있는 경우(계발환경) -

   ☆ 기본적으로 Windows, macOS 및 Linux에서는 localhost가 127.0.0.1로 매핑되어 있으나,

     터미널이나 명령 프롬프트에서 다음 명령어를 실행하여, localhost 상태 확인 -


ping localhost

  핑 반응이 없을 경우, C:/Windows/System32/drivers/etc/hosts의 주석 제거 -

   - localhost : http://localhost:8000

    _ 127.0.0.1 : http://127.0.0.1:8000

답변을 작성하시기 전에 로그인 해주세요.
전체 31
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT