Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Archives
Today
Total
관리 메뉴

JustDoEat

django에서 dockerfile 설정 (~작성중) 본문

카테고리 없음

django에서 dockerfile 설정 (~작성중)

kingmusung 2024. 1. 12. 17:23

도커파일을 작성하기 위한 순서

1.기본이미지선택

2.환경변수 설정

3.작업 디렉토리 설정

4.패키지 설치 및 의존성 주입

5.포트개방

6.명령어 실행

 

일단 대략적인 순서만 기억

 

도커파일 작성

도커파일은 지금 프로젝트 기준으로 3개가 있어야 한다.

backend, frontend, nginx

 

backend

FROM python:3.11

# Python은 가끔 소스 코드를 컴파일할 때 확장자가 .pyc인 파일을 생성한다.
# 도커를 이용할 때, .pyc 파일이 필요하지 않으므로 .pyc 파일을 생성하지 않도록 한다.
ENV PYTHONDONTWRITEBYTECODE 1
# Python 로그가 버퍼링 없이 출력
ENV PYTHONUNBUFFERED 1
#공식문서에 나와있는 내용

# 이미지에 내에서 명령을 실행할 때 사용할 기본 작업 디렉토리를 설정
WORKDIR /backend

RUN pip install --upgrade pip

# 현재 로컬 디렉토리에 있는 requirements.txt를 컨테이너 안의 /backend/ 디렉토리에 복사
COPY requirements.txt ./
RUN pip install -r requirements.txt

# haruProject/ 디렉토리 전체를 컨테이너 안의 /backend/ 디렉토리에 복사
COPY haruProject/ .

# haruProject/.env 파일을 컨테이너 안의 /backend/ 디렉토리에 복사
COPY haruProject/.env ./

# Django 프로젝트 실행
# EXPOSE 8000 # 이 부분은 포트를 외부에 노출할 때 사용하지만, 현재 추세에서는 Docker Compose에서 포트 매핑을 지정하는 것이 권장됩니다.
# CMD ["daphne", "-b", "0.0.0.0", "-p", "8000", "config.asgi:application"] # 프로젝트 실행 명령어 (주석 처리된 이유는 Docker Compose에서 설정하는 것이 일반적이라서)

 

 

궁금증

 

# 이미지에 내에서 명령을 실행할 때 사용할 기본 작업 디렉토리를 설정
WORKDIR /backend

 

도커컴포즈에서한번에 빌드 하고 나면 위에서 말했듯이 backend, frontend, nginx 3개의 컨테이너가 생긴다.

backend컨테이너를 누르고 file을 누르면

아래와 같이 여러 폴더 및 파일들이 컨테이너에 들어가있을것을 볼 수 있다.

이 공간은 빌드를 하면서 생긴 공간이고 로컬과 분리된 독립적인 공간이다.

본론으로 돌아와서

backend라는 폴더가 backend라는 컨테이너에서 명령을 내릴때 사용 할 기본 작업 디렉터리 라고 알려주는것이다.

 

" ./ " 너는 누구냐..

# 현재 로컬 디렉토리에 있는 requirements.txt를 컨테이너 안의 /backend/ 디렉토리에 복사
COPY requirements.txt ./
RUN pip install -r requirements.txt

 

./는 현재 빌드 컨텍스트(로컬에서 도커 빌드 명령을 실행하는 디렉토리)를 나타냄

기준은 도커컴포즈 파일이 있는 폴더가 기준이 됨

 

즉 현제 로컬에서 requirements.txt 파일이 있는 위치랑 도커컴포즈가 있는 위치랑 같다는 말임.

 

지금은 requirements.txt파일이 docker Compose랑 같은 경로에 있어서 위처럼 적었지만 예시로 docker Compose보다 한단계 위 혹은 아래에 있다고 가정하면.

COPY ../requirements.txt ./

 

COPY 하위디렉터리명/requirements.txt ./

 

backend파일을 컨테이너에 올리면 그 하위 내용도 따라와야하는거 아닌가?

# haruProject/ 디렉토리 전체를 컨테이너 안의 /backend/ 디렉토리에 복사
COPY haruProject/ .

# haruProject/.env 파일을 컨테이너 안의 /backend/ 디렉토리에 복사
COPY haruProject/.env ./

 

도커는 명시적으로 무엇을 올릴지 말 안해주면 일을 안한다, WORKDIR에서 backend를 지정했지만 그 하위 폴더는 자동으로 등록이 안된다는 말이다.

 

 

haruproject를 copy함으로써 안에 있던 config, diary,guest,harucalendar,member,member,manage.py 전부다 넘어왔다.

 

.env, requirement.txt는 우리가 별도로 copy명령을 사용했기 때문에 넘어온것이다. 이 두개의 파일은 haruproject하위 파일들이 아니다.

 

.env파일은 보안때문에 원래 잘 포함시키지는 않는다.

 

.idea는 왜 넘어왔는지 이유를 모르겠다.

-> Dockerfile이나 Docker Compose 파일의 컨텍스트에 포함되어 있는 것일 수 있다.

FrontEnd

# Use the specified Node.js version
FROM node:18.12.1-alpine

# Set the user to root for necessary permissions
USER root

# Set the working directory inside the container
WORKDIR /frontend

# Copy the package.json and yarn.lock files first to leverage Docker cache
COPY package.json .

# Install dependencies
RUN yarn install

# Copy the entire project to the working directory
COPY . .

# Run the build command
RUN yarn build

 

NGINX

FROM nginx:1.21.3-alpine

RUN rm /etc/nginx/conf.d/default.conf
#도커 컨테이너 내부에 default.conf 파일을 삭제

COPY nginx.conf /etc/nginx/conf.d
#내 로컬에 있는 nginx.conf를 컨테이너 경로 /etc/nginx/conf.d 에 복사

CMD ["nginx", "-g", "daemon off;"]

EXPOSE 80