v1.1.0: 배포_Docker

김의석 ·2024년 3월 15일

Hello! Poko Ver.1

목록 보기
3/20
post-thumbnail

v1.0: 초기기능 구현 후 배포 과정(3월 14일~) 중의 내용(학습, 이슈)을 기술 함

3월 14일

  • 도커를 처음으로 사용 Doit! 장고를 참고하여 시도. 도커 파트는 4~5장 분량인데 여러가지 이슈가 발생해서 시간을 많이 소비함. 결국엔 인프런에서 강의를 보면서 해결. 생각보다 도커설정파일을 만들 때 예민하게 작성해야해하는 것을 학습 함.

도커를 이용한 컨테이너

도커란

  • 다른 하드웨어와 운영체계에서 작업하더라도 동일한 환경을 갖추게 하는 기술.
  • 가상환경과 비슷하나 가상한경은 배포 과정에서 부족한 부분이 많다.

도커파일 만들기

모듈 리스트 만들기

pip3 > feeeze requirements.txt
  • 프로젝트에 사용된 라이브러리를 리스트로 만들어 저장하는 과정.
이슈
  • '>'을 누락한 명령어 이슈
    • '>'을 사용하는 명령어가 생소했음.
  • requirements.txt에 작성된 버젼 양식 이슈
anyio==4.2.0
appnope==0.1.4
argon2-cffi==23.1.0

반드시 라이브러리==버젼 양식이 지켜져야 함.
pypi 양식이라고 하던데 좌우지간 pypi 양식으로 라이브 버젼 양식이 되어있지 않으면 
conda list 명령어로 버젼을 확인 후 수
동으로 requirements.txt 안의 내용을 수정해야한다

좋지 않은 예시
asttokens @ file:///opt/conda/conda-bld/asttokens_1646925590279/work

도커 설정 파일 만들기

# pull official base image 
FROM python:3.10-slim

# Install gcc and python3-dev
RUN apt-get update && apt-get install -y gcc python3-dev

# set work directory
WORKDIR /usr/src/app

# set enviroment variabels
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# 로컬의 현재위치 파일을 /usr/src/app 작업 경로로 복사, 두 경로 사이에 공백 주의
COPY . /usr/src/app/ # **두 경로 사이에 공백 주의**

# install dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

도커 컴포즈 파일 만들기

version: '3'    # 파일의 최신 포맷버젼사용

services:
  web:
    build: .    # 현재 폴더를 빌드
    command: python3 manage.py runserver 0.0.0.0:8000 # 서버 실행 명령을 대신 입력

    volumes:    # 도커와 로컬을 연결, '.'는 현재 위치
      - ./:/usr/src/app/
    ports:
      - '8000:8000' # 로컬포트:컨테이너포트
    env_file:
      - ./.env.dev  # 컨테이너 개발환경에서 필요한 환경변수 값 지정.
      				# settings.py에서 이 값을 불러와 사용
  • docker compose 파일을 작성하는 이유
    • 컨테이너를 여러개 실행 시키는 경우.
    • 컨테이너를 실행 시킬 때 옵션을 줄 수 있다.
이슈
  • 인프런 강의 참고 반드시 컨테이서 서버로 외부에서 접속할 때는 0.0.0.0로 접속해야 한다고 함. 기존의 127.0.0.1은 컨테이너 서버에 접속이 불가능 한다고 함.
    • 명령어로 컨테이너 상태 실행해보면 번호가 0.0.0.0:8000->8000/tcp 고정 -> 컨테이너에서 기본적으로 매핑되는 거라함, 정상임

settings.py 수정하고 개발환경 파일 작성하기

DEBUG = int(os.environ.get("DEBUG", 1))

if os.environ.get("DJANGO_ALLOWED_HOSTS"):
    ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS", "").split()
    print("environ ALLOWED_HOSTS  확인", ALLOWED_HOSTS)

else:
    print("else ALLOWED_HOSTS 확인")
    ALLOWED_HOSTS = ["localhost", "127.0.0.1", "[::1]", "0.0.0.0:8000"]

