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 컨테이너에서도 이런 파일들을 참조하기 위해서 다음 과정이 필요하다.
- python manage.py staticfiles로 static 파일 모아주기
- nginx.conf 파일에 static, media 위치 정보 작성해주기
- named Volume 생성하기
- 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 따라만들기 : 바닥부터 배포까지-박형석님 인프런 강의
2. ㅍㅍㅋㄷ - docker container 접속하기