도커란?
컴퓨터마다 환경이 다르기 때문에, 내 컴퓨터에서 작업한 결과가 다른 컴퓨터에서도 똑같이 동작한다는 보장은 없다.
다른 하드웨어와 운영체제에서 작업하더라도 동일한 환경을 갖출 수 있도록 도와주는 기술이다.
도커의 작동원리
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