Django에서 Docker 사용하기

Woosang·2021년 10월 14일
3
post-thumbnail

들어가기 앞서

Docker란?

  • Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼이다.
  • Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다.
  • Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행됨을 확신할 수 있다.

Docker 작동 방식

  • 코드를 실행하는 표준 방식을 제공
  • 가상 머신이 서버 하드웨어를 가상화하는 방식과 비슷하게 컨테이너는 서버 운영 체제를 가상화한다.

Docker를 사용해야 하는 이유

  • 빠른 코드 전달, 애플리케이션 운영 표준화, 원활한 코드 이동, 리소스 사용률 증대로 비용 절감
  • Docker를 사용하면 어디서나 안정적으로 실행할 수 있는 단일 객체를 확보하게 됨

Udemy 강의 참고
AWS 참고

Django에서 Docker 사용하기

Dockerfile 생성


  • project root directory에 Dockerfile 생성!

Docker image 구하러 가기

  • 이제 Docker image 구하러 가기 (dockerhub <- 여기서 탐색!)

  • dockerhub회원가입 후 원하는 docker image를 searchbar에 검색(e.g python, ubuntu 등등) -> 나의 경우 python!

  • python card를 클릭해 안으로 들어가면 simple tags들이 많이 있는데 이중에 alpine은 light weight이기 때문에 동작이 빠르다! -> 나의 경우 3.7-alpine을 사용 예정

이미지 구했으니 Docker file로

  • 다시 에디터로 들어와 작성하기

코드 작성 전에 전체 코드!

한줄한줄 의미 알아가기

  • 첫번째 줄에 FROM <내가 원하는 docker 이미지> 작성

    in Dockerfile

    # docker 기반이 될 이미지
    FROM python:3.7-alpine

  • 도커의 환경변수?설정! ENV <>(여기서는 모든 문자를 대문자로!)

    in Dockerfile

    ENV PYTHONUNBUFFERED 1
    • 도커 컨테이너 안에서 python을 실행할 때 unbuffered mode를 추천
    • buffer의 아웃풋을 허용하지 않고 바로 프린트를 해준다.
    • python이 실행될 때 도커이미지와 관련된 것들의 일부 충돌을 막아준다.

  • dependencies를 위한 코드 넣기! COPY <복사할 친구> <도커 컨테이너에 붙여넣기할 친구>
  • 후에 아래단계에서 만들예정

    in Dockerfile

    COPY ./requirements.txt /requirements.txt
    • root 경로에 있는 requirements.txt파일을 컨테이너에 requirements.txt로 복사

  • 필요한 라이브러리 설치 실행!

    in Dockerfile

    RUN pip install -r /requirements.txt
    • 컨테이너 안에서 실행할 command line

  • docker application을 실행했을 때 default directory 지정하기
  • 이 친구도 아래 단계에서 생성(app)

    in Dockerfile

    RUN mkdir /app
    WORKDIR /app
    COPY ./app /app
    • 현재 경로에 빈 디렉토리 생성(/app)
    • default directory 변경
    • 로컬에 있는 app디렉토리를 container에 복사!

  • user 설정 유저 생성 -D : 프로젝트 안에서 프로세스 실행 시 유저 생성

    in Dockerfile

    RUN adduser -D user
    USER user
    • 보안을 목적으로 설정
    • default인 root 계정으로 도커 이미지를 실행하는 것을 추천하지 않음
    • 만약 root 계정으로 실행 시 누군가 application을 손상시키면 전체 이미지에 대한 root access 권한을 가질 수 있고 악의 적인 행위 외의 작업을 수행 할 수 있게 된다.

다시 한번 전체 코드!

이제 Dockerfile을 완성했으니 필요한 것들 만들기

  • 필요한 것 -> container에 복사하겠다고 한! requirements.txt, app/
  • root 디렉토리에 이렇게 준비하기! requirements.txt에 들어갈 라이브러리는 원하는 것들!!

프롬프트에서 Docker build하기

  • 프로젝트 디렉토리에서 cmd를 켠 후 명령어 입력하면 쭈루룩 올라가면서 빌드가 된다.

    docker build .

이제 dockerfile Build 끝

docker compose configuration 만들고 실행하기

Docker compose란?!

  • Docker image를 쉽게 실행하기 위한 툴이다!
  • 하나의 서버에서는 Python을 다른 서버에는 DataBase를 실행 할 수 있다.

docker-compose 파일 생성하기

  • 프로젝트 root경로에 docker-compose.yml파일 생성

  • 첫줄에 Docker compose의 version을 설정

    version: "3"

  • 서비스를 설정한다! (services에)

    services:

    • 다음줄에 서버 이름을 설정
  • 서비스 이름! 나의 경우 app

    services:
      app:
    • 서비스 이름 안에 요소들을 채운다.(build, ports, volumes, command)
  • 요소들
    - build : container에 빌드할 것들 설정(context: . : 은 project root에 있는 것들 전부 build한다는 뜻)

    • ports : container에서의 post 설정(로컬과 매핑하기)
    • volumes : 프로젝트가 업데이트되면 docker를 재실행할 필요없이 자동으로 container에 업데이트 된다.(로컬과 매핑)
    • command : docker container환경에서 실행할 command 설정
      • (> -> 다음 줄에 쓰겠다는 의미, sh -> shell을 의미, -c -> command를 의미)
  • services:
      app:
        build:
          context: .
        ports:
          - "8000:8000"
        volumes:
          - ./app:/app
        command: >
          sh -c "python manage.py runserver 0.0.0.0:8000"

docker-compose build

  • project 경로에서 cmd로 명령어 입력
  • docker-compose build

Docker에서 Django project 생성하기

  • project root경로에서 명령어 실행

  • docker-compose run app sh -c "django-admin.py startproject config ."

  • docker-compose run <docker-compose.yml의 services에 설정한 이름나의 경우 app> sh -c "명령어"

  • dockerfile에 working directory를 app으로 설정해주었기 때문에 app에서 django 명령어가 실행이 된다.

  • app directory안에 django project가 이쁘게 생성된 것을 볼 수 있다.

끝!

  • 앞으로 계속 추가해 나강 예정

0개의 댓글