Dev./Docker

[Cloud] 배포 - Docker : Dockerfile - Django

Ivan'show 2023. 8. 11.
728x90
반응형

Dockerfile 로 장고 서버를 띄워보자

FROM python:3.11-alpine

ARG APP_HOME=/app

# 파이썬이 표준출력과 표준에러출력을 버퍼링 하지 않도록 설정
ENV PYTHONUNBUFFERED 1

# 파이썬이 .pyc 바이트코드파일을 작성하지 않도록 설정
ENV PYTHONDONTWRITEBYTECODE 1

WORKDIR ${APP_HOME}

# 패키지들은 자주 바뀌지 않기 때문에 인스톨을 따로 가져가는게 좋다.
# 만약 전체 카피로만 requirements 를 가져오게 되면 코드가 수정되었을 때
# 다시 인스톨을 해줘야하는 일이 발생하기 때문에 따로 이미지 레이어를 쌓아준다.
COPY ./requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . ${APP_HOME}

RUN python3 manage.py migrate

CMD ["gunicorn", "lion_app.wsgi:application", "--config", "lion_app/gunicorn_config.py"]

기본 파이썬 이미지는 Debian-based 로 안정적이고 다른 라이브러리나 패키지와 호환이 잘 되지만 크기가 크다는 문제점이 있다. 그래서 특정 기능만을 수행하면 되는 컨테이너 환경에서는 크기를 무시할 수 없기 때문에 경량화된 Alpine python 이미지를 사용하는데 경량화 시키면서 최소한의 필수 패키지만을 포함하기 떄문에 공격 가능한 영역이 줄어 보안적으로 좋다.

Dockerfile 이 실행되는 경로가 종요하다고 다시 생각하게 된 부분이 COPY 명령어를 적용할 때 였다. 복사 붙여 넣는 작업을 수행하는데 인자로 받는 부분에서 앞부분이 현재 Dockerfile 이 있는 위치의 영향을 받고 그 뒤는 WORKDIR 혹은 Root 경로가 된다. 꼭 인지하고 작성하도록 하자

CMD 명령어는 우리가 명령어를 실행시킬때 띄어쓰기로 구분하는 과정을 리스트로 받아서 구분하는 특징을 가지고 있다.

실행명령어

docker build -t {image_name}:{my_tag} .

Dockerfile 이 존재하는 경로에서 위 명령어를 실행시켜주면 된다. 만약 해당경로에 여러 도커파일이 있어서 지정을 해야한다면,

docker build -t {image_name}:{my_tag} -f {target.Dockerfile} .
% docker images
REPOSITORY                              TAG       IMAGE ID       CREATED        SIZE
test                                    0.1       01b0b58c73ca   2 hours ago    89.8MB
...

빌드한 이미지를 실행시켜 보면

docker run --name test-ctnr -d -p 8000:8000 test:0.1
lion_app % docker run --name test-ctnr -d -p 8000:8000 test:0.1
eb3c8b93e5b815eb90b2283ac4fea48c1f839cef1cc45c34e55dc8ad3e4e4d00
lion_app % docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                    NAMES
eb3c8b93e5b8   test:0.1   "gunicorn lion_app.w…"   3 seconds ago   Up 2 seconds   0.0.0.0:8000->8000/tcp   test-ctnr
lion_app %

 

 

 

 

 

 

 

 

 

728x90
반응형

댓글