Django + MySQL 프로젝트 도커화

6473 단어 djangodocker
여기 계시다면 스테이징 및 프로덕션 환경과 일치하도록 개발 환경을 설정하기 위해 Docker를 사용하는 이점을 이미 수용했다고 가정합니다.

이 가이드에서는 하나의 Docker 컨테이너에서 Django 앱을 실행하고 다른 컨테이너에서 MySQL 데이터베이스를 실행하고 서로 통신하도록 하는 방법을 보여줍니다.

Docker Compose을 사용하여 이 두 컨테이너를 관리하고 실행할 것입니다.

👉 Django + Postgres 앱에서 이 작업을 수행하는 방법을 배우려면 this post을 읽으십시오.

로컬 데이터베이스를 사용하는 Django 프로젝트가 로컬에 이미 있고 프로젝트에 requirements.txt 파일이 있다고 가정합니다. 아직 하지 않았다면 install Docker on your machine 해야 합니다.

바로 시작하겠습니다.

첫 번째 단계는 프로젝트의 루트에 Dockerfile를 생성하는 것입니다(여기에 requirements.txtmanage.py 파일이 있음).

FROM python:3.8
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
COPY . /app


한 줄씩 살펴보겠습니다.
  • FROM python:3.8는 Docker 이미지가 구축될 기본 이미지입니다. 이는 DockerHub에서 가져옵니다.
  • ENV PYTHONUNBUFFERED 1 Django가 터미널에 쓰는 출력이 어딘가에 버퍼링되지 않고 실시간으로 나오도록 합니다. 이렇게 하면 Docker 로그가 유용하고 완전해집니다.
  • WORKDIR /app는 컨테이너 내에서 프로젝트의 루트가 될 app라는 새 폴더를 컨테이너에 만듭니다. 그런 다음 후속 명령이 실행될 작업 디렉토리로 설정합니다.
  • COPY requirements.txt /app/requirements.txt 로컬requirements.txt 파일을 Docker 컨테이너에 복사합니다.
  • RUN pip install -r requirements.txt는 컨테이너 내부에 모든 프로젝트 종속성이 설치되어 있는지 확인합니다.
  • COPY . /app 마지막으로 프로젝트의 콘텐츠를 Docker 컨테이너에 복사할 차례입니다.

  • 이제 로컬 프로젝트 루트에 새 파일을 만듭니다. 이것은 docker-compose.yml라고 하며 Docker Compose를 구성하는 데 사용됩니다.

    version: '3'
    services:
      db:
        image: mysql:8
        ports:
          - "3306:3306"
        environment:
          - MYSQL_DATABASE='mydatabase'
          - MYSQL_USER='root'
          - MYSQL_PASSWORD='some_password'
          - MYSQL_ROOT_PASSWORD='some_password'
          - MYSQL_HOST=''
        volumes:
          - /tmp/app/mysqld:/var/run/mysqld
          - ./db:/var/lib/mysql
      web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        ports:
          - "8000:8000"
        volumes:
          - .:/app
          - /tmp/app/mysqld:/run/mysqld
        depends_on:
          - db
    


    이것은 db와 web의 두 가지 서비스를 정의합니다.

    db는 DockerHub의 공식 MySQL 이미지를 사용합니다. 이 컨테이너의 포트 3306에 로컬 포트 ​​3306을 연결합니다. 그런 다음 MySQL에 필요한 여러 환경 변수를 설정합니다. Django 데이터베이스 설정에서도 이를 설정했는지 확인하십시오. (민감한 정보가 버전 제어에 커밋되지 않도록 이를 .env 파일에 넣을 수 있습니다. 자세한 방법은 here을 참조하십시오.)
    volume 두 개의 볼륨 매핑을 정의합니다.
  • 첫 번째는 컨테이너의 var/run/mysqld 내용을 시스템의 로컬 폴더에 매핑합니다. 이 파일에는 웹 서비스(Django 앱)가 데이터베이스 서비스와 통신할 수 있도록 하는 소켓 정보가 포함되어 있습니다.
  • ./db:/var/lib/mysql는 db 서비스를 제거하는 경우 데이터베이스 정보를 저장할 수 있도록 프로젝트 루트에 로컬db 폴더를 생성합니다.

  • 웹은 이전에 만든 Dockerfile를 사용하여 이미지를 빌드합니다. 그런 다음 Django 서버를 실행하고 컴퓨터에 포트 8000을 노출합니다. 로컬 프로젝트 폴더를 앱 폴더에 매핑하고 소켓 파일을 가져옵니다. 이 서비스가 db 서비스에 종속되어 있음을 Docker Compose에 알립니다.

    이제 우리가 해야 할 일은 모든 것을 시작하는 것입니다. 프로젝트 루트에서 다음을 실행합니다.

    $ docker-compose up
    


    그러면 이미지가 빌드되고 컨테이너가 시작됩니다. 브라우저를 열고 0.0.0.0:8000로 이동합니다. 앱이 표시되어야 합니다. 이제 새 터미널을 열고 adocker ps를 실행하면 웹 및 db 컨테이너가 실행 중인 것을 볼 수 있습니다.

    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES
    77a320233bf2        my_project_web      "python manage.py ru…"   4 minutes ago       Up 4 minutes        0.0.0.0:8000->8000/tcp       my_project_web_1
    66324c20d91e        mysql:8             "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        0.0.0.0:3306->3306/tcp       my_project_db_1
    


    Docker Compose를 중지하려면 첫 번째 터미널에서 Ctrl+C를 누르거나 다른 터미널의 프로젝트 루트 폴더에서 실행docker-compose stop하십시오.

    Django 컨테이너(웹)에서 manage.py 명령을 실행하려면:

    $ docker-compose run --rm web python manage.py migrate
    


    좋은 웹페이지 즐겨찾기