Django, Docker 및 PostgreSQL 자습서

이 강좌에서는 Docker와 PostgreSQL을 사용하여 새 Django 프로젝트를 만듭니다.Django는 내장된 SQLite 지원과 함께 제공되지만 로컬 개발에서도 PostgreSQL과 같은 운영 중인 데이터베이스와 일치하는 "진실"데이터베이스를 사용하는 것이 좋습니다.
Postgres.app와 같은 도구를 사용하여 로컬에서 PostgreSQL을 실행하는 것은 가능하지만, 현재 많은 개발자들이 사용하는 것이 가장 우선이다Docker. 이것은 독립된 운영체제를 만드는 데 사용되는 도구이다.가장 간단한 방법은 이를 대형 가상 환경으로 간주하는 것이다. 그 중에서 Django 프로젝트에 필요한 모든 것을 포함한다. 의존항, 데이터베이스, 캐시 서비스와 기타 필요한 도구이다.
Docker를 사용하는 중요한 이유 중 하나는 로컬 개발 설정을 둘러싼 모든 문제를 완전히 없앴기 때문입니다.어떤 패키지가 설치되어 있거나 프로젝트 옆에서 로컬 데이터베이스를 실행할 염려가 없습니다. 전체 프로젝트의 Docker 이미지만 실행하면 됩니다.가장 중요한 것은 이를 그룹에서 공유하고 팀 개발을 더욱 간단하게 할 수 있다는 것이다.

Docker 설치


