- 사용자들이 외부에서 접근하도록 설정하는 방법
nginx란?
- nginx는 클라이언트의 request 요청을 처리해주는 웹 서버(web server)
- reverse proxy, 로드밸런싱, 캐싱 등의 기능을 지원
- 클라이언트의 요청을 nginx가 받은 후 service(django) 데이터를 넘겨주는 역할
- 로드밸런싱을 활용해 트래픽을 분산
- SSL 기능으로 데이터를 안전하게 전달
- reverse proxy 기능을 통해 client에서 서버에 직접적으로 접근하는 것을 막아줌
- 콘텐츠를 캐싱하여 동일한 요청을 더 빠른 속도로 처리
docker-compose.yml
version: '3.8'
services:
nginx:
container_name : nginx
image: nginx:1.23.2
ports:
- "80:80" # http 포트포워딩
- "443:443" # https 포트포워딩
restart: always
컨테이너 동작 확인하기
실행중인 컨테이너 삭제
sudo docker ps -a : 확인
sudo docker rm -f {container id} : 삭제
컨테이너 실행
sudo docker compose up -d
sudo docker compose logs
nginx / postgresql / django 연동
- 이전 생성 컨테이너들을 연동하여 배포 환경 구성
nginx 설정파일 만들기
nginx/default.conf
server {
listen 80;
server_name _; # 모든 도메인 혹은 ip로 들어오는 요청에 대해 처리해 줍니다.
location / { # nginx로 요청이 들어왔을 때
proxy_pass http://backend:8000/; # backend 컨테이의 8000번 포트로 전달합니다.
}
location /static/ { # 브라우저에서 /static/ 경로로 요청이 들어왔을 때
alias /static/; # /static/ 경로에 있는 파일들을 보여줍니다.
}
location /media/ { # 브라우저에서 /media/ 경로로 요청이 들어왔을 때
alias /media/; # /media/ 경로에 있는 파일들을 보여줍니다.
}
}
backend/Dockerfile : psycopg2 추가
django/settings.py
import os
# 환경변수에 따라 DEBUG모드 여부를 결정합니다.
DEBUG = os.environ.get('DEBUG', '0') == '1'
# 접속을 허용할 host를 설정합니다.
ALLOWED_HOSTS = ['backend', ]
# postgres 환경변수가 존재 할 경우에 postgres db에 연결을 시도합니다.
POSTGRES_DB = os.environ.get('POSTGRES_DB', '')
if POSTGRES_DB:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': POSTGRES_DB,
'USER': os.environ.get('POSTGRES_USER', ''),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD', ''),
'HOST': os.environ.get('POSTGRES_HOST', ''),
'PORT': os.environ.get('POSTGRES_PORT', ''),
}
}
# 환경변수가 존재하지 않을 경우 sqlite3을 사용합니다.
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# CORS 허용 목록에 ec2 ip를 추가합니다.
CORS_ORIGIN_WHITELIST = ['http://{ec2_public_ip}']
# ex) CORS_ORIGIN_WHITELIST = ['http://43.201.72.190']
# CSRF 허용 목록을 CORS와 동일하게 설정합니다.
CSRF_TRUSTED_ORIGINS = CORS_ORIGIN_WHITELIST
디렉토리 구조
path : /home/ubuntu/
├── backend
│ ├── Dockerfile
│ └── django # project directory
├── docker-compose.yml
└── nginx
└── default.conf
이전 컨테이너 삭제
docker-compose.yml
version: '3.8'
volumes:
postgres: {}
django_media: {}
django_static: {}
services:
postgres:
container_name: postgres
image: postgres:14.5
volumes:
- postgres:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=P@ssw0rd
- POSTGRES_DB=django
restart: always
backend:
container_name: backend
build: ./backend/
entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn drf_project.wsgi --workers=5 -b 0.0.0.0:8000"
volumes:
- ./backend/django/:/app/
- /etc/localtime:/etc/localtime:ro
- django_media:/app/media/ # nginx에서 media를 사용할 수 있도록 volume을 지정해줍니다.
- django_static:/app/static/ # nginx에서 static을 사용할 수 있도록 volume을 지정해줍니다.
environment: # django에서 사용할 설정들을 지정해줍니다.
- DEBUG=1
- POSTGRES_DB=django
- POSTGRES_USER=user
- POSTGRES_PASSWORD=P@ssw0rd
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
depends_on:
- postgres
restart: always
nginx:
container_name : nginx
image: nginx:1.23.2
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- django_media:/media/ # django의 media를 사용할 수 있도록 volume을 지정해줍니다.
- django_static:/static/ # django의 static 사용할 수 있도록 volume을 지정해줍니다.
depends_on:
- backend
restart: always
sudo docker compose up -d --build
python manage.py shell
from django.db import connections
from pprint import pprint
pprint(connections.databases)
ctrl + d : exit
배포 환경의 통신 구조
'Docker' 카테고리의 다른 글
Docker slim 이미지 (2) | 2023.06.02 |
---|---|
Docker env 정보 관리 (1) | 2023.06.01 |
Docker gunicorn django 프로젝트 컨테이너 생성 (1) | 2023.06.01 |
Docker postgresql 컨테이너 생성 (1) | 2023.06.01 |
docker-compose.yml 두 개 이상의 컨테이너 생성하기 (1) | 2023.06.01 |