Docker로 Django 프로젝트 설정

🐍



우리 모두는 원하더라도 Django가 응용 프로그램에 적합하다는 것을 알고 있습니다. Docker를 사용하면 대화가 더 좋아집니다!

개발 속도를 높일 수 있을 뿐만 아니라 응용 프로그램을 위한 환경을 개선하고 완성할 수 있는 프로젝트의 초기 설정을 보여 드리는 것은 어떻습니까?

관심 있는? 그러니 계속 읽고 나머지는 저에게 맡기세요.

요구 사항


  • 파이썬
  • 도커

  • ✅시작



    테스트 애플리케이션을 사용하여 개발 환경을 만들 예정이지만 이 설정은 모든 프로젝트에 적용됩니다.

    변경 사항에 유의하십시오.

    1 - 먼저 venv 환경을 시작합니다.

    python -m venv venv && source ./venv/bin/activate
    


    2 - 이제 종속 항목을 설치합니다(걱정하지 마세요. 각각 수행할 작업을 알려드리겠습니다).

    pip install django black python-dotenv psycopg2-binary
    


    종속성 파일을 만드는 것을 잊지 마십시오.

    pip freeze > requirements.txt
    



  • Django --> 주요 프레임워크

  • black --> Python 코드 포맷터

  • python-dotenv --> Python-dotenv는 .env 파일에서 키-값 쌍을 읽고 환경 변수로 설정할 수 있습니다.

  • psycopg2-binary --> Python용으로 가장 많이 사용되는 PostgreSQL 데이터베이스 어댑터

  • 팁:


  • MySQL, MariaDB 및 파생 유형의 경우 mysqlclient 사용

  • 3 - 앱을 초기화해 보겠습니다.

    django-admin startproject your_fantastic_name .
    


    4 - .env 파일 생성:

    작업 공간의 루트로 이동하여 다음 값으로 .env 파일을 생성합니다.

    # App
    
    SECRET_KEY=your_ultra_secret_key
    # 1 = True or 0 = False
    DEBUG=
    # localhost 127.0.0.1 0.0.0.0 ...
    HOSTS=
    
    # POSTGRES
    POSTGRES_DB=
    POSTGRES_USER=
    POSTGRES_PASSWORD=
    
    # PGADMIN
    PGADMIN_DEFAULT_EMAIL=
    PGADMIN_DEFAULT_PASSWORD=
    




    나중에 이 값이 유용할 것입니다.

    5 - 애플리케이션 구성:

    먼저 settings.py 파일에 있는 애플리케이션의 핵심으로 이동하고 일부 가져오기를 추가하겠습니다.

    기본적으로 경로는 이미 가져왔지만 python-dotenv 패키지를 사용하기 위해 가져오기를 두 개 더 추가해 보겠습니다.

    # settings.py
    from pathlib import Path
    from dotenv import load_dotenv
    
    import os
    


    그리고 바로 아래에서 os를 사용하여 프로젝트를 구성합니다.

    # settings.py
    
    load_dotenv()
    BASE_DIR = Path(__file__).resolve().parent.parent
    
    SECRET_KEY = os.getenv("SECRET_KEY")
    DEBUG = int(os.getenv("DEBUG", default=0))
    ALLOWED_HOSTS = os.getenv("HOSTS").split(" ")
    


    팁 2:


  • html 및 css와 함께 Django를 사용하려는 사람들을 위해 모든 정적 파일을 템플릿 폴더에 넣고 싶습니다.

  • # settings.py
    TEMPLATES = [
        {
            "BACKEND": "django.template.backends.django.DjangoTemplates",
            "DIRS": [os.path.join(BASE_DIR, "templates")],
            "APP_DIRS": True,
            "OPTIONS": {
                "context_processors": [
                    "django.template.context_processors.debug",
                    "django.template.context_processors.request",
                    "django.contrib.auth.context_processors.auth",
                    "django.contrib.messages.context_processors.messages",
                ]
            },
        }
    ]
    


  • Rest-Framework를 사용할 사람을 위해 앱에 대한 구성은 다음과 같습니다.

  • # settings.py
    REST_FRAMEWORK = {
        "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
        "PAGE_SIZE": 5,
        "DEFAULT_RENDERER_CLASSES": ["rest_framework.renderers.JSONRenderer"],
        "DEFAULT_PARSER_CLASSES": [
            "rest_framework.parsers.JSONParser",
            "rest_framework.parsers.FormParser",
        ],
        "DEFAULT_THROTTLE_CLASSES": [
            "rest_framework.throttling.AnonRateThrottle",
            "rest_framework.throttling.UserRateThrottle",
        ],
        "DEFAULT_THROTTLE_RATES": {"anon": "15/min", "user": "20/min"},
    }
    


    6 - Django에서 데이터베이스 설정:

    이 맥락에서 저는 postgres를 독점적으로 사용하여 연결을 구성하기 위해 다음 값으로 DATABASE 객체를 수정하기만 하면 됩니다.

    # settings.py
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.postgresql",
            "NAME": os.getenv("POSTGRES_DB"),
            "USER": os.getenv("POSTGRES_USER"),
            "PASSWORD": os.getenv("POSTGRES_PASSWORD"),
            "HOST": "db",
            "PORT": 5432,
        }
    }
    


    더 많은 팁:


  • 이는 선택 사항이지만 정적 파일 및 언어 등에 대한 기타 구성을 저장하는 데 권장됩니다.

  • # settings.py
    LANGUAGE_CODE = "pt-BR"
    TIME_ZONE = "America/Sao_Paulo"
    USE_I18N = True
    USE_TZ = True
    
    STATIC_URL = "static/"
    STATICFILES_DIRS = (os.path.join(BASE_DIR, "templates/static"),)
    STATIC_ROOT = os.path.join("static")
    
    MEDIA_URL = "media/"
    MEDIA_ROOT = os.path.join(BASE_DIR, "media")
    
    DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
    




    도커 설정 🌊



    먼저 앱용 빌드가 필요합니다. 빌드해 보겠습니다.

    # Image of python with Debian
    FROM python:3.9-bullseye
    
    # Set Workdir
    WORKDIR /usr/src/app
    
    # Envs for don't generate pycache
    ENV PYTHONDONTWRITEBYTECODE 1
    ENV PYTHONUNBUFFERED 1
    
    # Some important libs
    RUN apt update && apt upgrade -y \
        && apt install gcc python3-dev musl-dev bash build-essential libssl-dev libffi-dev -y
    
    # Upgrade pip, copy requirements and install all the project dependencies
    RUN pip install --upgrade pip
    COPY ./requirements.txt .
    RUN pip install -r requirements.txt
    
    # Entrypoint gonna be useful when we up the container
    COPY entrypoint.sh .
    RUN sed -i 's/\r$//g' /usr/src/app/entrypoint.sh
    RUN chmod +x /usr/src/app/entrypoint.sh
    
    # Copy all the files for the root dir
    COPY . .
    
    ENTRYPOINT ["/usr/src/app/entrypoint.sh"]
    


    이제 모든 도구와 앱을 구성하려면 작성 파일이 필요합니다.

    version: "3"
    
    services:
      web:
        build: .
        container_name: "web-app-server"
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/usr/src/app/
        ports:
          - 8000:8000
        networks:
          - postgres
        env_file:
          - ./.env
        depends_on:
          - db
    
      db:
        image: postgres:13.0-alpine
        container_name: "postgres-db-server"
        volumes:
          - postgres_data:/var/lib/postgresql/data/
        environment:
          - POSTGRES_USER=${POSTGRES_USER}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
          - POSTGRES_DB=${POSTGRES_DB}
        networks:
          - postgres
        env_file:
          - ./.env
    
      pgadmin:
        container_name: "pgadmin-django-server"
        image: dpage/pgadmin4
        environment:
          - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
          - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
        volumes:
          - pgadmin:/root/.pgadmin
        ports:
          - "5050:80"
        networks:
          - postgres
        env_file:
          - ./.env
        depends_on:
          - db
    
    
    volumes:
      postgres_data:
      pgadmin:
    
    networks:
      postgres:
        driver: bridge
    


    알고 계시다면 Compose는 데이터베이스 이름, 사용자 이름, 비밀번호 등과 같이 .env 파일에 정의한 값을 읽습니다.

    파일에 어떤 값이 정의되어 있는지 확실하지 않은 경우 터미널에서 명령docker-compose config을 실행하면 모든 값으로 구성이 표시됩니다.



    마지막으로 진입점 파일

    #!/bin/sh
    
    # entrypoint.sh
    
    # Verify if the database is connected
    if [ "$DATABASE" = "postgres" ]
    then
        echo "Waiting for postgres..."
    
        while ! nc -z $SQL_HOST $SQL_PORT; do
          sleep 0.1
        done
    
        echo "PostgreSQL started"
    fi
    
    # Delete all the tables
    python manage.py flush --no-input
    # Do a new migrate
    python manage.py migrate
    
    exec "$@"
    


    예, 더 많은 팁 😄:


  • 보안을 위해 빌드에서 일부 폴더를 제외하기 위한 파일.dockerignore을 추가합니다.

  • venv
    


    이제 앱을 시작하겠습니다 🎯



    약간의 명령만 내리면 됩니다.

    docker-compose up
    




    이것으로 3개의 컨테이너, 데이터베이스, pgAdmin 및 자체 애플리케이션을 모두 쉽게 사용자 정의하고 새로운 도구를 구현할 수 있는 설정으로 업로드하게 됩니다.

    의심스러운 경우 "도커로 내 애플리케이션에 어떻게 액세스할 수 있습니까?", 간단합니다. 도커를 사용하면 모든 것을 할 수 있습니다!

    첫 번째 유형:

    docker ps
    


    컨테이너의 ID를 가져오고 다음을 수행합니다.

    docker exec -it id_of_container bash
    




    이제 간단한 방법으로 애플리케이션을 개발할 수 있습니다. :)

    이제 결과를 볼 수 있습니다!



    이 튜토리얼을 통해 특별한 터치로 Django 애플리케이션을 만드는 데 도움이 되었기를 바랍니다.

    다음에 만나요!

    좋은 웹페이지 즐겨찾기