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

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

QA

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

답변 4

본문

    안녕하세요. 그누보드(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

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 112
© SIRSOFT
현재 페이지 제일 처음으로