이 출시되었습니다! 11월의 새로운 기능 및 수정 사항을 읽어보세요.

컨테이너 속 Python

이 자습서에서는 다음을 배우게 됩니다.

  • 간단한 Python 컨테이너를 설명하는 Dockerfile 파일 만들기.
  • Django, Flask 또는 일반 Python 앱을 빌드, 실행 및 기능 확인합니다.
  • 컨테이너에서 실행되는 앱 디버깅.

전제 조건

  • 머신에 Docker를 설치하고 시스템 경로에 추가합니다.

  • Linux의 경우 VS Code를 실행하는 데 사용될 비루트 사용자 계정에 대해 Docker CLI를 사용하도록 설정해야 합니다.

  • 컨테이너 도구 확장. 확장을 설치하려면 확장 보기(⇧⌘X (Windows, Linux Ctrl+Shift+X))를 열고 container tools를 검색하여 필터링한 후 Microsoft에서 제공하는 컨테이너 도구 확장을 선택합니다.

    Select Container Tools extension

Python 프로젝트 만들기

아직 Python 프로젝트가 없다면 Python 시작하기 자습서를 따르세요.

참고: 완전한 Django 또는 Flask 웹 앱을 컨테이너화하려면 다음 샘플 중 하나로 시작할 수 있습니다.

참고: 이 자습서에서는 샘플 리포의 tutorial 브랜치를 사용해야 합니다.

앱이 제대로 실행되는지 확인한 후 애플리케이션을 컨테이너화할 수 있습니다.

프로젝트에 Docker 파일 추가하기

  1. VS Code에서 프로젝트 폴더를 엽니다.

  2. 명령 팔레트(⇧⌘P (Windows, Linux Ctrl+Shift+P))를 열고 Containers: Add Docker Files to Workspace...를 선택합니다.

    Add Dockerfile to a Python project

  3. 앱 유형을 묻는 메시지가 나타나면 앱 유형으로 Python: Django, Python: Flask 또는 Python: General을 선택합니다. 이 자습서에서는 Python: General 사례에 중점을 두지만 Django 및 Flask에 대한 참고 사항도 포함됩니다.

  4. 앱 진입점까지의 상대 경로를 입력합니다. 이는 시작하는 작업 영역 폴더를 제외한 경로입니다. Python 시작하기 자습서에 따라 hello.py로 Python 앱을 생성했다면 해당 파일을 선택합니다.

    Django: manage.py(루트 폴더) 또는 subfolder_name/manage.py를 선택합니다. Django 공식 문서를 참조하세요.

    Flask: Flask 인스턴스를 만드는 위치로 이동합니다. Flask 공식 문서를 참조하세요.

    : __main__.py 파일이 포함된 폴더 이름으로도 경로를 입력할 수 있습니다.

  5. 포트 번호를 선택합니다. 루트 사용자로 실행으로 인한 보안 문제를 완화하기 위해 1024 이상의 포트를 선택하는 것이 좋습니다. 사용 가능한 포트라면 아무거나 선택해도 되지만, Django와 Flask는 표준 기본 포트를 사용합니다.

    Django: 기본 포트 8000입니다.

    Flask: 기본 포트는 5000입니다.

  6. Docker Compose 포함 여부를 묻는 메시지가 나타나면 Docker Compose 파일을 원하지 않으면 아니요를 선택합니다. 를 선택하면 Compose Up 명령을 성공적으로 실행하려면 Dockerfile에서 wsgi.py 파일의 경로를 확인해야 합니다. Compose는 일반적으로 여러 컨테이너를 동시에 실행할 때 사용됩니다.

  7. 이러한 정보로 컨테이너 도구 확장은 다음 파일을 생성합니다.

    • Dockerfile. 이 파일의 IntelliSense에 대해 자세히 알아보려면 개요를 참조하세요.

    • .dockerignore 파일은 .git, .vscode, __pycache__와 같이 필요하지 않은 파일 및 폴더를 제외하여 이미지 크기를 줄입니다.

    • Docker Compose를 사용하는 경우 docker-compose.ymldocker-compose.debug.yml 파일이 생성됩니다.

    • 아직 존재하지 않는 경우 모든 앱 종속성을 캡처하기 위한 requirements.txt 파일이 생성됩니다.

    중요 참고: 저희 설정을 사용하려면 Python 프레임워크(Django/Flask)와 Gunicorn가 requirements.txt 파일에 포함되어야 합니다. 가상 환경/호스트 머신에 이러한 필수 구성 요소가 이미 설치되어 있고 컨테이너 환경과 동일해야 한다면, 터미널에서 pip freeze > requirements.txt를 실행하여 앱 종속성이 전송되었는지 확인하세요. 이렇게 하면 현재 requirements.txt 파일이 덮어쓰여집니다.

