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

Copy
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

Copy
root@HumanpcNAS:/mnt/VOL1/Docker# docker --version
Docker version 20.10.8-ce, build 62eae52c2a

.

Python 3.11.2

.

fastapi>=0.111.0 

.

 

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

 

Dockerfile

Copy
# 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

Copy
version: '3.8'

services:

  app:

    build: .

    container_name: glitter

    ports:

      - "8000:8000"

    volumes:

      - .:/app

    environment:

      - PYTHONUNBUFFERED=1

 

감사합니다.

 

 

 

답변 4개

채택된 답변
+20 포인트
로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

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

 

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

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

 

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

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

 

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

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

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

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

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

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

Copy
systemctl daemon-reload

systemctl status docker

 

  Dockerfile

Copy
# 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

Copy
version: '3.8'

services:

  m_glitter:

    container_name: con_m_glitter

    build:

      context: .

    environment:

      - DATABASE_URL=mysql+pymysql://DB_사용자:사용자_비번@localhost: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_사용자:사용자_비번@localhost:3306/DB_이름" ,

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

 

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

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

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

    

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

  !.  mkdir alembic

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

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

Copy
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 설치 확인:

Copy
docker --version

Docker Compose 설치 확인:

Copy
docker-compose --version

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

Copy
docker-compose up --build

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

Copy
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 기본 설정이 본인의 시스템에 잘 어울리게 구성한 후, 시도하시는 것이 ~~ +++

 

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

Copy
│

/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 상태 확인 -

Copy
ping localhost

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

   - localhost : http://localhost:8000

    _ 127.0.0.1 : http://127.0.0.1:8000

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

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

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

안녕하세요.

초보라서, 무슨 말씀이신지 인지하기가 어렵습니다.

조금 더 구체적이면 감사하겠습니다.
https://sir.kr/g6_tip/125 저는 이 글을 참조 했습니다.

댓글을 작성하려면 로그인이 필요합니다.

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

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

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

이건 sql셋팅설정입니다. 방화벽과 상관없는거지요..그렇다면 라우터와 나스서버방화벽확인해보시기바랍니다.
서버를 확인을 못하니 답을 못드리겟네요 하나씩 모두 다 체크해보시기바랍니다.
도와 주심에 감사드립니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고