테스트 사이트 - 개발 중인 베타 버전입니다

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

glitter0gim 1년 전 조회 27,867

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

</p>

<p><code>root@HumanpcNAS:~# uname && uname -r </code></p>

<p><code>Linux 6.1.20-efm-standard </code></p>

<p><code>. </code></p>

<p><code>root@HumanpcNAS:~# python3 -V</code></p>

<p><code>Python 3.9.9 </code></p>

<p><code>. </code></p>

<p><code>root@HumanpcNAS:~# cat requirements.txt </code></p>

<p><code>fastapi>=0.111.0 </code></p>

<p><code>. </code></p>

<p><code>root@HumanpcNAS:~# httpd -v </code></p>

<p><code>Server version: Apache/2.4.52 (Unix) .</code>

 

2. Docker / Container

</p>

<p>root@HumanpcNAS:/mnt/VOL1/Docker# docker --version

Docker version 20.10.8-ce, build 62eae52c2a</p>

<p>.</p>

<p><code>Python 3.11.2</code></p>

<p><code>.</code></p>

<p><code>fastapi>=0.111.0 </code></p>

<p>.

 

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

 

Dockerfile

</p>

<p># Use Python 3.11.2 base image</p>

<p>FROM python:3.11.2-slim</p>

<p># Install necessary packages</p>

<p>COPY requirements.txt /</p>

<p>RUN pip install --no-cache-dir -r /requirements.txt</p>

<p># Copy application code and Gnuboard source files</p>

<p>COPY . /</p>

<p># Run FastAPI application</p>

<p>CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]</p>

<p>

 

docker-compose.yml

</p>

<p>version: '3.8'</p>

<p>services:</p>

<p>  app:</p>

<p>    build: .</p>

<p>    container_name: glitter</p>

<p>    ports:</p>

<p>      - "8000:8000"</p>

<p>    volumes:</p>

<p>      - .:/app</p>

<p>    environment:</p>

<p>      - PYTHONUNBUFFERED=1</p>

<p>

 

감사합니다.

 

 

 

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

답변 4개

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

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

glitter0gim
1년 전

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

 

 ★★★ 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 생략 함 ★

</p>

<p>systemctl daemon-reload</p>

<p>systemctl status docker

 

  Dockerfile

</span></p>

<p># Use Python base image</p>

<p>FROM python:3.12.4</p>

<p># Set the working directory</p>

<p>WORKDIR /mnt/VOL1/base2</p>

<p># Copy the requirements file into the container</p>

<p>COPY requirements.txt .</p>

<p># Install dependencies</p>

<p>RUN pip install --no-cache-dir -r requirements.txt</p>

<p># Copy the rest of the application code into the container</p>

<p>COPY . .</p>

<p># Expose the port the app runs on</p>

<p>EXPOSE 8000</p>

<p># Command to run the application</p>

<p>CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]</p>

<p><span style="font-family:돋움;">

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

 

docker-compose.yml

</span></p>

<p>version: '3.8'</p>

<p>services:</p>

<p>  m_glitter:</p>

<p>    container_name: con_m_glitter</p>

<p>    build:</p>

<p>      context: .</p>

<p>    environment:</p>

<p>      - DATABASE_URL=mysql+pymysql://DB_사용자:사용자_비번@localhost:3306/DB_이름</p>

<p>    network_mode: host  # Use host network mode</p>

<p>    volumes:</p>

<p>      - /mnt/VOL1/base2:/mnt/VOL1/base2</p>

<p>      - /mnt/VOL1/hwi:/mnt/VOL1/hwi</p>

<p>     <span style="font-family:돋움;">

 

      그누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 등을 추가하였다.

</p>

<p>root@HumanpcNAS:/mnt/VOL1/Docker/m_glitter# vi requirements.txt

aiohttp==3.9.5</p>

<p>.</p>

<p>fastapi>=0.111.0

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

 

Docker 설치 확인:

</p>

<p>docker --version

Docker Compose 설치 확인:

</p>

<p>docker-compose --version

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

</p>

<p>docker-compose up --build

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

</p>

<p>docker-compose up -d</p>

<p>

 

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

 

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

</p>

<p>│</p>

<p>/mnt/VOL1/base2/ ( 그누보드6 )</p>

<p>│   ├── .env</p>

<p>│   ├── api/</p>

<p>│   ├── core/</p>

<p>│   ├── lib/</p>

<p>│   ├── service/</p>

<p>│   ├── venv/</p>

<p>│   ├── . . .</p>

<p>│   └── main.py</p>

<p>│</p>

<p>/mnt/VOL1/Docker/ ( 도커/컨테이너 디렉터리 )</p>

<p>│   ├── docker/ ( 도커 S/W )</p>

<p>│   │   ├── buildkit/</p>

<p>│   │   ├── containerd/</p>

<p>│   │   ├── containers/</p>

<p>│   │   ├── image/</p>

<p>│   │   ├── network/</p>

<p>│   │   ├── overlay2/</p>

<p>│   │   ├── plugins/</p>

<p>│   │   ├── runtimes/</p>

<p>│   │   ├── swarm/</p>

<p>│   │   ├── tmp/</p>

<p>│   │   ├── trust/</p>

<p>│   │   └── volumes/</p>

<p>│   ├── m_glitter/  ( 그누보드6 컨테이너 )</p>

<p>│   │   ├── alembic/</p>

<p>│   │   ├── alembic.ini</p>

<p>│   │   ├── Dockerfile</p>

<p>│   │   ├── docker-compose.yml</p>

<p>│   │   └── requirements.txt</p>

<p>│</p>

<p>/mnt/VOL1/hwi/ ( static 파일 디렉터리 )</p>

<p>│   ├── gimg/</p>

<p>│   │   ├── img/</p>

<p>│   │   └── favicon/</p>

<p>│   ├── css/</p>

<p>│   │   ├── glitter.css</p>

<p>│   │   ├── m.glitter_default.css</p>

<p>│   │   ├── . . .</p>

<p>│   │   └── policy.glitter_default.css</p>

<p>│   ├── robots.txt</p>

<p>│   ├── m.robots.txt</p>

<p>│   ├── policy.robots.txt</p>

<p>│   ├── . . .</p>

<p>│   ├── glitter_sitemap.xml</p>

<p>│   ├── m.glitter_sitemap.xml</p>

<p>│   ├── policy.glitter_sitemap.xml</p>

<p>│   └── site_map.xml</p>

<p>│</p>

<p>

 

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

    -- 아래의 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 상태 확인 -

</p>

<p>ping localhost

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

   - localhost : http://localhost:8000

    _ 127.0.0.1 : https://test.glitter.my" target="_blank">http://127.0.0.1:8000

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

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

들레아빠

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

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

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

답변에 대한 댓글 2개

g
glitter0gim
1년 전
안녕하세요.

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

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

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

웅푸
1년 전

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

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

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

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

답변에 대한 댓글 3개

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

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

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

로그인