(선택 사항) 이미지에 환경 변수 추가

이 단계는 필수는 아니지만, 컨테이너 환경에 설정해야 하는 환경 변수를 추가하는 방법을 이해하는 데 도움이 됩니다.

컨테이너 도구 확장은 IntelliSense를 사용하여 자동 완성 및 컨텍스트 도움말을 제공하여 Dockerfile 작성을 지원합니다. 이 기능을 직접 확인하려면

  1. Dockerfile을 엽니다.

  2. EXPOSE 문 아래에 ⌃Space (Windows, Linux Ctrl+Space)를 입력하여 IntelliSense를 트리거하고 ENV로 스크롤합니다.

    Adding environment variable to Dockerfile

  3. Tab 또는 Enter를 눌러 문을 완성한 다음, key를 변수 이름으로, value를 값으로 설정합니다.

Dockerfile에서 환경 변수를 설정하고 사용하는 방법에 대한 자세한 내용은 Docker 설명서의 ENV 지침 및 환경 대체 섹션을 참조하세요.

Gunicorn, Django 및 Flask 앱 수정

Python 웹 개발자에게 훌륭한 시작점을 제공하기 위해 기본 웹 서버로 Gunicorn을 사용하기로 선택했습니다. 기본 Dockerfile에 참조되어 있으므로 requirements.txt 파일에 종속성으로 포함되어 있습니다. requirements.txt에서 보이지 않으면 pip install gunicorn을 실행한 다음 pip freeze > requirements.txt를 실행하여 requirements.txt 파일을 다시 생성합니다.

  • Django: Gunicorn을 사용하려면 애플리케이션 콜러블(애플리케이션 서버가 코드와 통신하는 데 사용하는 것)을 진입점으로 바인딩해야 합니다. 이 콜러블은 Django 애플리케이션의 wsgi.py 파일에 선언됩니다. 이 바인딩을 달성하기 위해 Dockerfile의 마지막 줄은 다음과 같습니다.

    CMD ["gunicorn", "--bind", "0.0.0.0:8000", "{workspace_folder_name}.wsgi"]
    

    프로젝트가 Django의 기본 프로젝트 구조(즉, 작업 영역 폴더와 해당 작업 영역과 동일한 이름의 하위 폴더 내의 wsgi.py 파일)를 따르지 않는 경우, 올바른 wsgi.py 파일을 찾기 위해 Dockerfile에서 Gunicorn 진입점을 덮어써야 합니다.

    wsgi.py 파일이 루트 폴더에 있는 경우, 위의 명령에서 마지막 인수는 "wsgi"입니다. 하위 폴더의 경우 인수는 "subfolder1_name.subfolder2_name.wsgi"가 됩니다.

  • Flask: Gunicorn을 사용하려면 애플리케이션 콜러블(애플리케이션 서버가 코드와 통신하는 데 사용하는 것)을 진입점으로 바인딩해야 합니다. 이 콜러블은 생성한 Flask 인스턴스의 파일 위치변수 이름에 해당합니다. Flask 공식 문서에 따르면, 사용자는 일반적으로 메인 모듈이나 패키지의 __init__.py 파일에 다음과 같은 방식으로 Flask 인스턴스를 생성합니다.

    from flask import Flask
    app = Flask(__name__) # Flask instance named app
    

    이 바인딩을 달성하기 위해 Dockerfile의 마지막 줄은 다음과 같습니다.

    CMD ["gunicorn", "--bind", "0.0.0.0:5000", "{subfolder}.{module_file}:app"]
    

    Containers: Add Docker Files to Workspace... 명령 중에 Flask 인스턴스의 경로를 구성하지만, 컨테이너 도구 확장은 Flask 인스턴스 변수의 이름이 app이라고 가정합니다. 그렇지 않은 경우 Dockerfile에서 변수 이름을 변경해야 합니다.

    메인 모듈이 루트 폴더에 main.py라는 파일로 있고 Flask 인스턴스 변수 이름이 myapp이었다면, 위의 명령에서 마지막 인수는 "main:myapp"이 됩니다. 하위 폴더의 경우 인수는 "subfolder1_name.subfolder2_name.main:myapp"이 됩니다.

