도커란?

Posted on 2021-08-25 by GKSRUDTN99
Django로 웹사이트 만들기 장고

컴퓨터마다 환경이 다르기 때문에, 내 컴퓨터에서 작업한 결과가 다른 컴퓨터에서도 똑같이 동작한다는 보장은 없다.

다른 하드웨어와 운영체제에서 작업하더라도 동일한 환경을 갖출 수 있도록 도와주는 기술이다.


도커의 작동원리

1. 도커 설정 파일에 운영체제, 파이썬 버전, 라이브러리, 소스 코드, 이미지 파일 등 웹 사이트 배포에 필요한 환경설정 정보를 모두 지정한다.

2. 그 후에 도커를 실행하면 도커 설정 파일에서 지정한 대로 서버 전체를 온전히 복제한 컨테이너 이미지가 생성된다.

3. 컨테이너 이미지를 작동시키면 컨테이너가 실행되면서 기존과 동일한 상태로 웹 사이트 서버를 실행한다.

컨테이너 이미지에는 서버 전체가 온전히 담기기 때문에 다른 컴퓨터에서 도커를 설치하고 이 이미지를 복제해서 작동하기만 하면 기존과 동일한 상태로 웹 사이트 서버를 실행할 수 있다.


도커 설치하기

Docker homepage에서 Docker Desktop을 받아 설치한다.


도커 파일 만들기

1. 모듈 리스트 만들기

pip freeze > requirements.txt를 이용해 가상환경에 설치한 라이브러리들을 리스트로 만들어 저장한다.

2. 도커 설정 파일 만들기

프로젝트 폴더에 Dockerfile을 만들고 다음과 같이 작성한다.

# pull official base image
FROM python:3.8.0-alpine

# set work directory
WORKDIR /usr/src/app

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update
RUN apk add postgresql-dev gcc python3-dev musl-dev zlib-dev jpeg-dev

COPY . /usr/src/app/
# install dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

FROM python:3.8.0-alpine

도커는 파이썬이 설치되어 있는 이미지를 기본으로 제공합니다. 이 이미지를 불러옵니다.

WORKDIR /usr/src/app

프로젝트의 작업 폴더를 /usr/src/app으로 지정합니다.

ENV PYTHONDONTWRITEBYTECODE 1

파이썬 .pyc 파일을 생성하지 않도록 합니다.

ENV PYTHONUNBUFFERED 1

파이썬 로그가 버퍼링 없이 즉각적으로 출력하게 만듭니다.

RUN apk update RUN apk add postgresql-dev gcc python3-dev musl-dev zlib-dev jpeg-dev

라이브러리들을 설치하기 위해 필요한 gcc, musl-dev 등을 미리 설치한다.

COPY . /usr/src/app/

로컬 컴퓨터의 현재 위치(Dockerfile이 있는 위치)에 있는 파일을 모두 /usr/src/app(작업 폴더)로 복사한다.
이 과정을 통해 작성한 장고 프로젝트가 도커 이미지에 담기게 한다.

RUN pip install --upgrade pip RUN pip install -r requirements.txt

requirements.txt에 나열된 라이브러리들을 설치한다.


도커 컴포즈 파일 만들기

도커 컴포즈 파일을 통해 컨테이너 여러 개를 한 번에 실행할 수 있고, 컨테이너를 실행할 때 옵션도 줄 수 있다.

docker-compose.yml 파일을 만들고 다음과 같이 작성한다.

version: '3'

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./:/usr/src/app/
    ports:
      - 8000:8000
  env_file:
    - ./.env.dev

version: '3'

도커 컴포즈 파일 포맷을 최신 버전으로 사용하겠다는 의미이다. 특별한 이유가 없으면 3으로 고정한다.

web

여기서는 web이라는 이름의 서비스 하나만 실행한다.

build

현재 폴더를 build한다 앞에서 만든 Dockerfile이 현재 폴더에 있으므로 이 파일을 이용해 컨테이너 이미지를 만든다.

command

터미널에서 직접 입력했던 서버 실행 명령을 대신 입력한다.

volumes

로컬 컴퓨터의 폴더와 도커의 폴더를 연결한다. 현재 폴더를 /usr/src/app/ 폴더와 연결한다.

ports

이전과 똑같이 8000번 포트를 사용한다.

env_file

환경 파일을 .env.dev와 .env.prod로 나누어 관리할 때, 어떤 환경 파일을 사용할 지 지정하는 부분이다.


settings.py 수정하고 개발환경 파일 작성하기

개발환경 파일(.env.dev)를 사용할 수 있도록 settings.py를 다음과 같이 수정한다.

이 과정을 로컬에서 개발중일 때와 실제 서비스를 할 때 settings.py를 다르게 적용하기 위한 과정이다.

os.environ.get()으로 개발환경 파일에서 값을 읽어올 수 있을 때는 그 값을 사용하고, 없으면 두 번째 매개변수 값을 활용한다.

# settings.py
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY', '**********')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = int(os.environ.get('DEBUG', 1))

if os.environ.get('DJANGO_ALLOWED_HOSTS'):
    ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS').split(' ')
else:
    ALLOWED_HOSTS = []

ALLOWED_HOSTS

HOST로 허용하는 주소를 적어두는 곳이다.
서비스로 공개할 때는 보안을 위해 서버가 될 URL만 남겨놓는 것이 맞다.
반면에 개발할 때는 127.0.0.1이나 localhost로 장고에 접근할 수 있어야 한다.

.env.dev 파일 만들기

DEBUG = 1
SECRET_KEY = **********
DJANGO_ALLOWED_HOSTS = localhost 127.0.0.1 [::1]

도커 컨테이너 실행하기

docker-compose build로 이미지를 만든다.

docker-compose up으로 컨테이너를 실행한다.

docker-compose up을 할 때 -d 옵션을 주면 백그라운드에서 컨테이너를 실행한다.

docker image ls로 이미지들을 검색할 수 있다.

docker container ls로 컨테이너들을 검색할 수 있다.

docker-compose exec <컨테이너 이름> <명령>을 통해 컨테이너 안에 명령어를 전달할 수 있다.

예시 : docker-compose exec web python manage.py test

docker-compose down으로 실행중이 컨테이너를 중단한다.