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
</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개
일 주일을 헤매다, 답을 찾았다.
★★★ 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
댓글을 작성하려면 로그인이 필요합니다.
답변에 대한 댓글 2개
댓글을 작성하려면 로그인이 필요합니다.
웹서버는 연결이 되어있습니다.
데이타베이스 연결이 않되니 확인해보시기바랍니다.
데이타베이스 포트 가열려있는지 포트가 보안에 오픈되어잇는지 확인해보시기바랍니다.
답변에 대한 댓글 3개
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
초보라서, 무슨 말씀이신지 인지하기가 어렵습니다.
조금 더 구체적이면 감사하겠습니다.