컨테이너 빌드, 실행 및 디버그

Containers: Add Docker Files to Workspace... 명령은 컨테이너를 디버그 모드로 빌드하고 실행하기 위한 Docker 실행 구성을 자동으로 생성합니다. Python 앱 컨테이너를 디버그하려면

  1. 앱의 시작 코드가 포함된 파일로 이동하여 중단점을 설정합니다.

  2. 실행 및 디버그로 이동하여 적절한 Containers: Python - General, Containers: Python - Django 또는 Containers: Python - Flask를 선택합니다.

    Selected container debug configuration

  3. F5 키를 사용하여 디버깅을 시작합니다.

    • 컨테이너 이미지가 빌드됩니다.
    • 컨테이너가 실행됩니다.
    • Python 디버거가 중단점에서 멈춥니다.
  4. 이 줄을 한 번 건너뜁니다.

  5. 준비가 되면 계속을 누릅니다.

컨테이너 도구 확장이 무작위로 매핑된 포트로 브라우저를 엽니다.

Django website launches

: 이미지 태그 변경과 같은 Docker 빌드 설정을 수정하려면 dockerBuild 특성의 .vscode -> tasks.json으로 이동합니다. 파일 내에서 IntelliSense(⌃Space (Windows, Linux Ctrl+Space))를 사용하여 다른 모든 유효한 지시어를 표시합니다.

컨테이너 탐색기 사용

컨테이너 탐색기는 컨테이너, 이미지 등과 같은 컨테이너 자산을 검사하고 관리하는 대화형 환경을 제공합니다. 예시를 보려면

  1. 컨테이너 탐색기로 이동합니다.

  2. Containers 탭에서 컨테이너를 마우스 오른쪽 버튼으로 클릭하고 View Logs를 선택합니다.

    Viewing the logs of a container

  3. 출력이 터미널에 표시됩니다.

Azure에서 이미지 빌드

Azure Container Registry: Build Image in Azure 명령을 사용하여 Azure App Service 또는 Azure Container Apps에 배포할 이미지를 빌드할 수 있습니다.

  1. Azure 리소스 확장을 설치합니다. 명령 팔레트(⇧⌘P (Windows, Linux Ctrl+Shift+P))를 열고 Azure: Sign In 명령을 검색합니다. Azure 계정이 없다면 무료 체험판에 가입할 수 있습니다.

  2. Azure에서 빌드 명령을 호출하는 방법은 두 가지입니다. Dockerfile을 마우스 오른쪽 버튼으로 클릭하고 Build Image in Azure를 선택할 수 있습니다. 또는 명령 팔레트(⇧⌘P (Windows, Linux Ctrl+Shift+P))를 사용하여 Azure Container Registry: Build Image in Azure 명령을 검색할 수 있습니다.

    Invoke the command Build Image in Azure

  3. 빌드된 이미지의 이름과 태그를 선택합니다. 컨테이너 레지스트리에서 이 이미지를 식별하는 데 사용할 것입니다.

    Choose the name and tag for the built image.

  4. 사용하려는 Azure 구독을 선택합니다.

  5. 기존 Azure Container Registry를 선택하거나 새 레지스트리를 만듭니다. 새 레지스트리를 만들 때 이름, 리소스 그룹, 위치 및 가격 책정 옵션(기본, 표준 또는 프리미엄)을 제공하도록 요청받습니다. 이러한 옵션의 비용은 가격 책정 - Container Registry에서 확인할 수 있습니다.

  6. 기본 OS(Linux 또는 Windows)를 지정합니다. 이 선택은 Dockerfile과 일치해야 합니다.

    Choose the base OS for the built image