첫 번째 단계는 로컬 컴퓨터에 데스크톱 Docker 응용 프로그램을 설치하는 것입니다.
  • Docker for Mac
  • Docker for Windows
  • Docker for Linux
  • Docker의 초기 다운로드에는 시간이 좀 걸릴 수 있습니다.이것은 큰 서류다.이 점에서 다리를 마음대로 뻗으세요!
    Docker 설치가 완료되면 정확한 버전이 실행 중인지 확인할 수 있습니다.터미널에서 명령docker --version을 실행합니다.
    $ docker --version
    Docker version 19.03.5, build 633a0ea
    
    Docker Compose는 Docker의 Mac과 Windows 다운로드에 자동으로 포함되는 추가 도구입니다.그러나 Linux를 사용하는 경우 수동으로 추가해야 합니다.Docker 설치가 완료되면 명령sudo pip install docker-compose을 실행하여 작업을 완료할 수 있습니다.

    Django 프로젝트


    우리는 Message Board app 중의 Django for Beginners 을 사용할 것이다.이것은 관리자에서 업데이트할 수 있는 SQLite의 기본 게시판 응용 프로그램을 사용하는 코드를 제공합니다.
    데스크톱에 새 디렉터리를 만들고 리포를 복제합니다.
    $ cd ~/Desktop
    $ git clone https://github.com/wsvincent/djangoforbeginners.git
    $ cd djangoforbeginners
    $ cd ch4-message-board-app
    
    그리고 Pipenv 지정된 패키지를 설치하고 새 셸을 시작합니다.(ch4-message-board-app)를 보면 가상 환경이 활성 상태임을 알 수 있습니다.
    $ pipenv install
    $ pipenv shell
    (ch4-message-board-app) $
    
    이러한 변경 후 migrate 우리의 데이터베이스를 확보하십시오.
    (ch4-message-board-app) $ python manage.py migrate
    
    현재 python manage.py runserver 명령을 사용하고 있다면, http://localhost:8000 에서 저희 프로그램의 작업 버전을 볼 수 있습니다.

    Docker(다시)


    Docker가 이 점에서 설치를 완료했으면 합니다.설치가 완료되었는지 확인하려면 Control+c 를 사용하여 로컬 서버를 종료하고 명령줄에 docker run hello-world 을 입력합니다.다음과 같은 응답을 볼 수 있습니다.
    $ docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    d1725b59e92d: Pull complete
    Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image whi
    ch runs the executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client,
    which sent it to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container
    with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

    이미지 및 컨테이너


    Docker에서 이미지와 컨테이너라는 두 가지 중요한 개념을 파악해야 합니다.

  • 그림: 프로젝트의 모든 소프트웨어 패키지에 대한 설명 목록

  • 컨테이너: 이미지가 실행될 때 인스턴스
  • 다시 말하면 이미지는 발생할 일을 묘사하고 용기는 실제 운행하는 것이다.
    Docker 이미지와 컨테이너를 구성하려면 Dockerfiledocker-compose.yml 두 파일을 사용합니다.Dockerfile 이미지의 명령 목록, 즉 용기 환경에서 실제로 발생하는 일을 포함합니다.
    Dockerfile 파일을 만듭니다.
    (ch4-message-board-app) $ touch Dockerfile
    
    그리고 텍스트 편집기에 다음 코드를 추가합니다.
    # Dockerfile
    
    # Pull base image
    FROM python:3.7
    
    # Set environment variables
    ENV PYTHONDONTWRITEBYTECODE 1
    ENV PYTHONUNBUFFERED 1
    
    # Set work directory
    WORKDIR /code
    
    # Install dependencies
    RUN pip install pipenv
    COPY Pipfile Pipfile.lock /code/
    RUN pipenv install --system
    
    # Copy project
    COPY . /code/
    
    맨 위 줄에서 우리는 Python 3.7에 대해 하나official Docker image를 사용했다.다음은 두 개의 환경 변수를 만듭니다.PYTHONUNBUFFERED 우리의 콘솔 출력이 익숙해 보이고 Docker에 버퍼되지 않도록 하는 것은 우리가 원하지 않는 것이다.PYTHONDONTWRITEBYTECODE 파이썬이 우리가 원하지 않는 파일을 작성하려 하지 않는다는 것을 의미한다.
    다음 행은 .pycWORKDIR 로 설정합니다.이것은 작업 디렉터리가 /code에 있다는 것을 의미하기 때문에 앞으로 /code 같은 명령을 실행할 때 우리는 manage.py 코드가 Docker에 있는 정확한 위치를 기억할 필요가 없다.
    그리고 의존항을 설치합니다. 최신 버전WORKDIR, 설치pip, 로컬pipenvPipfile을 Docker에 복사한 다음 이를 실행하여 의존항을 설치합니다.Pipfile.lock 명령은 명령줄에서처럼 Docker에서 명령을 실행할 수 있도록 합니다.
    다음은 새로운 RUN 파일이 필요합니다.이것은 Docker가 Docker 컨테이너를 실행하는 방법을 알려줍니다.
    (ch4-message-board-app) $ touch docker-compose.yml
    
    다음 코드를 입력합니다.
    version: '3.7'
    
    services:
      db:
        image: "postgres:11"
        volumes:
          - postgres_data:/var/lib/postgresql/data/
      web:
        build: .
        command: python /code/manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - 8000:8000
        depends_on:
          - db
    
    volumes:
      postgres_data:
    
    맨 윗줄에서 우리는 Compose의 most recent version, 즉 docker-compose.yml 을 사용했다.
    데이터베이스 3.7 에서 Postgres 10.1의 Docker 이미지가 필요하며, db 를 사용하여 Compose 용기가 Docker 용기에 있는 위치를 알려 줍니다.volumes에 대해 우리는 웹 서비스의 운행 방식을 지정했다.우선, Compose는 현재 디렉터리에서 이미지를 구축하고 web 에서 서버를 시작해야 한다.Compose가 코드를 0.0.0.0:8000 Docker 컨테이너에 저장하는 것을 알려주기 위해 volumes 를 사용합니다./code/ 구성을 통해 Docker 컨테이너의 포트 8000에 자체 포트 8000을 매핑할 수 있습니다.이것은 기본 Django 포트입니다.마지막으로 ports 웹 서비스를 실행하기 전에 우리는 먼저 depends_on 을 시작해야 한다고 말했다.
    마지막 부분db은 Compose에 규칙이 있기 때문에 최상위volumes 키에 명명된 볼륨을 표시해야 합니다.
    이제 Docker를 실행하는 것으로 전환하므로 가상 환경volumes을 사용할 수 있습니다.
    (ch4-message-board-app) $ exit
    $ 
    
    이제 exit 명령을 사용하여 Docker 컨테이너를 시작하고 분리 모드에서 실행할 수 있도록 up 로고를 추가하고 -d 로고를 추가하여 초기 이미지를 만듭니다.만약 우리가 이 로고를 추가하지 않았다면, 우리는 명령을 실행하기 위해 단독 명령행 옵션을 열어야 한다.
    $ docker-compose up -d --build
    
    Docker 준비됐어요!게시판 홈 페이지http://127.0.0.1:8000/에 방문하면 Docker를 통해 실행됩니다.

    PostgreSQL로 업데이트


    게시판 응용 프로그램을 업데이트하고 SQLite가 아닌 PostgreSQL을 사용해야 합니다.먼저 설치--build하여 데이터베이스를 PostgreSQL에 바인딩합니다.
    $ pipenv install psycopg2-binary
    
    그리고 psycopg2-binary 파일을 업데이트하여 SQLite가 아닌 PostgreSQL을 사용하도록 지정합니다.
    # settings.py
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'postgres',
            'USER': 'postgres',
            'HOST': 'db', # set in docker-compose.yml
            'PORT': 5432 # default postgres port
        }
    }
    
    이제 Docker에 데이터베이스를 만들어야 합니다.
    $ docker-compose exec web python manage.py migrate
    

    관리


    게시판 응용 프로그램에서 관리자를 사용해야 하기 때문에 Docker에 수퍼유저를 만듭니다.다음 명령을 실행하고 프롬프트를 입력합니다.
    $ docker-compose exec web python manage.py createsuperuser
    
    이제 http://127.0.0.1:8000/admin 로 이동하여 로그인합니다.관리자를 통해 새 게시물을 추가한 다음 홈 페이지에 표시할 수 있습니다 Django for Beginners.

    완료되면 Docker 컨테이너를 닫는 것을 잊지 마십시오.
    $ docker-compose down
    

    빠른 검토


    다음은 이 문서에서 설명한 용어와 개념의 간략한 버전입니다.

  • 그림: 프로젝트의 정의

  • 컨테이너: 프로젝트의 실제 실행 내용(이미지 실례)

  • Dockerfile: 이미지의 모양 정의

  • docker 작성.yml: Dockerfile을 수신하고 Docker 컨테이너가 생산 중인 행위에 대한 추가 설명을 추가하는 파일YAML
    우리는 Dockerfile을 사용하여 Docker가 우리의 이미지를 구축하는 방법을 알려 줍니다.그리고 우리는 하나의 용기에서 우리의 실제 프로젝트를 실행한다.부두 노동자가 글을 쓰다.yml 파일은 Docker 컨테이너가 생산 중인 행위에 대한 추가 정보를 제공합니다.

    다음 단계


    만약 당신이 Django와 Docker를 함께 사용하는 것에 대해 더 많은 정보를 알고 싶다면, 나는 이미 이 주제에 관한 책 Django for Professionals 을 한 권 썼다.
  • 좋은 웹페이지 즐겨찾기