Docker로 AI 애플리케이션 배포 환경 구성하는 방법

Dockerfile 작성부터 GPU 컨테이너 실행까지 배포 환경 재현성을 확보하는 기본기

"내 컴퓨터에서는 잘 되는데요." 소프트웨어 개발에서 오래된 이 문제는 AI 애플리케이션에서 더 심각하게 나타난다. AI 애플리케이션은 특정 버전의 파이썬, 특정 버전의 딥러닝 프레임워크, 특정 버전의 GPU 드라이버, 그리고 여러 시스템 라이브러리 등 복잡하고 민감한 의존성을 갖기 때문이다. 이 모든 환경을 개발 서버와 운영 서버에 수동으로 똑같이 맞추는 작업은 오류가 나기 쉽고, 일관성을 유지하기도 어렵다. 그 결과 배포 과정이 길어지고 서비스 안정성을 장담하기 어려워진다.

Docker란 무엇인가

Docker는 애플리케이션을 컨테이너라는 격리된 환경에 담아 개발, 배포, 실행하는 플랫폼이다. 복잡한 기계를 해외로 보낼 때 부품과 조립 설명서를 따로 보내는 대신, 기계를 완성한 상태로 전원 공급 장치와 수리 도구까지 표준화된 운송 컨테이너에 넣어 통째로 보내는 상황을 떠올리면 이해하기 쉽다. 받는 사람은 컨테이너를 열고 전원만 연결하면 바로 쓸 수 있다. Docker는 애플리케이션 코드뿐 아니라 그 코드를 실행하는 데 필요한 라이브러리, 런타임, 시스템 도구까지 하나로 묶어 격리된 실행 단위로 만들어준다.

왜 AI 개발에 특히 유용한가

Dockerfile이라는 설계도에 환경 구성을 코드로 명시해두면 누가 어디서 실행하든 동일한 환경을 재현할 수 있어, 로컬에서만 되는 문제가 원천적으로 줄어든다. 각 컨테이너는 독립된 공간을 가지므로 한 서버 안에서도 서로 다른 버전의 프레임워크를 쓰는 애플리케이션을 충돌 없이 동시에 실행할 수 있다. 잘 만든 컨테이너는 오케스트레이션 도구를 통해 서비스 수요에 따라 손쉽게 늘리거나 줄일 수 있고, GPU 가속이 필요한 애플리케이션도 컨테이너화해 배포할 수 있다.

실제 팁: FastAPI 앱을 Docker로 배포하기

Dockerfile 작성하기

컨테이너의 설계도인 Dockerfile을 작성한다. 아래는 GPU를 사용하는 간단한 AI 앱을 위한 예시다.

# 1. 베이스 이미지 선택 (GPU 사용 시 NVIDIA 공식 CUDA 이미지)
FROM nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 의존성 설치 (변경이 적어 캐싱 효율이 좋음)
COPY ./requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 4. 애플리케이션 코드 복사
COPY . .

# 5. 포트 노출
EXPOSE 8000

# 6. 컨테이너 시작 시 실행할 명령
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

FROM은 컨테이너의 바탕이 될 이미지를, WORKDIR은 명령이 실행될 기본 경로를 지정한다. COPYRUN은 파일을 컨테이너로 옮기고 필요한 라이브러리를 설치하며, EXPOSE는 외부와 통신할 포트를, CMD는 컨테이너 시작 시 실행할 명령을 지정한다.

이미지 빌드와 컨테이너 실행

Dockerfile이 있는 경로에서 아래 명령으로 이미지를 만든다.

docker build -t my-ai-app .

CPU만 사용할 경우와 GPU를 사용할 경우 실행 명령이 다르다.

# CPU만 사용할 경우
docker run -p 8000:8000 my-ai-app

# GPU를 사용할 경우 (호스트에 nvidia-container-toolkit 필요)
docker run --gpus all -p 8000:8000 my-ai-app

-p 8000:8000은 호스트의 8000번 포트를 컨테이너의 8000번 포트로 연결한다는 뜻이고, --gpus all은 컨테이너가 호스트의 GPU에 접근할 수 있게 해준다.

주의사항

이미지 크기 관리

CUDA를 포함한 AI 관련 이미지는 수 기가바이트에 달할 정도로 커질 수 있어 빌드와 배포 시간을 늘린다. .dockerignore 파일로 불필요한 파일을 이미지에서 제외하고, 멀티 스테이지 빌드 같은 방식으로 최종 이미지 크기를 줄이는 노력이 필요하다.

이미지 출처와 격리 수준

출처가 불분명한 비공식 이미지를 그대로 쓰는 것은 보안상 위험할 수 있으므로 가능하면 공식 이미지를 사용하고 취약점 스캔을 정기적으로 수행하는 편이 안전하다. 또한 컨테이너는 가상머신과 달리 호스트 시스템의 커널을 공유하기 때문에 훨씬 가볍고 빠르게 시작할 수 있지만, 가상머신만큼 완전한 격리를 제공하지는 않는다는 점도 함께 알아두어야 한다.

정리

Docker는 AI 애플리케이션 배포에서 자주 겪는 환경 재현성 문제와 의존성 관리 문제를 해결해주는 도구다. Dockerfile을 작성하는 것만으로 로컬 컴퓨터부터 클라우드 운영 서버까지, GPU 사용 여부와 관계없이 일관되게 동작하는 환경을 정의할 수 있다. 이미지 크기와 보안, 격리 수준의 한계를 함께 이해하고 다루면, 개발 단계를 넘어 실제 사용자가 쓸 수 있는 안정적인 서비스를 만드는 데 큰 도움이 된다.

핵심 요약

  • Docker는 애플리케이션과 의존성을 컨테이너에 담아 환경 재현성을 확보해준다.
  • Dockerfile에 환경 구성을 코드로 명시하면 로컬과 운영 서버에서 동일하게 동작한다.
  • 컨테이너는 서로 격리되어 있어 버전이 다른 프레임워크도 충돌 없이 동시에 실행할 수 있다.
  • GPU를 사용하려면 --gpus all 옵션과 nvidia-container-toolkit이 필요하다.

초보자가 자주 실수하는 포인트

  • .dockerignore 없이 불필요한 파일까지 이미지에 포함시켜 크기를 키우는 경우
  • 출처가 불분명한 비공식 이미지를 검증 없이 그대로 사용하는 경우
  • 컨테이너가 가상머신만큼 완전한 격리를 제공한다고 오해하는 경우

체크리스트

  • Dockerfile에 필요한 베이스 이미지와 의존성 설치 순서가 명확한가
  • .dockerignore로 불필요한 파일을 제외했는가
  • GPU 사용 여부에 따라 실행 명령을 구분했는가
  • 공식 이미지 사용과 취약점 스캔을 고려했는가

이 글은 초보자 기준으로 이해하기 쉽게 정리되었으며, 내용은 운영 과정에서 순차적으로 보완될 수 있습니다.