이미지 빌드 프로세스는 몇 분 정도 걸릴 수 있습니다. 터미널에서 진행 상황을 추적할 수 있습니다. 오류(Error: failed to download context.)가 발생하는 경우 컨테이너 레지스트리에서 새로 고침 옵션을 사용해보고 다시 빌드를 요청해 보세요. 다시 빌드하기 전에 이전 이미지를 수동으로 삭제하세요.

Azure App Service 또는 Azure Container Apps에 배포

컨테이너 이미지가 빌드되면 지정한 태그와 함께 컨테이너 레지스트리에 표시됩니다. 이제 Azure App Service 또는 Azure Container Apps에 배포할 수 있습니다. Azure App Service에 대한 배포에는 Azure App Service 확장이 권장되며, Azure Container Apps에 대한 배포에는 Azure Container Apps 확장이 필요합니다. 다양한 Azure 개발 시나리오를 위한 도구 패키지를 포함하는 Azure Tools 확장 팩을 설치하면 두 확장 모두 얻을 수 있습니다.

  1. 이미지 태그를 마우스 오른쪽 버튼으로 클릭하고 Deploy Image to Azure App Service 또는 Deploy Image to Azure Container Apps를 선택합니다.

    Deploy image to Azure App Service

  2. 웹 사이트 이름을 입력합니다. 이 이름은 고유해야 하며, Django 앱의 경우 settings.py 파일의 ALLOWED_HOSTS 목록에 유효한 호스트 이름으로 등록되어야 합니다.

  3. 리소스 그룹, 위치 및 App Service Plan을 제공합니다. 막 시작하는 경우 무료 플랜을 선택할 수 있습니다.

  4. 이미지가 배포됩니다. 이 프로세스는 몇 분 정도 걸릴 수 있습니다. 배포가 완료되면 사이트에 액세스할 수 있는 버튼이 포함된 알림이 나타납니다. 사이트 주소인 {appname}.azurewebsites.net(여기서 {appname}은 생성 시 제공한 이름)을 사용할 수도 있습니다. 처음 작동하지 않으면 몇 분 후에 다시 시도해 보세요. 처음 몇 번의 시도가 시간 초과되거나 오류를 반환하는 것은 드문 일이 아닙니다. 이는 App Service가 아직 요청을 받을 준비가 되지 않았음을 의미합니다.

  5. 페이지 중 하나에 표시되는 애플리케이션 코드에 작은 변경을 하고 파일을 저장합니다.

  6. Azure 아이콘을 사용하여 리소스 보기를 열고 구독 노드를 확장하여 이전 단계에서 배포한 App Service를 찾습니다.

  7. App Service 노드를 마우스 오른쪽 버튼으로 클릭하고 사용 가능한 옵션을 살펴봅니다. Deploy to Web App을 선택한 다음 앱 폴더를 지정하여 배포합니다.

    Deploy to Web App

    이전 배포를 덮어쓴다는 경고가 표시되면 Deploy를 선택하여 확인합니다.

    몇 분 정도 걸릴 수 있습니다. 터미널 창에서 진행 상황을 모니터링할 수 있습니다. 완료되면 사이트에 액세스할 수 있는 버튼이 제공됩니다.

    Browse website button

    버튼을 사용하여 사이트에 변경 사항이 반영되었는지 확인합니다.

축하합니다! VS Code에서 Python을 사용하여 클라우드에 호스팅되고 인터넷에 게시되는 웹 사이트를 생성하고 배포했습니다!

리소스 정리

Azure 포털에서 이 연습 중에 생성한 모든 리소스를 해제하기 위해 리소스 그룹을 삭제합니다.

다음 단계

완료되었습니다! 이제 컨테이너를 준비했으므로 다음을 수행할 수 있습니다:

© . This site is unofficial and not affiliated with Microsoft.