본문으로 바로가기

NAS에서 Docker에 python 웹 deploy 성공기

category IT 2023. 4. 12. 00:15
반응형

1. pycharm으로 프로젝트를 생성하여 개발을 하였다.

개발을 완료한 후, nas에서 실행할 것이므로, 경로, 네트워크 등 설정을 변경했다. ex) localhost, 상대경로 ./

NAS에 Docker를 설치했다

한마디로 요약하자면, 아래의 과정은 내 프로젝트를 Docker 라는 프로그램을 통하여 build 해가지고, docker로 run 시키는 거다.

2. 프로젝트 폴더에 Dockerfile 생성: 프로젝트의 루트 디렉토리에 Dockerfile이라는 파일을 생성하고 아래 내용을 복사 붙여넣기하세요.


FROM python:3.9

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "app.py"]




여기서 프로젝트 폴더라 함은,
"프로젝트 폴더"란, 프로젝트의 모든 소스 코드 파일, 설정 파일 및 관련 리소스를 포함하고 있는 디렉토리를 의미합니다.

예를 들어, 여러분이 작성한 testapp 프로젝트의 경우, 아래와 같은 구조를 가지고 있을 것입니다:

testapp/
├── app.py
├── templates/
│ ├── index.html
│ └── ...
└── ...

위 예시에서, testapp 디렉토리가 프로젝트 폴더를 나타냅니다. 이 폴더 안에는 애플리케이션 코드(app.py), 템플릿 파일(templates 폴더) 등이 포함되어 있습니다.

프로젝트 폴더를 찾으려면, 코드 편집기(PyCharm)에서 파일 탐색기를 통해 프로젝트의 루트 디렉토리를 찾을 수 있습니다. 파일 탐색기에서 프로젝트의 루트 디렉토리를 찾아, 그곳에 Dockerfile과 requirements.txt 파일을 생성하고 작성하시면 됩니다.


requirements.txt 파일 생성: 프로젝트에 사용된 패키지와 버전 정보를 requirements.txt 파일에 기록합니다. 프로젝트 폴더에 requirements.txt 파일을 생성하고 다음 내용을 추가하세요.
Flask==2.1.1
requests==2.26.0


Docker 이미지 빌드: 터미널을 열고 프로젝트 폴더로 이동한 다음 아래 명령어를 실행하세요. 이 명령어는 Docker 이미지를 빌드하고 이름을 지정합니다(testapp_project는 원하는 이름으로 변경할 수 있습니다).

sudo docker build -t testapp .

sudo docker run -it -p 8023:8023 testapp ( -it 옵션을 통해서 로그를 꼭 확인하라 )

★★
제대로 실행됐다면, aaa.synology.me:8023 으로 접속하면 원하는 결과(index.html) 이 나와야 한다.
만약, 제대로된 결과가 나오지 않고 페이지 연결이 refused 된다거나 하면, 다음을 확인해보라.

지금의 경우 이렇게 해결했다.
자꾸 서버 기동시 뜨는 로그
Running on http://127.0.0.1:5000 이게 자꾸 눈에 밟히는거다.
검색을 해보니 이거는 Flask 내부 로그라서 상관없다고 한다. chatGPT 말을 맹신했다.
괜한 포트포워딩, NAS의 방화벽 해제, 별짓을 다해봤다. DDNS로 접속, IP로 접속 등등

결론★★★
app.py _main__ 에서
if __name__ == "__main__":
app.run(host="0.0.0.0", port=7000)

Flask 어플리케이션을 수정하십시오.
Flask 어플리케이션에서, app.run()을 호출할 때 호스트를 명시적으로 설정해 주세요. 기본값은 127.0.0.1(localhost)이기 때문에, 외부에서 접속이 제한됩니다.
호스트를 0.0.0.0으로 설정하여 모든 IP 주소에서 접속이 가능하도록 변경하십시오.

즉, 저부분을 수정하지 않으면, 127.0.0.1:5000 으로밖에 접속이 제한되는거다. 즉, 로컬호스트에서밖에 안됨.


★★
마지막으로, 지금 실행한 Docker 이미지를, 터미널이 종료되어도 실행하고 싶다면 즉, 백그라운드에서 동작하게 하려면 실행시
아래와 같이 실행해야 한다.

sudo docker run -d -p 8023:8023 testapp

-it 옵션은 터미널 종료시 서버도 종료된다.
-d 옵션은 터미널을 종료해도 백그라운드에서 동작한다.

컨테이너를 중지하려면 먼저 컨테이너 ID를 확인한 다음 docker stop 명령을 사용합니다.

컨테이너 ID를 확인하려면 다음 명령을 사용하세요:

sudo docker ps

sudo docker stop [container_id]

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79a157100aff testapp "python app.py" 11 minutes ago Up 11 minutes 0.0.0.0:8023->8023/tcp busy_germain
de8eadff11b0 ubuntu:latest "/bin/bash" 4 hours ago Up 4 hours ubuntu1
c93a4da14d86 wnameless/oracle-xe-11g-r2:latest "/bin/sh -c '/usr/sb…" 3 years ago Up 3 months 0.0.0.0:1521->1521/tcp, 0.0.0.0:49154->22/tcp, 0.0.0.0:49153->8080/tcp wnameless-oracle-xe-11g-r21

Random Photo

반응형