본문 바로가기

boostcamp AI tech/boostcamp AI

Docker

728x90

프로덕트의 인계과정은 보통 다음과 같다. 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를 활용하면 여러 컨테이너를 한번에 실행할 수 있고 누가 먼저 실행되어야 하는지의 의존도도 관리할 수 있다.

 

728x90
반응형