본문 바로가기
관리자

Programming-[Backend]/Django

Django로 Pinterest 따라 만들기[2부 Docker] - 19. Nginx, staticfiles, Docker Network, Docker Volume

728x90
반응형

 

 

 

1. Docker Volume : 파일 참조 연동하기

 

Docker Volume 설정

이제 마지막 단계로 Docker Volume을 이용해서 nginx 컨테이너와 docker-gunicorn 컨테이너간에 파일 참조를 공유하게 만들어준다. 우선 nginx container를 수정해보자.

 

portainer - Containers - nginx 클릭

Duplicate/edit 클릭

 

Volumes에서 아래 사진과 같이 설정한다. Bind Volume 형태로 container 상의 /etc/nginx/nginx.conf 파일과 host 서버(여기서는 로컬 PC) 상의 ~/nginx.conf 파일을 서로 참조하고, 연동되도록 하겠다는 것이다!

 

 

Nginx로 접속

Docker network, Docker volume 설정이 끝났다. localhost:80 또는 포트번호를 안적고 접속해보면 nginx가 요청을 django-gunicorn:8000으로 전달하여 정상적으로 서버에 접근할 수 있는 것을 확인할 수 있다.

 

 

 


 

2. Bind Volume과 Named Volume의 차이, Volume으로 static 참조 연동하기

 

위 사진에서 프로젝트의 디자인이 정상적으로 작동하지 않는 것은 django-gunicorn 프로젝트에서 참조로하고 있는 static, media 파일들을 nginx에서는 못 읽어들이기 때문이다. nginx 컨테이너에서도 이런 파일들을 참조하기 위해서 다음 과정이 필요하다.

 

  1. python manage.py staticfiles로 static 파일 모아주기
  2. nginx.conf 파일에 static, media 위치 정보 작성해주기
  3. named Volume 생성하기
  4. named Volume에 nginx, django-gunicorn간 참조 걸어주기

 

 

 

staticfiles

다른 곳에서 django의 static 파일들을 참조할 수 있도록 staticfiles(settings.py에서 설정한 STATIC_ROOT 경로)로 staticfile들을 모아주어야 한다. 'python manage.py staticfiles' 명령어를 실행한다.

 

또한 django container에서도 이것을 실행할 수 있도록 Dockerfile에 'RUN echo yes | python manage.py collectstatic' 구문을 추가해준다(이전 글에서 미리 추가해뒀었다). echo yes 구문은 staticfiles 디렉토리가 이미 존재하는 경우 디렉토리에 속해있는 파일들을 덮어쓸 것인지에 대해 yes로 입력하는 구문이다.

 

FROM python:3.9.0

WORKDIR /home/

RUN git clone https://github.com/CJ0823/inflearn_study_django_pinterest.git

WORKDIR /home/inflearn_study_django_pinterest/

RUN pip install -r requirements.txt

RUN pip install gunicorn

RUN echo "SECRET_KEY=django-insecure-$ioa*(%5%p#1&c(as*nqzw7xpo(g8l6ovb_&d+x-+(-pdyo&z+" > .env

RUN python manage.py migrate

RUN echo yes | python manage.py collectstatic

EXPOSE 8000

CMD ["gunicorn", "pragmatic.wsgi", "--bind", "0.0.0.0:8000"]

 

 

 

 

 

nginx.conf 파일 수정 및 반영

다음과 같이 수정하여 static, media 파일들의 위치 정보를 nginx에 알려준다.  include mime.types; 는 추후에 공부하자...

worker_processes auto;

events {
}

http {
    server {
        listen 80;
        
        include mime.types;
        
        location /static/ {
            alias /data/static/;
        }
        
        location /media/ {
            alias /data/media/;
        }

        location / {
            proxy_pass http://django_container_gunicorn:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

 

그리고 로컬에서 작성한 nginx.conf 파일이 nginx container에 참조되도록, nginx cotainer를 restart 해준다. (또는 위에서 한 것처럼 nginx.conf 파일을 docker cp 명령어로 덮어써주면 될지도...)

 

 

 

 

named Volume 생성

nginx.conf 파일 참조를 연동하기 위해서 bind volume을 사용한 것과 달리, static 과 media 파일은 named-volume을 사용할 것이기 때문에 volumes를 따로 만들어줄 것이다.

 

bind volume은 특정 위치에 있는 파일의 참조를 공유하는 것이고, named Volume 은 docker 내부에 하나의 volume을 만들고 container들에 공유하는 것이다. 특정 container가 없어져도 named volume은 데이터를 유지할 수 있다.

 

Volumes - add volume - media, static volume을 각각 만든다.

 

 

 

 

volume 참조 걸기

 

django-gunicorn container, nginx container에서 각각 해당 named volume을 참조하도록 아래와 같이 volumes 정보를 추가해준다.

 

django-gunicorn : 서버상(여기서는 로컬)의 staticfiles, media 파일 경로를 각 static, media volume에 매칭한다.

 

nginx : nginx container안의 /data/static 경로에 volume들을 매칭한다.

static, media 경로는 이렇게 volume을 설정하면서 자동으로 새로 생성된다. 원래는 data 디렉토리 내부에 static, media 디렉토리는 없었다! 즉 수기로 만들어준 경로이므로 이렇게 했다는 것을 기억할 필요가 있다...

 

 

이제 localhost로 접속해도 서버가 잘 작동하는 것을 확인할 수 있다.

 

 

 

docker, network, volume 관련 내용을 그림으로 정리해보았다.

 

 

 

 


 

참조

1. 작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지-박형석님 인프런 강의

https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-%ED%95%80%ED%84%B0%EB%A0%88%EC%8A%A4%ED%8A%B8/dashboard

 

 

2. ㅍㅍㅋㄷ - docker container 접속하기

https://bluese05.tistory.com/21

728x90
반응형