Python 및 Flask로 첫 번째 웹 앱 도커화

13502 단어 pythondocker
의 두 번째 부분. 이번에는 동료( , )와 나( )가 Python 기술과 Flask 프레임워크로 웹 앱을 구축하고 도커화했습니다. 여기에서 방법을 설명합니다.

도커 아키텍처



먼저 세 개의 컨테이너로 도커 애플리케이션을 빌드해야 합니다.
  • ElasticSearch 이미지
  • 키바나 이미지
  • 웹 앱 이미지



  • ElasticSearch 및 Kibana의 경우 7.8.0 버전을 사용하여 DockerHub에서 사전 빌드된 이미지를 사용합니다. 웹 애플리케이션은 redis-alpine 이미지를 사용합니다.

    Note: The reason why using alpine, is because this alternative is smaller and more resource efficient than traditional GNU/Linux distributions (such as Ubuntu)



    필수 파일 및 구성



    GitLab에서 필요한 자료를 얻을 수 있습니다. 아래 이미지는 저장소를 복제하여 얻을 수 있는 다양한 파일을 보여줍니다.



    Docker-compose.yml 구조


    docker-compose.yml 파일은 이전 섹션에서 설명한 구조를 보여줍니다.

    
    version: '3'
    services:
      web:
        build: .
      ports:
        - 5000:5000
      networks:
        - elastic
    redis:
       image: "redis:alpine"
    es01:
       image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
       container_name: es01
       environment:
          - node.name=es01
          - cluster.name=es-docker-cluster
          - discovery.type=single-node
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
      ulimits:
        memlock:
            soft: -1
            hard: -1
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
      kib01:
        image: docker.elastic.co/kibana/kibana:7.8.0
        container_name: kib01
        ports:
          - 5601:5601
        environment:
          ELASTICSEARCH_URL: http://es01:9200
          ELASTICSEARCH_HOSTS: http://es01:9200
        networks:
          - elastic
    volumes:
      data01:
        driver: local
      data02:
        driver: local
      data03:
        driver: local
    networks:
      elastic:
        driver: bridge
    
    

    docker-compose.yml에 명시된 주요 태그를 살펴보자.
  • 포트: 도커가 실행되는 호스트 시스템 포트로 도커 포트를 구성합니다. 이 경우 5000, 5601 및 9200입니다.
  • 이미지: 필수 서비스를 위해 다운로드되는 도커 이미지
  • 네트워크: 세 가지 서비스를 연결하기 위해 '탄력적'이라고 이름이 지정되었습니다
  • .
  • 환경: RAM 메모리 매개변수와 같이 서비스 간 작동에 필수적인 환경 변수를 구성합니다. Kibana 서비스 내에서 Elasticsearch 서비스와 연결하기 위해서는 변수 ELASTICSEARCH_URLELASTICSEARCH_HOSTS 를 정의해야 합니다.

  • Dockerfile 구성


    Dockerfile에는 Elasticsearch 클러스터에서 데이터를 추출 및 저장하고 동시에 이전 시각화를 위해 Kibana에서 가져오는impact_dashboard.ndjson Python 스크립트와 연결하도록 웹 애플리케이션을 구성하는 데 필요한 단계가 있습니다.

    알파인 배포에서 실행되어 앱을 실행하는 데 필요한 폴더를 복사합니다. 또한 requirements.txt 덕분에 Python 스크립트에 필요한 모든 종속성을 추가할 수 있습니다.

    FROM python:3.7-alpine
    WORKDIR /code
    ENV FLASK_APP jitsi-data.py
    ENV FLASK_RUN_HOST 0.0.0.0
    RUN apk add --no-cache git
    RUN apk add --no-cache tk-dev
    RUN apk add --no-cache gcc musl-dev linux-headers
    COPY requirements.txt requirements.txt
    COPY mapping.json mapping.json
    COPY templates templates
    COPY impact_dashboard.ndjson impact_dashboard.ndjson
    RUN pip install -r requirements.txt
    EXPOSE 5000
    COPY . .
    CMD ["flask", "run"]
    
    


    컨테이너를 시작하는 방법



    애플리케이션을 시작하려면(docker 및 docker-compose가 이전에 설치됨) 터미널을 열고 다음 명령을 실행합니다.

    $ docker-compose up
    


    이렇게 하면 dockerfile에 명시된 다양한 명령이 시작되고 필요한 도커 이미지가 다운로드됩니다. 완료되면 Elasticsearch(localhost:9200) 및 Kibana(localhost:5601)가 성공적으로 실행되고 있는지 확인할 수 있습니다.

    이제 포트5000를 사용하여 Python Flask 애플리케이션 웹 앱이 있는 곳으로 이동할 시간입니다.


    start button를 클릭하면 Jitsi git 데이터에서 데이터 추출이 초기화되고(자세한 내용은 jitsi-data.py 확인) 해당 데이터가 ElasticSearch에 저장됩니다. 마지막으로 Kibana로 가져오기impact_dashboard.ndjson를 수행하여 대화식으로 데이터를 사용할 수 있습니다.

    프로세스가 완료되면 브라우저에 다음 메시지가 표시됩니다.



    물론 Elasticsearch 색인과 Kibana 대시보드가 ​​인스턴스에 성공적으로 추가되었는지 확인할 수 있습니다.





    기본적으로 시간 필터는 마지막 15분으로 설정됩니다. 시간 선택기를 사용하여 시간 필터를 변경하거나 페이지 상단의 히스토그램에서 특정 시간 간격 또는 시간 범위를 선택할 수 있습니다.



    et voilà 이제 팬데믹이 Jitsi 소프트웨어 개발 활동에 어떤 영향을 미칠 수 있는지 분석하기 위해 멋진 대시보드가 ​​실행되고 있습니다.

    보너스 포인트: Docker 허브에 Docker 이미지 업로드



    Docker Hub 계정이 있으면 dockerfile가 있는 이미지를 빌드할 수 있습니다. 다음을 입력하십시오.

    $ docker build -t dockerhubID/DockerHubreponame:imagetag .
    


    그런 다음 Docker Hub 리포지토리에 이미지를 업로드합니다(Docker Hub UI를 사용하여 리포지토리를 생성할 수 있음).

    $ sudo docker push dockerhubID/DockerHubreponame:imagetag
    


    이미지가 Docker Hub에 업로드되면 모든 사용자가 다음 docker-compose.yml로 앱을 사용하고 실행할 수 있습니다.

    version: '3'
    services:
      web:
        image: daviddp92/jitsi-data-extraction:1.0.0
        ports:
          - 5000:5000
        networks:
          - elastic
      es01:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
        container_name: es01
        environment:
          - node.name=es01
          - cluster.name=es-docker-cluster
          - discovery.type=single-node
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
      kib01:
        image: docker.elastic.co/kibana/kibana:7.8.0
        container_name: kib01
        ports:
          - 5601:5601
        environment:
          ELASTICSEARCH_URL: http://es01:9200
          ELASTICSEARCH_HOSTS: http://es01:9200
        networks:
          - elastic
    volumes:
      data01:
        driver: local
      data02:
        driver: local
      data03:
        driver: local
    networks:
      elastic:
        driver: bridge
    
    


    마무리 생각



    docker-compose를 사용하여 Python 기술과 Flask 프레임워크로 웹 앱을 dockerize하는 방법을 배웠습니다. 또한 Docker Hub 이미지를 사용하여 애플리케이션을 사용하고 실행하는 방법도 살펴보았습니다.

    이 프로젝트에 대해 어떻게 생각하세요? 무엇을 개선해야 합니까? 피드백 환영합니다 :)

    좋은 웹페이지 즐겨찾기