print("최종 ALLOWED_HOSTS 확인", ALLOWED_HOSTS)
  • settings.py가 .env.dev(환경변수)를 참조하기 위한 작업
  • 환경변수
    프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임.
    프로세스(Process)는 컴퓨터에서 실행 중인 프로그램을 의미한다.
    환경변수를 설정하면 어떤 디렉토리(경로)에서 test.txt를 실행하더라도 환경변수로 설정한 C:\Users\ㅁㅁㅁㅁ\Desktop\folder1에 있는 test.txt가 실행된다.
    참고 : https://gliver.tistory.com/43
눈물나는 이슈
if os.environ.get("DJANGO_ALLOWED_HOSTS"):
    ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split("") 
    # splits() 안됨, 인자 값에 공백 기준으로 split 함을 정확히 명시 할 것

else:
    ALLOWED_HOSTS = [] # <- 모든 ip다 허용 가능한 상태

.env.dev 작성

DEBUG = 1
SECRET_KEY = 'django-insecure-^*)3u$zud1z2dfngqh7fdb)xp$cueimjz_0r(4q35l-+gwhme-'
DJANGO_ALLOWED_HOSTS = localhost 127.0.0.1 [::1] 0.0.0.0
  • 컨테이너 내에 Django의 settings.py가 참조할 환경변수를 작성 한다.
눈물나는 이슈
  • 시크릿 키 ""로 문자열을 묶지말고 '' 사용할 것, 그렇지 않으면 시크릿 키 내 문자열이 이스케이프가 되지 않아서 시크릿키를 읽어오지 못함
  • DJANGO_ALLOWED_HOSTS에 입력한 값 정확히 공백으로 띄워줄 것. setting.py에서 splite()함수가 제대로 기능하지 못함.

도커 컨테이너 실행하기

docker-compose build
  • docker build와의 차이점 : 컨테이너를 여러개 실행할 떄는 compose 단일 컨테이너 실행은 docker build 사용
docker-compose up
  • 마찬가지로 단일인 경우 docker run 컨테이너를 여러개 실행 시키는 경우는 해당 코드를 사용한다.
  • docker run은 Docker-compose파일을 사용하지 않기때문에 .env.dev 파일을 참조하지 않고 settings에서 else: 문에 있던 allowed_hots를 읽어 옴
진짜 눈물나는 이슈
  • Django 코드를 Docker container로 정상적으로 띄웠지만, local에서 열리지 않음

    • Docker-copose bilde 명령어가 아닌 docker run --rm -p 9000:8000 test_poko1 단일 컨테이너를 띄웠을 때 성공.

    • 강의에서 도커파일에 CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000”]를 작성

      • 0.0.0.0이가 아니면 도커 내 장고 서버 접속(외부)이 안된다고 함
    • 환경변수와, CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

      • "0.0.0.0:8000" 추가후 성공 서버 접속 성공

PORT는 언제 사용되는가?

컴퓨터에서의 포트(port)란 외부의 다른 장비와 프르그램이 접속하기 위한 주소.

특정 서버에 접속하려면 URL이나 IP 주소를 입력하는데 인터넷상에서 URL 또는 IP를 토대로 해당 서버가 있는 컴퓨터로 연결한다.

하지만 대부분의 컴퓨터에서는 여러 개의 프로그램이 동시에 실행되고 있고, 이 여러개의 프로그램 중 어느 프로그램이 내가 접속하려는 프로그램인지 컴퓨터에게 알려 주어야한다.

이때 포트 번호는 어떤 프로그램에 접속 할 것인지 컴퓨터에게 알려준다.

[IP address, Port] => IP address는 컴퓨터를 찾을 때 필요한 주소를 나타내며, Port는 컴퓨터 안에서 프로그램을 찾을 때를 나타내는 것.
이 두 개를 이용하여 특정 컴퓨터의 프로그램을 이용 할 수 있게된다.
참고: https://sangbeomkim.tistory.com/101

profile
널리 이롭게

0개의 댓글