Python 응용 프로그램 비활성화

11251 단어 devopspythondocker

개요



Python은 비교적 유행하는 프로그래밍 언어로 백엔드 구축부터 신경 네트워크 구축까지 광범위하게 응용된다.그러나 위에서 알 수 있듯이 프로젝트 간에Python 환경의 일치성을 유지하는 것은 고통스러운 일일 수 있다.
이것이 바로 Docker의 용무지이다.Docker는 응용 프로그램의 용기화를 허용합니다. 이것은 서비스와 응용 프로그램을 실행할 수 있는 독립적인 실례를 의미합니다.또한 Docker는 응용 프로그램과 서비스를 Docker Compose와 연결할 수 있게 하여 Python 응용 프로그램의 구축을 매우 편리하게 합니다.
본고에서 인용한 모든 코드는 이 Github repo 에서 나온 것입니다.이것은 특정 버전의 코드가 아직 생산될 준비가 되지 않았지만, Docker를 통해 모든 내용을 실행할 수 있는 실시간 응용 프로그램입니다.

Docker가 뭐예요?


도커는 도대체 뭐야?나는 위에서 간단명료하게 그것을 소개했다. 앞에서 언급한 바와 같이, 그것은 일종의 소프트웨어로 응용 프로그램과 서비스를 포장할 수 있다.여러 버전의 Python을 설치하거나 사용하지 않고 여러 가상 환경을 관리하지 않아도 되고, Docker가 각각의 독립된 환경을 사용하여 각각의 응용 프로그램을 구축할 수 있다는 장점이 있습니다.
이것은 우리가 python -m venv venvDockerFile 파일을 설정하기만 하면 새 프로젝트를 구축할 때마다 실행할 필요가 없다는 것을 의미한다.

이미지, 컨테이너 및 합성


멋있어, 지금 우리는 빠른vocab를 개술해야 해.
먼저 Docker 이미지입니다.Docker의 이미지는 기본적으로 응용 프로그램의 변경할 수 없는 스냅샷입니다.새 용기에서 프로그램을 시작하는 설명을 포함하고 다른 이미지로 구축할 수 있습니다.불변성은 매우 중요하다. 왜냐하면 우리는 같은 응용 프로그램의 여러 버전을 가지고 이미지 버전을 충돌시키지 않기 때문이다.
두 번째는 Docker 컨테이너입니다.Docker 컨테이너는 이미지 기반 어플리케이션의 인스턴스입니다.위의 스냅샷 복제와 유사하여 공유할 수 없습니다.그러나 우리는 필요에 따라 임의의 특정 이미지의 Docker 컨테이너를 시작할 수 있습니다. 이것은 데이터베이스와 유사한 서비스에 매우 편리합니다!

Docker 설치


아직 없으면 설치Docker Desktop가 필요합니다.만약 당신이 그것을 가지고 그것을 어떻게 통과하는지 알고 있다면, 당신은 next section 으로 뛰어갈 수 있다.
Docker CLI를 사용하여 실행할 수 있는 명령도 간략하게 설명합니다.
  docker image ls
docker-compose.yml 컴퓨터에서 현재 사용 가능한 모든 이미지가 나열됩니다.
  docker container ls
docker image ls 현재 시작/활성 컨테이너가 모두 나열됩니다.
  docker container ls -a
docker container ls 모든 컨테이너가 시작되었든 활성 상태였든 나열됩니다.docker container ls -a 표지는 -a 의 줄임말이다.
  docker container rm <first 3 symbols of the container ID or container name> [...other containers you want to remove]
--all 나열된 컨테이너를 제거합니다.contaienr ID/용기 이름의 세 번째 기호가 필요하며, 용기를 삭제하기 전에 용기가 실행될 수 없습니다.
  docker [COMMAND] --help
도움말 플래그는 모든 명령과 함께 사용할 수 있는 유용합니다.이 명령을 사용하는 방법에 대한 일반적인 설명과 옵션 목록을 제공합니다.

Docker Env 설정


