TIL(22/11/16)

김규현·2022년 11월 18일
0

🌈 오늘 느낀 것

docker 강의를 수차례 들으면서 복습했지만 익숙해지지가 않는다..
Dockerfile이나 docker-compose를 작성할 때 코드는 외워야 하는건지도 잘 모르겠고 아직 헷갈리는 부분이 많다.
Dockerfile과 docker-compose도 프로젝트나 사용하는 버전에 따라 작성하는 방법이 바뀔 수도 있다는데 무작정 외우는 건 아닌 것 같고 매번 버전에 맞는 가이드를 찾아봐야 할 것 같다.
그리고 배포를 많이 경험하면서 docker 컨테이너를 생성하고 테스트 및 배포하는 연습으로 익숙해지는 것 밖에 답이 없는 것 같다.

📝 오늘 배운 것

  • postgresql 컨테이너 생성하고 테스트 하는 방법
  • gunicorn으로 django 컨테이너 생성하고 테스트 하는 방법
  • nginx로 웹서버 컨테이너 생성하고 테스트 하는 방법

📌postgresql

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 볼륨을 연결할 경로를 지정 후 환경 변수를 설정해주면 된다.

📌gunicorn

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

nginx는 클라이언트의 request 요청을 처리해주는 web server이며 클라이언트에서 server(django)로 요청을 보냈을 때 중간에서 nginx가 클라이언트의 요청을 받아 server(django)로 데이터를 전달해주는 역할을 한다.

💡 nginx를 사용하는 이유

  • 로드밸런싱을 활용해 트래픽을 분산할 수 있습니다.
  • SSL 기능을 사용해 데이터를 안전하게 전달할 수 있습니다.
  • reverse proxy 기능을 통해 client에서 서버에 직접적으로 접근하는 것을 막아줍니다.
  • 콘텐츠를 캐싱하여 동일한 요청에 대해 더 빠른 속도로 처리할 수 있게 해줍니다.

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
profile
웹개발 회고록

0개의 댓글