프로덕트의 인계과정은 보통 다음과 같다. local 환경에서 개발 -> staging 서버에서 테스트 -> production 환경에 배포
각 단계별 환경이 다를 수 있다. 그래서 서버 환경까지 한번에 소프트웨어화하는 것이 가상화이며 docker가 이를 도와준다.
도커는 다른 VM들과 다르게 container 기술을 활용하여 더 가볍고 빠르고 쉽게 가상화를 구현할 수 있다.
누군가 OS, 설정등을 포함한 실행환경들을 담은 docker image를 만들어 놓으면 어디서든지 동일하게 해당 image를 실행할 수 있다.
도커 이미지를 원격 저장소에 올려두면 배포를 기다리는 서버는 해당 이미지를 내려받아서 실행하게 된다.
1. docker 이미지 생성
FROM python:3.9.13-slim
WORKDIR /code
RUN pip install poetry
COPY ./poetry.lock ./pyproject.toml /code
RUN poetry install --no-root
COPY . /code
ENV PYTHONPATH "${PYTHONPATH}:/code/src"
CMD [ "poetry" ,"run", "uvicorn", "src.main:app", "--host", "0.0.0.0" ]
// 도커 실행 후 아래 커맨드를 통해 이미지 빌드
docker build --no-cache -t reading_mate_server_test .
// 생성한 이미지 확인
docker images
// 생성한 이미지를 가지고 컨테이너 실행
docker run -p 8000:8000 reading_mate_server_test
2. docker 이미지 내려받기
docker pull : 도커 이미지 가져오기
docker images : 현재 다운받은 이미지들 확인
docker run <이미지> : 도커 이미지를 기반으로 컨테이너 실행
docker run <이미지> -p 8000:8000 : 포트포워딩
docker ps : 현재 실행중인 도커 컨테이너 출력
docker exec -it "컨테이너id" /bin/bash : 도커 컨테이너 내부로 진입
docker stop "컨테이너 id" : 도커 컨테이너 중단
docker rm "컨테이너 id" : 중지된 컨테이너 삭제
volumn mount : 호스트와 도커 컨테이너 내부 저장소 연결
3. Docker Image size 최적화
도커 이미지가 클수록 빌드 시간이 오래걸리고 Pull할때 큰 용량만큼 통신시 비용이 증가한다. 물론 서버의 용량도 많이 잡아먹는다.
도커 이미지의 크기를 줄일 수 있는 방법으로 아래 세가지를 소개한다.
1) 작은 base image를 선정해서 사용
사용할 OS package에 shell만 있는 환경으로도 충분하다면 두가지만 담고 있는 이미지를 베이스로 잡아서 크기를 줄일 수 있다.
예를들어 python:3.9 표준 이미지보다 python:3.9-slim의 경우 production 환경에 적합한 더 가벼운 이미지이다.
2) multi stage build 활용
컨테이너 이미지를 빌드할때는 필요하지만 최종 컨테이너 이미지에는 필요없는 내용을 제외하여 이미지를 생성하는 방법이다.
3. container를 잘 패키징 하기
.dockerignore로 필요 없는 파일들을 제거할 수 있다.
.pt 같이 용량이 큰 모델같은 asset들은 빌드에 포함하지 않고 빌드타임 혹은 container를 시작하는 스크립트에서 다운받도록 한다.
dockerfile안에서 command들의 순서를 잘 정렬하면 캐싱을 최대한 활용할 수 있다.
4. 컨테이터에 포트를 노출하기
docker run -p 8000:8000 "이미지이름:태그"
로 실행하여 컨테이너와 외부 사용자가 통신할 수 있도록 포트를 포워딩해줘야 한다. 위 그림에서는 local 8000번으로 들어온 요청들이 그대로 컨테이너환경 8000번으로 전달되는 모습이다.
5. Docker compose
여러개의 docker이미지를 동시에 실행하고 싶은 경우가 있을 수 있다. 예를들어 db서버를 먼저 띄우고 이어서 웹서버를 띄워야 하는 경우가 그렇다.
docker compose를 활용하면 여러 컨테이너를 한번에 실행할 수 있고 누가 먼저 실행되어야 하는지의 의존도도 관리할 수 있다.
'boostcamp AI tech > boostcamp AI' 카테고리의 다른 글
[PyTorch] Modify Gradient while Backward Propagation Using Hook (0) | 2024.09.27 |
---|---|
[Math] Viewing Deep Learning From Maximum Likelihood Estimation Perspective (0) | 2024.09.25 |
Airflow (0) | 2024.02.26 |
Product Serving 관련 용어 정리 (0) | 2024.02.26 |
Closed Book Question Answering (0) | 2024.02.22 |