emluy 개발 일기

Trip surfer - # 0 Docker Django PostgreSQL 본문

웹 개발/project

Trip surfer - # 0 Docker Django PostgreSQL

yulme 2020. 10. 13. 21:21
SMALL

<시작하기 전>

*왜 docker를 사용할까?

- django 환경을 docker img로 만드는 이유 : 우리가 django project를 할 때 가상환경 만들어주고 접속하고 django설치하고 하는것들을 docker img에 넣어주면 img실행하는 것만으로도 자동으로 우리가 해 줄 일을 해주니까 편리하다.

 

*Trip surfer에서는 docker로 뭘 해줘야할까?

- django 환경을 담은 docker img를 생성해주고

- django docker img와 postgresql docker img를 각각 실행하여 컨테이너로 만든 후

- 컨테이너가 2개 이상이므로 한꺼번에 두개의 컨테이너를 실행해야 한다. ( 도커 컴포즈 이용해야 함 )

 

*도커와 도커 컴포즈는 뭐가 다른가?

- 둘다 도커 파일을 만들어주고 빌드하고 컨테이너를 실행하는 과정은 같다.

- 그러나 도커로 할 경우, postgreSQL 컨테이너를 먼저 실행해주고 django 환경 컨테이너를 실행해줘야 db 컨테이너를 django환경 컨테이너가 찾아서 연결할 수 있다. (왜냐면 컨테이너는 실행 직후 외부의 상황과 완벽 격리되기때문에 다른 컨테이너가 실행되고 있는지 여부를 알지 못한다. 따라서 postgreSQL컨테이너를 먼저 실행해주면서 db라는 이름을 붙이고 그 후 django 컨테이너가 db라는 이름으로 접근하게 해서 두 컨테이너를 연결한다.)

- 따라서 도커 컴포즈를 이용해서 여럿을 함께 띄우는 것이다. 컨테이너 간 의존성을 docker-compose.yml 파일에 적어 실행한다. ( version 3이후 부터는 link 옵션이 없어도 서로 한 네트워크에서 자동으로 연결된다.)

 

  • dockerfile vs dockerfile-dev: 서버 구성 문서화한 것
  • docker build vs docker-compose build : 도커 이미지 만들기 ( 클래스 선언을 애플리케이션에 로드)
  • Docker run 의 옵션들 vs docker-compose.yml : img에 붙이는 것들 ( 컨테이너(인스턴스)의 변수들 )
  • docker run vs docker-compose up : 컨테이너 생성 및 실행 (인스턴스 생성)

==============================================================================

 

0. 미리 해야할 것

*순서

0-1. django project 생성

0-2. Docker GUI사용 위한 애플리케이션 설치

subicura.com/2017/01/19/docker-guide-for-beginners-1.html

 

초보를 위한 도커 안내서 - 도커란 무엇인가?

도커를 처음 접하는 시스템 관리자나 서버 개발자를 대상으로 도커 전반에 대해 얕고 넓은 지식을 담고 있습니다. 도커가 등장한 배경과 도커의 역사, 그리고 도커의 핵심 개념인 컨테이너와 이

subicura.com

 

 

1. root에 dockerfile 만들기

 

 

2.  root에 docker-compose.yml 만들기

 

2-1. web에 대한 컨테이너만 만들기

#docker-compose.yml

- 1 : Docker-compose 버전 3 사용

- 4 : web이라는 컨테이너 만들 것이다 ( 사용자 지정 )

- 5 : 루트에 존재하는 dockerfile 을 build 할 것이다.

- 6 : 컨테이너 완성 후 실행하는 커맨드

- 7 : 도커 실행 후 일어난 웹의 정보들을 루트아래에 있는 모든 파일에 각각 다시 저장되게 한다.

- 8 :  ":"를 기준으로 오른쪽은 도커에 존재하는 디렉터리, 왼쪽은 로컬저장소의 디렉터리 의미. 오른쪽에서 왼쪽으로 데이터 이동

. ( django 프로젝트의 루트) : web ( 도커안에 존재하는 폴더 , 사용자 지정 아님)  

- 9 : docker의 port와 로컬 port 연결

 

2-2. 컨테이너 실행

$ docker-compose up -d 

 

2-3. error 없는지 확인 

localhost:8000 접속 후 홈페이지 뜨는지 확인

 

