| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 파이선
- 파이썬
- RDS
- Chatbot
- Django
- subnet
- SSH Tunnel
- 따라하며 배우는 파이썬과 데이터 과학
- postgres
- 파이팅
- GPT
- django db with ssh tunnel
- Python
- 아나콘다
- pycharm
- settings.py
- AWS
- 파이참
- ec2
- database
- 이터널리턴
- 오픈빌더
- chartjs-chart-financial
- 개발일지
- vpc
- 장고
- psycopg
- 챗봇
- vue
- Today
- Total
우아한 개발계발 블로그
도커라이징(Dockerizing) | Django 본문
우선 임시로 만든 서비스를 도커에 올려보자
3개의 컨테이너에 각각 Django, Vue, Nginx 가 실행되고 docker-compose 를 이용해서 한번에 빌드하는게 목표다.
정말 쉽지않았다. 이미 성공한 사람들의 글은 충분히 많아서 참고할 자료는 많았는데, 생각만큼 순조롭게 진행되지는 않았다.
Docker 로 배포한다는 생각으로 진행을 해서 Gunicorn 설정까지 한번에 하려고했다.
Gunicorn을 통해 배포할 때는 bind 옵션을 줘서 포트로 서비스 하는 방법과 유닉스의 소켓을 이용하여 서비스하는 방법이 있다.
점프 투 장고 4-10 부분을 읽어보면
Gunicorn은 앞에서 본 것처럼 포트(8000)를 이용하여 서버를 띄울수 있다. 하지만 Unix 계열 시스템에서는 포트로 서비스하기보다는 유닉스 소켓(Unix socket)을 사용하는 것이 빠르고 효율적이다.
라고 나와있는데 이는 완전 맞는 말은 아닌 것 같다.
Docker:Nginx-Gunicorn에서는 프로세스 간 통신이 아닌 컨테이너/서비스 간에 IP 통신이 있기 때문에 소켓을 사용하는 것을 지양한다라고 한다.
그리고 Django 를 AWS의 RDS 와 연결하려고 했다.
# base.py(settings.py)
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': env('DB_HOST'),
'PORT': env('DB_PORT'),
'NAME': env('DB_NAME'),
'USER': env('DB_USER'),
'PASSWORD': env('DB_PASSWORD'),
}
}
...
AWS RDS의 프리티어 Postgres를 이용하였고, 프리티어라 DB를 생성할 때 보안그룹 말고는 딱히 신경쓸만한 부분이 없었다.
시크릿키를 관리 하는 파일(.env)에 해당 데이터들을 따로 저장하였고 environ 모듈을 통해 불러와서 사용하였다.

Django 와 Postgres 연결하려면 psycopg 모듈이 필요한데, Python3.12에서 pip로 설치할 때는 아래와 같이 설치해야한다.
그냥 pip install pycopg3으로 설치하면 패키지가 설치되긴하나 프로젝트에서 정상적으로 모듈을 인식하지 못한다.
그래서 Python 이나 Django와 버전 의존성 문제인줄 알고 조금 해맸다.
pip install --upgrade pip # to upgrade pip
pip install "psycopg[binary,pool]" # to install package and dependencies

Django 폴더의 Dockerfile.
처음에 베이스 이미지를 우분투를 올렸었는데 헛수고였다.
Python3.12를 설치하면 pip 설정을 따로 해줘야해서 불편이 이만저만이 아니였는데, 파이썬 베이스 이미지를 사용하니까 너무 편했다.
# 베이스 이미지로 python 3.12.4 사용
FROM python:3.12.4-slim
# 작업 디렉토리 설정
WORKDIR /django
# 필요한 시스템 패키지 설치
RUN apt-get update && apt-get install -y \
libpq-dev \
gcc \
--no-install-recommends && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 프로젝트의 requirements.txt 파일을 복사하고 의존성 설치
COPY requirements.txt /django/
RUN pip install --upgrade pip && \
pip install -r requirements.txt
# 프로젝트 소스 코드를 복사
#COPY . /django/
ENV PYTHONUNBUFFERED 1
주석 처리된 COPY 부분은 후에 Docker-compose 파일에서 mount하기 때문에 주석처리하였다.
# docker-compose.yml
...
django:
build: AglaiaLabBE
container_name: django_gunicorn
volumes:
- ./AglaiaLabBE:/django
expose:
- "8000"
env_file:
- AglaiaLabBE/.env
environment:
- DJANGO_SETTINGS_MODULE=AglaiaLabBE.settings.local
command: gunicorn -w 2 -b 0.0.0.0:8000 --chdir /django AglaiaLabBE.wsgi:application
...
폴더의 구조가 프로젝트 이름이 AglaiaLab 라면
AglaiaLab
├── Docker-compose.yml
├── BackEnd
│ ├── Dockerfile
│ ├── AglaiaLabBE(Django Project)
│ │ ├── settings (Settings.py 분리)
│ │ │ ├── base.py
│ │ │ ├── local.py
│ │ │ └── prod.py│
├── manage.py
│ └── ...
├── FrontEnd (vue Project)
│ ├── Dockerfile
│ ├── node_modules
│ ├── package.json
│ └── ...
└── nginx
├── Dockerfile
├── nginx.conf
└── project.conf
이러한 구조로 되어있다.
Docker-compose 내에서 command로 gunicorn을 실행할 때 chdir 옵션이 없으면 `wsgi Not Found` 오류가 발생한다.
그래서 chdir 옵션을 주어 wsgi 파일을 찾을 수 있도록 해주었다.
Django 만 Gunicorn에 올려서 nginx에 연결하는데 정말 많은 것들을 처음 알게되었다.
- 유닉스 소켓통신은 프로그램 간의 통신에서만 이점이 있다.
- postgres 어댑터 모듈인 psycopg는 설치하는 방법이 따로 있다.
- Python3.12는 apt-get으로 설치할 수 있다. (*Deadsnake를 사용하지 않아도된다.)
등..
gunicorn 을 파헤쳐보자! 소켓 사용과 포트 사용의 차이점
안녕하세요. 까치입니다. 최근 django 애플리케이션을 구축하던 중 WSGI(Web Server Gateway Interface) 서버로 gunicorn을 사용하게 되었는데 갑자기 문득.. 뭔 차이지..?? 가 궁금해져서 내용을 정리하게 되었
velog.io
https://leffept.tistory.com/330
[Django]Docker-compose로 Django 환경 구축하기 1 - Django
이번 시리즈는 기존에 존재하는 장고 프로젝트나, 새로 시작하는 프로젝트를 Docker-compose를 활용하여 도커라이징 하는 과정에 대해서 올릴 것이다. 일반적으로 Django에 Postgres, Nginx, Redis, RabbitMQ, C
leffept.tistory.com
https://god-logger.tistory.com/115#google_vignette
Ubuntu 22.04 Python 3.12 설치
설치 환경 우분투 22.04 의 경우 , 일부 시스템 유틸리티와 패키지가 Python 3.10에 의존하고 있습니다. 강제로 3.12 버전을 설치 시, 시스템 오류로 인해 부팅이 안될 수 있습니다. 가능하면 24년 03월
god-logger.tistory.com
https://www.linuxtuto.com/how-to-install-python-3-12-on-ubuntu-22-04/
How to Install Python 3.12 on Ubuntu 22.04 - LinuxTuto
Python is a high-level, interpreted programming language known for its simplicity, readability, and versatility.
www.linuxtuto.com
ImportError "no pq wrapper available" when importing psycopg3
I installed pyscopg3 on my venv using pip install psycopg[binary] as per the documentation but I still get an import error: Exception has occurred: ImportError no pq wrapper available. Attempts mad...
stackoverflow.com
https://velog.io/@masterkorea01/Docker-Nginx-gunicorn-django
[실전] Docker + Nginx + gunicorn + django
1) FROM python:3.8파이썬 3.8 버전을 베이스 이미지로 사용2) RUN mkdir /code컨테이너에 /code 디렉토리를 생성3) WORKDIR /code/code 디렉토리로 워킹 디렉토리를 변경4) ADD ./backend/requirements.tx
velog.io
https://gimkuku0708.tistory.com/46
[Docker] Django + Gunicorn + Ngnix + MySQL 로 도커 세팅하기
1. 들어가기 전 도커 세팅은 언제 해야하는가. .많은 개발자들이 고민하는 문제일 것이다. 내가 몇 안되지만.. 주변에 자문을 구해본 결과 !! 대다수가 맨 처음에 다 세팅해두는게 편하다고 대답
gimkuku0708.tistory.com
'Programming > 아글라이아 연구소 개발 일지' 카테고리의 다른 글
| Django Database SSH Tunnel 설정 (0) | 2024.09.08 |
|---|---|
| 아글라이아 연구소 개발 일지 (3) - Vue 에서 chartjs-chart-financial 사용하기 (프론트 디자인은 맘에 들기 쉽지않아) (0) | 2024.09.06 |
| 아글라이아 연구소 개발 일지 (1) - 개발 환경 (0) | 2024.07.15 |
| 아글라이아 연구소 개발 일지 (0) - 서막 (0) | 2024.07.09 |