Docker 컨테이너에서 Python 애플리케이션 실행 방법

DockerBeginner
지금 연습하기

소개

Docker 는 소프트웨어 개발 분야에서 혁명을 일으켰습니다. 개발자들이 애플리케이션과 종속성을 포터블하고 자립적인 단위인 컨테이너에 패키징할 수 있도록 해줍니다. 이 튜토리얼에서는 Docker 컨테이너에서 Python 애플리케이션을 실행하는 과정을 안내합니다. Docker 이해부터 컨테이너화된 애플리케이션 배포까지 필수적인 단계를 다룹니다.

Docker 이해

Docker 란 무엇인가?

Docker 는 개발자가 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 오픈소스 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 모든 것을 포함하는 경량, 독립적, 실행 가능한 소프트웨어 패키지입니다. 코드, 런타임, 시스템 도구 및 라이브러리가 포함됩니다. Docker 는 이러한 컨테이너를 패키징하고 배포하는 방법을 제공하여 다양한 환경에서 애플리케이션을 더 쉽게 배포하고 관리할 수 있도록 합니다.

Docker 사용의 이점

  1. 일관성: Docker 컨테이너는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장합니다.
  2. 확장성: Docker 는 컨테이너를 추가하거나 제거하여 필요에 따라 애플리케이션을 확장하거나 축소하는 것을 쉽게 만듭니다.
  3. 효율성: Docker 컨테이너는 기존 가상 머신보다 경량이며 컴퓨팅 리소스를 더 효율적으로 사용할 수 있습니다.
  4. 이식성: Docker 컨테이너는 개발, 테스트 및 프로덕션과 같은 서로 다른 환경 간에 복잡한 구성 변경 없이 쉽게 이동할 수 있습니다.

Docker 아키텍처

Docker 아키텍처는 Docker 클라이언트가 Docker 데몬과 통신하는 클라이언트 - 서버 모델을 기반으로 합니다. Docker 데몬은 Docker 컨테이너를 구축, 실행 및 관리하는 역할을 합니다. Docker 아키텍처의 주요 구성 요소는 다음과 같습니다.

graph LR A[Docker Client] -- Communicates with --> B[Docker Daemon] B -- Manages --> C[Docker Images] B -- Manages --> D[Docker Containers] B -- Manages --> E[Docker Volumes] B -- Manages --> F[Docker Networks]

Docker 시작하기

