📚 강의 요약 (섹션 7-2: Docker를 활용한 LLMOps)
1. Docker 개요
- Docker: 애플리케이션을 컨테이너로 패키징, 배포, 실행할 수 있는 오픈소스 플랫폼 .
- 컨테이너(Container): 코드, 런타임, 라이브러리, 시스템 설정 등 실행에 필요한 모든 것을 포함하는 독립적이고 경량 실행 단위.
- 핵심 장점:
- 환경 간 일관성 확보 (개발 → 테스트 → 운영)
- 이식성 및 확장성 향상
- 리소스 효율적 활용 및 반복 가능한 배포 가능
2. 주요 개념
- Image: 읽기 전용 템플릿, 앱과 의존성 포함 → 컨테이너 생성의 기반
- Container: 이미지의 실행 인스턴스, 다른 프로세스와 격리 실행
- Dockerfile: 이미지 빌드 지침을 담은 텍스트 파일 (베이스 이미지, 의존성 설치, 실행 단계 포함)
- Docker Compose: 다중 컨테이너 애플리케이션 정의/실행 도구 (YAML 기반)
- Docker Hub: Docker 이미지 공유·배포를 위한 클라우드 레지스트리
3. 기본 명령어
- docker build : Dockerfile 기반 이미지 빌드
- docker run : 이미지 기반 컨테이너 실행
- docker ps : 실행 중인 컨테이너 확인
- docker stop / start : 컨테이너 중지·재시작
- docker rm / rmi : 컨테이너 / 이미지 삭제
- docker pull / push : 이미지 다운로드 / 업로드
- docker exec : 실행 중 컨테이너 안에서 명령 실행
4. 개발 워크플로우와 통합
- Docker는 CI/CD 파이프라인에 쉽게 통합 가능
- GitHub 등 소스 저장소에서 자동 빌드 → Docker Hub 업로드 → Kubernetes, Docker Swarm 등으로 오케스트레이션
5. 실습 내용
(1) Docker 설치
- docker.com에서 OS에 맞는 Docker Desktop 설치
- Windows: WSL2 필요, Mac은 칩셋(인텔/ARM)에 맞게 다운로드
(2) Docker Quickstart
- 예제: nginx 이미지 Pull & Run
- docker pull nginx → 이미지 가져오기
- docker run -d -p 8080:80 nginx → 컨테이너 실행 및 포트 매핑
- localhost:8080 접속 시 Nginx Welcome 페이지 확인
- Dockerfile 작성 및 커스텀 빌드 실습:
- Base Image: nginx
- index.html 파일 복사 → 커스텀 웹 페이지 표시
- docker build -t custom-nginx . → 이미지 빌드
- docker run -d -p 8080:80 custom-nginx → 실행
(3) LLM 애플리케이션 패키징
- 실습 프로젝트 (Project_1_Open_AI_Assistant)
- Base Image: python:3.10
- 소스코드(main.py, config.py), 라이브러리(requirements.txt) 복사
- pip install -r requirements.txt 실행
- CMD ["python", "main.py"] 지정
- FastAPI 서버를 포트 80에서 실행 → 호스트와 포트 매핑 (8080:80)
- 실행 확인:
- localhost:8080 → “Welcome to ChatGPT AI Application” 확인
- /docs → FastAPI 문서 UI 접근
- POST 요청 테스트 시 OpenAI API를 호출하여 응답 반환
⚠️ 주의사항: config.py에 API Key가 직접 포함되어 있어 보안 위험 → Docker Hub에 업로드는 권장하지 않음
✅ 핵심 포인트 정리
- Docker는 LLMOps에서 애플리케이션 배포의 핵심 도구 → 환경 일관성과 반복 가능성 보장
- Dockerfile 작성 → 이미지 빌드 → 컨테이너 실행 → Hub 공유의 전체 워크플로우 습득
- 실습 프로젝트를 통해 FastAPI 기반 LLM 애플리케이션을 Docker로 패키징 및 실행 성공
- 보안 고려 필요: API Key 같은 민감 정보는 이미지에 직접 포함하지 않아야 함
📑 문제 세트 (Docker & LLMOps 기반)
🔹 난이도 하 (기본 개념 확인)
문제 1
Docker 컨테이너(Container)에 대한 설명으로 옳은 것은 무엇인가?
① 가상머신과 동일하게 독립된 운영체제를 포함한다.
② 애플리케이션 실행에 필요한 코드, 라이브러리, 설정 등을 포함한다.
③ 운영체제 전체를 복제하여 실행하기 때문에 무겁다.
④ 실행 시마다 새로운 가상 하드웨어를 요구한다.
정답: ②
해설: 컨테이너는 애플리케이션 실행에 필요한 모든 요소를 포함하는 경량 실행 단위이다. 가상머신처럼 전체 운영체제를 포함하지 않으므로 효율적이다 .
문제 2
Dockerfile의 역할로 가장 적절한 것은?
① Docker Hub에 이미지를 업로드하는 도구
② 컨테이너 실행 상태를 관리하는 도구
③ 이미지 빌드 지침을 담은 텍스트 파일
④ 컨테이너 간 네트워크를 연결하는 설정
정답: ③
해설: Dockerfile은 베이스 이미지, 의존성 설치, 실행 명령 등을 정의하여 Docker 이미지 빌드를 자동화한다 .
🔹 난이도 중 (실습 및 활용 중심)
문제 3
다음 중 Docker 기본 명령어와 설명이 옳지 않은 것은?
① docker build : Dockerfile을 기반으로 이미지 생성
② docker run : 이미지에서 컨테이너 실행
③ docker ps : 실행 중인 컨테이너 목록 확인
④ docker copy : 이미지를 Docker Hub로 업로드
정답: ④
해설: 이미지를 Docker Hub로 업로드할 때는 docker push를 사용한다. docker copy라는 명령어는 존재하지 않는다 .
문제 4
FastAPI 기반 LLM 애플리케이션을 Docker로 배포할 때 올바른 순서는?
① pip install → main.py 실행 → requirements.txt 복사
② 베이스 이미지 지정 → 파일 복사 → 라이브러리 설치 → CMD 실행
③ 라이브러리 설치 → requirements.txt 복사 → Docker Hub push
④ Dockerfile 작성 → requirements.txt 삭제 → 이미지 실행
정답: ②
해설: 올바른 Dockerfile 작성 순서는 FROM → COPY → RUN pip install -r requirements.txt → CMD ["python", "main.py"] → EXPOSE 80 순으로 구성된다 .
🔹 난이도 상 (심화/응용)
문제 5
다음 상황에서 가장 적절한 Docker 활용 방안은 무엇인가?
상황:
User는 FastAPI 기반 LLM 애플리케이션을 배포하려 한다. 이 애플리케이션은 main.py, config.py, requirements.txt 파일을 포함하고 있으며, 운영 환경과 개발 환경의 라이브러리 버전 차이로 문제가 발생하고 있다.
① 운영 서버와 개발 서버의 Python 버전을 수동으로 동일하게 맞춘다.
② 모든 의존성을 requirements.txt에 기록하고, Dockerfile에서 설치하여 동일한 환경을 구성한다.
③ config.py 파일에 API Key를 하드코딩하여 그대로 Docker Hub에 업로드한다.
④ VM(가상머신)을 새로 설치하여 운영 환경을 동일하게 맞춘다.
정답: ②
해설: Dockerfile을 통해 Python 버전과 라이브러리를 명시하고, requirements.txt 기반으로 설치하면 환경 차이 문제를 해결할 수 있다. 단, API Key를 직접 포함하는 것은 보안상 위험하다 .
문제 6
Docker Hub에 개인 프로젝트 이미지를 업로드하려고 한다. 이때 보안상 권장되지 않는 방법은 무엇인가?
① docker login 후 사용자 계정으로 이미지 태깅
② docker push를 통해 개인 레포지토리에 업로드
③ config.py에 포함된 API Key를 그대로 이미지에 저장 후 업로드
④ 비공개(Private) 레포지토리로 설정하여 접근 제한
정답: ③
해설: API Key 같은 민감 정보가 이미지에 포함되면 Docker Hub에 업로드될 때 유출 위험이 크다. 따라서 반드시 환경 변수나 Secret 관리 도구를 사용해야 한다 .