2-4. PostgreSQL 연결해야하므로 지금까지 실행했던 컨테이너 종료

$ docker-compose down 

 

===========PostgreSQL 연결 전 web 컨테이너 오류 없이 작동하는지 확인============

 

 

 

<PostgreSQL 컨테이너 만들고 web 컨테이너와 연결>

3. docker-compose.yml 수정 : db 관련 코드 추가

- 14 : db 라는 이름으로 컨테이너 생성

- 15 : web은 우리 프로젝트에 맞게 만들어진 dockerfile을 build해서 img로 만들었지만 postgres는 만들어진 공식적인 img가 있으므로 그것을 가져와서 사용함

- 16 : web에서 했던 것과 마찬가지로 컨테이너를 종료하면 data도 함께 삭제되기 때문에 docker 실행하면서 docker위에서 postgresql에 저장된 data를 로컬 저장소에도 저장해주어 데이터를 잃지 않도록 함

- 17 : 루트에 docker/data라는 폴더를 만들어서 (사용자지정) docker에 존재하는 폴더인 /var/lib/postgresql/data 폴더에 있는 데이터를 가져와서 저장한다.

18 : db 컨테이너에 적용할 옵션들 (공식문서 참고)

4. django project의 settings.py 수정 : 기본 db인 sqlite 말고 postgreSQL로 default 바꿔줌

=> 3번에서 작성했던 db의 environment에 적은 name, user, password, host와 같게 적어줘야함

5. psycopg2 설치 (doker-compose up -d 상태에서 해야함: docker 컨테이너 실행상태에서)

5-1. Docker 컨테이너에서 설치

$ docker-compose exec web pip install psycopg2

=> error log 확인 : $docker-compose logs

5-2. 내 로컬에도 설치

$ pip3 install psycopg2

6. psycopg2-binary 설치

$ docker-compose exec web pip install psycopg2-binary==2.8.5

 

 

7. 이전 컨테이너가 실행중이라면 이전 컨테이너 종료 시킴

$ docker-compose down

 

 

8. 다시 build 해서 psycopg2가 설치된 컨테이너 실행

$ docker-compose up -d --build 

 

 

9. 새로운 db인 postgreSQL 연결 했으니 migrate 해주고 createsuperuser 해줘야함.

9-1. migrate

$ docker-compose exec web python manage.py migrate

9-2. createsuperuser

$ docker-compose exec web python manage.py createsuperuser

 

 

 

 

 

===============참고자료========================

가장 잘 정리된 django와 docker-compose 연결하는 방법

djangoforprofessionals.com/postgresql/

 

Chapter 2: PostgreSQL | Django For Professionals

One of the most immediate differences between working on a “toy app” in Django and a production-ready one is the database. Django ships with SQLite as the default choice for local development because it is small, fast, and file-based which makes it eas

djangoforprofessionals.com

// docker와 postgres 공식문서 : 사용가능한 postgres 버전 확인 & postgres 컨테이너 실행시 옵션 

hub.docker.com/_/postgres?tab=description

 

postgres - Docker Hub

Supported tags and respective Dockerfile links 12.1, 12, latest 12.1-alpine, 12-alpine, alpine 11.6, 11 11.6-alpine, 11-alpine 10.11, 10 10.11-alpine, 10-alpine 9.6.16, 9.6, 9 9.6.16-alpine, 9.6-alpine, 9-alpine 9.5.20, 9.5 9.5.20-alpine, 9.5-alpine 9.4.25

hub.docker.com

==============================그외 참고=================================

//local에서 postgreSQL 이용

dongsik93.github.io/til/2019/10/13/til-django-postgresql/

 

Django에 postgreSQL 연결하기 - 동식이 블로그

Django에 postgreSQL 연결하기

dongsik93.github.io

docker-compose 작성 순서

stackoverflow.com/questions/32805224/django-db-utils-operationalerror-could-not-connect-to-server-no-such-file-or-d

 

django.db.utils.OperationalError: could not connect to server: No such file or directory

my setting of database in settings.py is below DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'dbname', 'USER': 'postgres', ...

stackoverflow.com

learndjango.com/tutorials/django-docker-and-postgresql-tutorial

 

Django, Docker, and PostgreSQL Tutorial

Set up a new Django project using Docker and PostgreSQL.

learndjango.com

 

반응형
Comments