Docker 를 시작하려면 시스템에 Docker 엔진을 설치해야 합니다. 공식 Docker 웹사이트 (https://www.docker.com/get-started) 에서 Docker 를 다운로드하여 설치할 수 있습니다. 설치 후 docker 명령줄 인터페이스 (CLI) 를 사용하여 Docker 데몬과 상호 작용하고 컨테이너를 관리할 수 있습니다.

다음은 Docker 를 사용하여 간단한 "Hello, World!" 컨테이너를 실행하는 예입니다.

$ docker run hello-world

이 명령은 Docker Hub 레지스트리에서 hello-world 이미지를 가져와 새 컨테이너를 생성하고 컨테이너 내에서 애플리케이션을 실행합니다.

Python 애플리케이션 컨테이너화

Python 애플리케이션을 위한 Docker 이미지 구축

Docker 를 사용하여 Python 애플리케이션을 컨테이너화하려면 Docker 이미지를 생성해야 합니다. Docker 이미지는 애플리케이션 실행에 필요한 모든 것을 포함하는 경량, 독립적, 실행 가능한 패키지입니다. 코드, 런타임, 시스템 도구 및 라이브러리가 포함됩니다.

다음은 간단한 Python 애플리케이션을 위한 Docker 이미지를 생성하는 방법의 예입니다.

  1. 프로젝트를 위한 새 디렉터리를 만들고 터미널에서 해당 디렉터리로 이동합니다.

  2. app.py라는 새 파일을 만들고 다음 Python 코드를 추가합니다.

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return 'Hello, LabEx!'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
  3. Dockerfile이라는 새 파일을 만들고 다음 내용을 추가합니다.

    FROM python:3.9-slim
    WORKDIR /app
    COPY . /app
    RUN pip install --no-cache-dir -r requirements.txt
    CMD ["python", "app.py"]

    이 Dockerfile 은 Python 애플리케이션을 위한 Docker 이미지를 구축하는 단계를 정의합니다. python:3.9-slim 기본 이미지로 시작하여 작업 디렉터리를 /app으로 설정하고, 애플리케이션 파일을 컨테이너로 복사하고, 필요한 종속성을 설치하며, app.py 스크립트를 실행합니다.

  4. requirements.txt라는 새 파일을 만들고 다음 종속성을 추가합니다.

    flask
  5. 다음 명령을 사용하여 Docker 이미지를 구축합니다.

    $ docker build -t my-python-app .

    이 명령은 태그 my-python-app으로 Docker 이미지를 구축합니다.

Docker 컨테이너에서 Python 애플리케이션 실행

Docker 이미지를 생성한 후 다음 명령을 사용하여 Docker 컨테이너에서 Python 애플리케이션을 실행할 수 있습니다.

$ docker run -p 5000:5000 my-python-app

이 명령은 my-python-app 컨테이너를 실행하고 컨테이너의 포트 5000 을 호스트의 포트 5000 으로 매핑합니다.

이제 웹 브라우저를 열고 http://localhost:5000으로 이동하여 Python 애플리케이션에 액세스할 수 있습니다. "Hello, LabEx!" 메시지가 표시되어야 합니다.

Docker 컨테이너 배포

Docker 이미지 레지스트리에 이미지 업로드

Docker 컨테이너를 배포하려면 Docker Hub 또는 프라이빗 레지스트리와 같은 레지스트리에 Docker 이미지를 먼저 업로드해야 합니다. 이렇게 하면 다른 환경에 애플리케이션을 공유하고 배포할 수 있습니다.

다음은 my-python-app 이미지를 Docker Hub 에 업로드하는 방법입니다.

  1. https://hub.docker.com에서 Docker Hub 계정을 만듭니다 (아직 만든 경우).

  2. docker login 명령을 사용하여 Docker Hub 에 로그인합니다.

    $ docker login

    프롬프트에 Docker Hub 사용자 이름과 비밀번호를 입력합니다.

  3. 로컬 my-python-app 이미지에 Docker Hub 사용자 이름과 태그 (예: latest) 를 지정합니다.

    $ docker tag my-python-app username/my-python-app:latest
  4. 태그가 지정된 이미지를 Docker Hub 에 업로드합니다.

    $ docker push username/my-python-app:latest

이제 Docker 이미지가 Docker Hub 레지스트리에 사용 가능해져 다른 시스템에서 가져와 배포할 수 있습니다.

Docker 컨테이너 배포

프로덕션 환경에서 Docker 컨테이너를 배포하려면 Kubernetes 또는 Docker Swarm 과 같은 컨테이너 오케스트레이션 플랫폼을 사용할 수 있습니다. 이러한 플랫폼은 애플리케이션의 확장, 로드 밸런싱 및 컨테이너 수명주기 관리 기능을 제공합니다.

다음은 Docker Swarm 을 사용하여 my-python-app 컨테이너를 배포하는 방법의 예입니다.

  1. Docker Swarm 클러스터를 초기화합니다.

    $ docker swarm init
  2. my-python-app 컨테이너를 위한 새 서비스를 만듭니다.

    $ docker service create --name my-python-app -p 5000:5000 username/my-python-app:latest

    이 명령은 my-python-app이라는 이름의 새 서비스를 만들고 username/my-python-app:latest 이미지를 실행하며, 컨테이너의 포트 5000 을 호스트의 포트 5000 으로 매핑합니다.

  3. 여러 복제본으로 서비스를 확장합니다.

    $ docker service scale my-python-app=3

    이 명령은 my-python-app 서비스를 3 개의 복제본으로 확장하여 애플리케이션의 고가용성과 로드 밸런싱을 제공합니다.

  4. 서비스 상태를 모니터링합니다.

    $ docker service ls
    $ docker service logs my-python-app

    이러한 명령은 my-python-app 서비스의 상태를 확인하고 로그를 검사할 수 있도록 합니다.

Docker Swarm 과 같은 컨테이너 오케스트레이션 플랫폼을 사용하면 프로덕션 환경에서 Docker 컨테이너를 쉽게 관리, 확장 및 배포할 수 있습니다.

요약

이 튜토리얼을 마치면 Docker 에 대한 확실한 이해와 Python 애플리케이션을 컨테이너화하는 능력을 갖추게 됩니다. Docker 이미지를 구축하고 컨테이너를 실행하며 일관성 있고 안정적이며 확장 가능한 방식으로 애플리케이션을 배포하는 방법을 배우게 됩니다. Python 개발에 Docker 를 마스터하면 작업 흐름을 간소화하고 애플리케이션의 이식성과 관리를 용이하게 할 수 있습니다.