그렇긴 하지만 Docker env를 만들려면 뭔가가 필요합니다.
  • Docker에서 사용할 수 있는 응용 프로그램의 이미지를 만들어야 합니다
  • 응용 프로그램이 사용하는 모든 데이터베이스를 어떤 방식으로 조율해야 한다
  • 첫 번째, 이것이 바로 adocker container rm의 용도이다.Dockerfile는 응용 프로그램을 설정하고 실행하는 데 필요한 명령행 매개 변수를 정의하는 파일입니다.영어에서는 응용 프로그램을 설치하고 실행하는 데 필요한 최소한의 한도를 지정하는 파일입니다.
    다음은 Dockerfile의 예입니다.
    FROM python:3.8
    
    WORKDIR /src
    
    COPY ./requirements.txt .
    
    RUN pip install -r requirements.txt
    
    COPY . .
    
    EXPOSE 5000
    
    CMD ["flask", "run", "--host", "0.0.0.0"]
    

    Dockerfile에 뭐가 있어요.


    따라서 모든 것이 무엇인지 신속하게 요약해 보십시오.
    첫 번째 줄은 응용 프로그램의 이미지를Python 3.8 기반 이미지로 지정합니다.
  • 우리는 다른 이미지에서 우리의 이미지를 구축할 수 있기 때문에 이 점을 충분히 이용하고 있다
  • 더 많은 이미지 DockerHub
  • 우리는 사칭 뒤따르기 표시로 필요한 표시/버전을 지정하기 때문에 여기Dockerfile는 3.8 표시
  • 에서 Python을 지정합니다
    두 번째 줄은 용기의 작업 디렉터리를 설정합니다.이것은 매우 중요하다. 왜냐하면 이것은 우리 응용 프로그램의 파일이 있는 곳이기 때문이다.
    세 번째 줄은 python:3.8 파일을 우리의 작업 디렉터리에 복사합니다.우리는 한 번에 모든 내용을 복제할 수 있지만, 실제로는 중요한 원인이 하나 있다. 우리는 이렇게 하지 않는다. 이것은 아래에서 설명할 것이다.
    네 번째 줄은 우리가 열거한 모든 명령을 실행합니다.파이썬 패키지는 requirements.txt 파일에서 설치됩니다.
  • Docker는 NPM
  • 의 변경에 따라 필요할 수 있는 외부 패키지를 캐시하기 때문에 단독으로 이렇게 합니다.
  • 만약 우리가 이렇게 하지 않는다면, Docker는 매번 캐시된 패키지를 저장하여 절약할 수 있는 많은 시간을 낭비할 것이다
  • 다섯 번째 줄은 응용 프로그램 디렉터리의 나머지 파일을 작업 디렉터리로 복사합니다.원하는 경우 다음과 같이 다른 하위 디렉토리에 추가할 수도 있습니다.
    COPY . ./my-subdirectory
    
    여섯 번째 행위는 우리가 컨테이너에 접근하는 포트를 제공했다.그래서 여기는 5000포트입니다.
    마지막 줄은 용기가 시작될 때 실행되는 기본 명령을 설명합니다.명령의 모든 부분은 하나의 그룹에 있습니다.
  • 이 문자열 수조는 그것을 실현하는 가장 좋은 방법입니다. 우리는 모든 명령 부분을 큰따옴표 (") 에 포장해야 합니다. 왜냐하면 이것은 JSON 수조로 해석되기 때문입니다
  • Docker 작성


    멋있어요. 그럼 데이터베이스는요?물론 우리는 로컬에서 데이터베이스를 실행할 수 있지만, Docker에도 데이터베이스 이미지가 있기 때문에, 우리는 실제로 데이터베이스를 포함하는 용기를 임의로 실행할 수 있다.
    그러나 큰 문제가 하나 있다. 우리는 응용 프로그램이 의존하는 모든 서비스를 수동으로 만들고 시작하고 싶지 않다.물론 우리가 데이터베이스를 하나 가지고 있으면 되지만, 우리는 두 개의 다른 데이터베이스와 다른 데이터베이스를 필요로 하는 응용 프로그램/서비스가 있습니까?
    이것이 바로 requirements.txt의 의도이다.응용 프로그램이 의존하는 서비스 용기를 수동으로 시작하고 만들지 않고 requirements.txt 파일을 사용하여 대부분의 것을 자동화할 수 있습니다.
    다음 예제 링크 보기 package.json file.
    유감스럽게도 이것은 Docker Compose 파일을 만드는 완전한 안내서가 아니지만, 나는 일부 내용을 개괄할 것이다.
    따라서 파일에는 다음과 같은 내용이 있습니다.
    version: '3.5' # Docker compose version
    services:
      app:
        build:
          context: .
        # Binding the current working directory to the new container
        volumes:
          - .:/
        # The working directory in the app Dockerfile
        working_dir: ''
        command: ''
        links:
          - app-redis
        # ENV configuration
        env_file: .env
        # Additional app secrets
        environment:
          APP_TOKEN: /run/secrets/app_token
        secrets:
          - app_token
        ports:
          - '5000:5000'
      app-redis:
        image: redis:5
        ports:
          - '6379:6379'
    # App secret registration
    secrets:
      app_token:
        file: app_token.txt
    
    일반적으로 문서 작성에는 다음과 같은 세 가지 주요 부분이 있습니다.
  • 우리가 원하는 Docker Compose 버전
  • Docker Compose의 버전을 지정하는 것은 중요합니다. 일부 속성은 다른 버전에서 사용할 수 없기 때문에 Docker Compose v3 docs 자세한 내용을 보려면
  • 등록 서비스
  • 등록 컨테이너 기밀
  • 서비스 등록 섹션에는 다음과 같은 내용이 있습니다.
  • Python 애플리케이션 컨테이너 구성

  • 컨테이너를 다른 서비스에 연결(Redis)
  • 실시간으로 용기를 업데이트할 수 있도록 작업 디렉터리를 연결합니다
  • 추가.환경 파일
  • 애플리케이션 기밀 추가
  • 포트 노출 및 시작 명령
  • Redis 컨테이너 구성
  • 이미지를 추가하여
  • 에 따라 용기를 구축합니다.
  • 노출 포트
  • docker-compose 속성은 docker-compose.yml 서비스가 Python 응용 프로그램의 의존항임을 명확하게 나타낸다.이것은 우리가 Flask 응용 프로그램에서 데이터베이스에 접근하는 방식이 정상적인 상황과 다르다는 것을 의미하지만, 우리는 이 점을 할 것이다.

    저희 Python 응용 프로그램은 업데이트가 필요합니다.


    현재 우리는 이미 docker-compose.yml 개의 파일을 가지고 있으며, 우리가 상상하는 것처럼 우리의 Redis 실례에 접근할 수 없습니다.따라서 Python 응용 프로그램이 Redis 인스턴스에 액세스하도록 하려면 links 을 사용하지 않고 서비스 이름을 사용하도록 업데이트해야 합니다.
    # Fetch.py
    # Std lib imports
    import os
    import json
    from pathlib import Path
    
    ## Lib Imports
    import redis
    import requests
    from dotenv import load_dotenv
    
    # Global Module Var
    isDocker = os.getenv('IS_DOCKER')
    
    cacheHost = 'app-redis'
    # ...Extra code
    red_cache = redis.Redis(host = cacheHost, port = 6379)
    # ...Rest of the module's implementation
    
    매우 빠르고 간단합니다. 응용 프로그램 디렉터리에서 app-redis 을 실행하고 Flask 응용 프로그램을 시작할 수 있습니다.

    결론


    따라서 Python 응용 프로그램인 Dockerize를 신속하게 처리하는 방법을 정리했습니다.여기에는 다음이 포함됩니다.
  • Dockerfile을 만들 때 사용:
  • 어플리케이션 기반 이미지
  • 복제 중인 컨텐츠
  • 우리가 실행하고자 하는 모든 터미널 명령
  • 시작 명령
  • 노출될 포트
  • 다음과 같은 파일docker-compose.yml을 만듭니다.
  • Docker Compose 버전
  • 서비스 목록 작성 및 실행
  • 상기 서비스는 상호 연결 여부를 지정해야 합니다
  • 그 밖에 저희 Python 응용 프로그램의 서비스는 추가 기능이 있습니다.env 및 기밀 설정
  • 우리가 응용 프로그램에서 원하는 모든 비밀
  • 최종 결과는 로컬 시스템이 아닌 Docker에 의존하는 응용 프로그램입니다.이것은 매번 실행되고 설정이 일치하는 개발 환경을 만들었다.

    좋은 웹페이지 즐겨찾기