DOCKER로 DJANGO + POSTGRES 로컬 세팅하기 #2
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"]
- python 이미지의 OS는 Debian이기 때문에 apt-get을 이용해 패키지를 설지할 수 있다. 패키지 레포지토리를 업데이트 한 후 locales를 설치한다.
- PostgreSQL 이미지와 동일하게 locale과 타임존을 세팅해주자.
- ENV를 키워드를 이용해 환경 변수를 추가해준다. 이후에 AWS ECS와 같은 컨테이너 서비스 세팅 시 기존 환경 변수를 덮어쓸 수 있다.
- 컨테이너 내에 myapp이라는 디렉토리를 만들고 파일을 복사한다. 그 뒤 WORKDIR 키워드로 /myapp을 기본 디렉토리로 지정한다.
- 프로젝트의 파이썬 의존성 라이브러리 설치를 진행한다. 예시에는 작성된 requirements.txt를 읽어서 라이브러리를 설치하지만 poetry와 같은 의존성 관리 라이브러리를 활용하는 것을 추천한다.
- EXPOSE 키워드로 외부와 통신할 포트를 지정해준다. 여기서는 Django의 기본 포트인 8000을 사용한다.
- 마지막으로 django 프로젝트를 실행하는 커맨드를 기재해준다.
Docker image 빌드
$ cd {Dockerfile이 있는 프로젝트 디렉토리} $ docker build . -t myapp:1.0 $ docker images
- 터미널을 실행하여 작성된 Dockerfile이 존재하는 디렉토리로 이동한다.
- docker build 명령으로 현재 디렉토리에 있는 Dockerfile을 빌드한다. 이때 -t 옵션으로 태그를 지정해주면 이후에 이미지 식별이나 선택 지정이 용이해진다.
- docker images 명령으로 이미지가 잘 생성되었는지 확인할 수 있다.
Docker 컨테이너 실행
$ cd {프로젝트 디렉토리} $ docker run -d -p 8000:8000 --name myapp --link my-db:postgres -v ./:myapp myapp:1.0
- 생성한 myapp:1.0 이미지를 이용해 컨테이너를 실행한다.
- http://localhost:8000으로 접근을 가능하게 하려면 -p 옵션으로 포트를 설정 해줘야한다. 80:8000으로 설정하는 경우 http://localhost로도 접근 할 수 있다. 80포트로 컨테이너의 8000번 포트를 포워딩하겠다는 의미가 된다.
- DB 컨테이너 연결을 위해 –link 옵션으로 db 컨테이너 이름과 종류를 기재한다. my-db라는 컨테이너명은 그 자체로 호스트가 될 수 있다. 따라서 어플리케이션의 DB 커넥션 호스트 정보에 localhost대신 my-db로도 사용이 가능하다.
- -v(–volume) 옵션으로 컨테이너 밖에 존재하는 로컬 소스코드에 볼륨을 지정한다. 이렇게 하지 않으면 코드가 수정될때마다 이미지를 다시 만들어야하기 때문이다.