DOCKER로 DJANGO + POSTGRES 로컬 세팅하기 #2

DOCKER로 DJANGO + POSTGRES 로컬 세팅하기 #2

이전 글: DOCKER로 DJANGO + POSTGRES 로컬 세팅하기 #1

1편을 쓴지 꽤 시간이 지난 것 같다. DB를 세팅한 후 django 이미지를 만들고 db까지 연결해보는 과정을 기록해본다.

바로 Dockerfile을 살펴보도록 하자.

Dockerfile 작성

FROM python:3.10.0

RUN apt-get -y update && apt-get install -y locales

RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
echo 'ko_KR UTF-8' >> /etc/locale.gen && \
echo 'ko_KR.UTF-8 UTF-8' >> /etc/locale.gen && \
echo 'en_US UTF-8' >> /etc/locale.gen && \
echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && \
locale-gen

ENV PYTHONUNBUFFERED 1
ENV DJANGO_SETTINGS_MODULE "config.settings/local"
ENV LANG en_US.utf8
ENV LC_ALL en_US.utf8

RUN mkdir /myapp
COPY . /myapp

WORKDIR /myapp

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

EXPOSE 8000

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
  1. python 이미지의 OS는 Debian이기 때문에 apt-get을 이용해 패키지를 설지할 수 있다. 패키지 레포지토리를 업데이트 한 후 locales를 설치한다.
  2. PostgreSQL 이미지와 동일하게 locale과 타임존을 세팅해주자.
  3. ENV를 키워드를 이용해 환경 변수를 추가해준다. 이후에 AWS ECS와 같은 컨테이너 서비스 세팅 시 기존 환경 변수를 덮어쓸 수 있다.
  4. 컨테이너 내에 myapp이라는 디렉토리를 만들고 파일을 복사한다. 그 뒤 WORKDIR 키워드로 /myapp을 기본 디렉토리로 지정한다.
  5. 프로젝트의 파이썬 의존성 라이브러리 설치를 진행한다. 예시에는 작성된 requirements.txt를 읽어서 라이브러리를 설치하지만 poetry와 같은 의존성 관리 라이브러리를 활용하는 것을 추천한다.
  6. EXPOSE 키워드로 외부와 통신할 포트를 지정해준다. 여기서는 Django의 기본 포트인 8000을 사용한다.
  7. 마지막으로 django 프로젝트를 실행하는 커맨드를 기재해준다.

Docker image 빌드

$ cd {Dockerfile이 있는 프로젝트 디렉토리}
$ docker build . -t myapp:1.0
$ docker images
  1. 터미널을 실행하여 작성된 Dockerfile이 존재하는 디렉토리로 이동한다.
  2. docker build 명령으로 현재 디렉토리에 있는 Dockerfile을 빌드한다. 이때 -t 옵션으로 태그를 지정해주면 이후에 이미지 식별이나 선택 지정이 용이해진다.
  3. docker images 명령으로 이미지가 잘 생성되었는지 확인할 수 있다.

Docker 컨테이너 실행

$ cd {프로젝트 디렉토리}
$ docker run -d -p 8000:8000 --name myapp --link my-db:postgres -v ./:myapp myapp:1.0
  1. 생성한 myapp:1.0 이미지를 이용해 컨테이너를 실행한다.
  2. http://localhost:8000으로 접근을 가능하게 하려면 -p 옵션으로 포트를 설정 해줘야한다. 80:8000으로 설정하는 경우 http://localhost로도 접근 할 수 있다. 80포트로 컨테이너의 8000번 포트를 포워딩하겠다는 의미가 된다.
  3. DB 컨테이너 연결을 위해 –link 옵션으로 db 컨테이너 이름과 종류를 기재한다. my-db라는 컨테이너명은 그 자체로 호스트가 될 수 있다. 따라서 어플리케이션의 DB 커넥션 호스트 정보에 localhost대신 my-db로도 사용이 가능하다.
  4. -v(–volume) 옵션으로 컨테이너 밖에 존재하는 로컬 소스코드에 볼륨을 지정한다. 이렇게 하지 않으면 코드가 수정될때마다 이미지를 다시 만들어야하기 때문이다.
%d 블로거가 이것을 좋아합니다: