Docker로 django + postgres 로컬 세팅하기 #1

Docker로 django + postgres 로컬 세팅하기 #1

django/wsgi + nginx + postgres 로 구성된 서비스를 로컬로 세팅해볼 일이 생겨 잉여 시간을 투자해보기로 했다. 결론부터 말하자면 생각보다 시간이 많이 걸렸고 여기서 docker에 대해서 좀 더 깊이 있게 이해할 수 있었다. 늘상 이미 누군가가 만들어준 Dockerfile, 이미지만 사용하다가 직접 이미지를 만들어보니 감회가 새롭다.

이미 서비스 중인 프로덕트였고 개발 환경도 존재했으나 로컬 환경에서 작업을 하고 테스트를 해볼 수 있는 구성은 존재하지 않았다. 때문에 로컬 환경 구성이 필요했고 삽질이 예고되었다. 이런 삽질의 반복을 막기 위해 나는 Docker를 바로 떠올렸다.

Docker로 구성할 이미지는 단 2개이다. django를 올릴 python 이미지와 postgres를 구동시킬 postgres 이미지만 구성한다. nginx는 굳이 로컬에서까지 구동할 필요를 느끼지 못했다. 로컬 세팅의 목표는 어플리케이션을 띄우는 것이지 인프라까지 동일하게 맞출 필요는 없었기 때문이다. 인프라 검증은 이미 구축된 개발 환경에 올리면 그만이었다. 따라서 wsgi 역시 불필요했다.

그럼 작업할 범위는 어느 정도 추려냈다. 먼저 postgres 이미지부터 시도했다. 이유는 당연하지만 DB에 의존적인 서버 어플리케이션은 DB가 정상적으로 구동되고 커넥션을 맺어야 시작이 가능하기 때문.

Dockerfile의 구성은 아래와 같다.

FROM postgres:13.7

RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
    sed -i 's/# ko_KR.UTF-8 UTF-8/ko_KR.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen

ENV LANG = ko_KR.utf8 LC_COLLATE = C POSTGRES_INITDB_ARGS = --data-checksums

postgres 이미지를 만들기 위한 Dockerfile의 스크립트는 생각보다 길진 않지만 중요한 내용들이다. 저 명령과 환경 변수 설정은 모두 대한민국의 시간과 언어셋을 맞추기 위한 내용이고 국내에 서비스하고 있는 서버를 기준으로 한다면 공식 postgres 이미지를 있는 그대로 쓸 수가 없다. 타임존과 언어셋을 맞춰야한다.

FROM 커맨드는 굳이 설명이 필요가 없지만 postgres 공식 이미지의 13.7 버전을 사용하겠다는 뜻이고 사전에 해당 이미지를 pull 받아놔야 한다. 마이너버전까지 명시하는 것을 추천한다. 메이저 버전만 지정할 경우 마이너 버전은 최신버전을 따라가기 때문에 이미지를 pull 받을때 버전이 달라질 수 있다.

그 다음 커맨드부터가 해석이 필요한데 먼저 첫번째 RUN 커맨드에는 3가지 명령을 내포하고 있다. 먼저 ln 명령은 심볼릭 링크를 생성하는 구문인데 보통 리눅스에서 시스템 Timezone을 설정할때 사용한다.

sed 커맨드는 streamlined editor의 줄임말이라고 한다. 이 명령은 굳이 vi로 파일을 열어서 수정할 필요 없이 지정된 지점의 문자열 치환이나 입력을 할 때 사용된다. 이 구문에서는 치환 명령(s/)을 사용하고 있고 /etc/locale.gen 파일에서 “# ko_KR.UTF-8 UTF-8” 이라는 주석 처리된 부분을 “ko_KR.UTF-8 UTF-8″로 치환해서 주석을 해제하는 내용이다.

마지막으로 수정된 /etc/locale.gen을 locale-gen 명령으로 시스템 locale에 ko_KR.UTF-8을 추가한다. 이를 직접 확인해보고 싶으면 $ locale 또는 $ locales -a 명령으로 현재 활성화된 locale 정보를 알 수 있다.

마지막으로 ENV 명령이다. LANG은 시스템 언어셋을 의미한다. 이 것이 ko_KR.utf8로 설정되면 시스템 메시지 역시 한글로 표현된다. LC_COLLATE는 문자열 정렬 방식이다. 이는 C로 설정이 되어있는데 이유는 C로 설정할 경우 문자열의 바이트 순으로 정렬을 시켜준다. ko_KR.utf8로 설정해도 되지만 유의미한 영향은 없다 판단되어 바꾸지 않았다. 마지막으로 POSTGRES_INITDB_ARGS는 DB 초기화 구성 시 서버의 설정을 적용하기 위함이다. 데이터베이스 생성 시 이 옵션을 따라간다.

이렇게 postgres 이미지를 구성할 수 있다. docker build를 하고 docker run을 할때는 아래와 같이 옵션을 준다.

docker run -p 5432:5432 \				# 외부 port 바인딩
--name my-db \							# docker 컨테이너 이름 설정
-e POSTGRES_PASSWORD=1234 \				# 기본 계정(postgres) 패스워드 설정
-v ~/pgdata:/var/lib/postgresql/data \	# 재구동 시 데이터 유실을 방지하기 위한 외부 볼륨 설정
-d 8ee87023baba							# 실행할 docker 이미지 ID

-v (–volume) 옵션은 특히 docker 재구동 시 데이터가 유실되기 때문에 반드시 로컬 볼륨에 연결시켜주어야 한다.

쓰다보니 내용이 길어져 이번 글에는 postgres 이미지만 다뤄야겠다..


도움을 얻은 곳

https://www.postgresql.kr/blog/when_useing_docker_official_postgres_image.html

%d 블로거가 이것을 좋아합니다: