docker 강의를 수차례 들으면서 복습했지만 익숙해지지가 않는다..
Dockerfile이나 docker-compose를 작성할 때 코드는 외워야 하는건지도 잘 모르겠고 아직 헷갈리는 부분이 많다.
Dockerfile과 docker-compose도 프로젝트나 사용하는 버전에 따라 작성하는 방법이 바뀔 수도 있다는데 무작정 외우는 건 아닌 것 같고 매번 버전에 맞는 가이드를 찾아봐야 할 것 같다.
그리고 배포를 많이 경험하면서 docker 컨테이너를 생성하고 테스트 및 배포하는 연습으로 익숙해지는 것 밖에 답이 없는 것 같다.
postgresql은 오픈소스 데이터 베이스이며 django에서 권장하는 데이터 베이스이다.
원하는 이미지는 https://hub.docker.com/ 에서 찾을 수 있다.
postgresql docker-compose.yml 작성하는 방법
version: '3.8'
volumes:
postgres: {} # postgresql에서 사용 할 볼륨 지정
services:
postgres:
container_name: postgres
image: postgres:14.5
volumes:
- postgres:/var/lib/postgresql/data/
environment: # postgresql 컨테이너에서 사용할 환경변수 지정해주기
- POSTGRES_USER=user # 데이터베이스 사용자 지정
- POSTGRES_PASSWORD=P@ssw0rd # 사용자 비밀번호 지정
- POSTGRES_DB=django # 데이터베이스 이름 지정
restart: always
postgresql의 docker-compose를 작성할 때는 volumes에 postgres를 지정해주고, 사용할 이미지 버전과 postgres 볼륨을 연결할 경로를 지정 후 환경 변수를 설정해주면 된다.
django에서 사용되는 runserver 명령어는 배포 환경에서 적합하지 않기 때문에 gunicorn을 사용하여 django에서 작성된 코드를 배포환경에서 실행할 수 있다.
Dockerfile을 작성 후 docker-compose.yml에 이미지를 build 하여 컨테이너를 생성한다.
# /backend/Dockerfile
# python 3.10.8버전 이미지를 사용해 빌드
FROM python:3.10.8
# .pyc 파일을 생성하지 않도록 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1
# 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다.
ENV PYTHONUNBUFFERED 1
# /app/ 디렉토리를 생성합니다.
RUN mkdir /app/
# /app/ 경로를 작업 디렉토리로 설정합니다.
WORKDIR /app/
# requirments.txt를 작업 디렉토리(/app/) 경로로 복사합니다.
COPY ./django/requirements.txt .
# 프로젝트 실행에 필요한 패키지들을 설치합니다.
RUN pip install --no-cache-dir -r requirements.txt
# gunicorn을 사용하기 위한 패키지를 설치합니다.
RUN pip install gunicorn
# ./docker-compose.yml
version: '3.8'
services:
backend:
container_name: backend
build: ./backend/ # 현재 위치의 backend라는 directory에 있는 Dockerfile로 이미지를 build
# drf_project.wsgi는 프로젝트 경로에 맞게 지정해야 합니다.
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"
# entrypoint는 컨테이너가 생성될 때 실행되는 명령어가 있을 때 사용하며 sh -c는 뒤의 명령어가 실행된다는 뜻
ports:
- 80:8000 # django 프로젝트를 연결하기 때문에 80번 포트로 들어왔을 때 8000번 포트로 포워딩해줌
volumes:
- ./backend/django/:/app/ # backend/django의 directory와 컨테이너의 app directory를 동기화해준다.
- /etc/localtime:/etc/localtime:ro # host의 timezone 설정을 컨테이너에 적용합니다.
restart: always
nginx는 클라이언트의 request 요청을 처리해주는 web server이며 클라이언트에서 server(django)로 요청을 보냈을 때 중간에서 nginx가 클라이언트의 요청을 받아 server(django)로 데이터를 전달해주는 역할을 한다.
💡 nginx를 사용하는 이유
nginx를 사용해서 web server 컨테이너를 생성하는 방법은 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