- 0. 폴더 구조
- 1. 시작 전 준비사항
- 2. 학습 로드맵
- 3. Docker Desktop 빠른 제어
- 4. 아키텍처 개요
- 5. 온프렘 최소 자원 산정
- 6. 운영 고도화 확장 스택
- 7. 통합 의존관계 다이어그램
- 8. WSL 포트 80 트러블슈팅
- 9. Docker 이미지 목록
- 10. 대상 독자와 도입 로드맵
- 11. 확장 커리큘럼 맵
- 12. 공용 리소스 폴더
- 13. Vector DB 원리와 Docker 실습
- 14. 멀티 모델 & sLLM Docker 서빙
- 15. Windows WSL·Docker·AI 개발 환경
- 16. Ollama·RAG 컨테이너 시각적 모니터링
docker-class/
├── docker/ # Docker 실행 예제 및 보조 리소스
│ ├── docker-compose.yml # FastAPI + Nginx Compose 예제
│ ├── Dockerfile # Python/FastAPI 백엔드 이미지
│ ├── Dockerfile.fe # Nginx 프런트엔드 이미지
│ ├── Dockerfile.crawler # Scrapy 크롤링 이미지
│ ├── Dockerfile.play # Playwright 실행 이미지
│ ├── frontend/ # 정적 프런트엔드 예제
│ └── tesseract/ # OCR 입력 파일·학습 데이터·실행 가이드
│
├── postgresql/ # 종목 OHLCV 저장용 PostgreSQL (pg-stock)
│ ├── docker-compose.yml # postgres:latest 기동 (포트 5433, 볼륨 영속화)
│ ├── schema.sql # tickers + ohlcv 스키마
│ └── README.md # 클라이언트(psql/psycopg2/GUI) 설치 및 접속 가이드
│
├── scripts/ # data-1~3 수집·동기화·DB 적재 배치 스크립트 (cron)
│
├── docker-basics/ # Docker 기초 (01~05장)
│ ├── 01-Docker-Introduction/ # Docker 개념 소개
│ ├── 02-Docker-Installation/ # 설치 가이드 (Windows/macOS/Linux)
│ ├── 03-Pull-from-DockerHub-and-Run-Docker-Images/ # Hub에서 Pull & Run
│ ├── 04-Build-new-Docker-Image-and-Run-and-Push-to-DockerHub/ # 이미지 빌드·Push
│ └── 05-Essential-Docker-Commands/ # 핵심 CLI 명령어 모음
│
├── devsecops-on-prem/ # DevSecOps On-Prem 도구 (06~11장)
│ ├── 06-Jenkins-Server-On-Prem/ # Jenkins LTS 온프레미스 구축
│ ├── 07-GitLab-CE-On-Prem/ # GitLab CE 온프레미스 구축
│ ├── 08-SonarQube-On-Prem/ # SonarQube 코드 품질 분석
│ ├── 09-Nexus-Repository-On-Prem/ # Nexus 아티팩트 저장소
│ ├── 10-Drone-CI-On-Prem/ # Drone CI 경량 파이프라인
│ └── 11-Integrated-DevSecOps-Lab/ # 전체 스택 통합 실습 (Traefik·Keycloak·Vault·Trivy·Prometheus·Grafana·Loki)
│
├── ai-tools/ # AI 환경 구축 (설치 순서대로 넘버링)
│ ├── README.md # 단계별 마스터 가이드
│ ├── 01-llm-server/ # Step 1: Ollama LLM 서버 (RTX 3080 GPU)
│ ├── 02-vector-db/ # Step 2: Vector DB (Qdrant·pgvector·Chroma·Weaviate)
│ ├── 03-webui/ # Step 3: Open WebUI 브라우저 채팅 UI
│ ├── 04-rag-stack/ # Step 4: 통합 RAG 스택 (Ollama+Qdrant+WebUI)
│ └── 05-ai-dev-container/ # Step 5: AI 응용 개발 컨테이너 (Python·Jupyter·FastAPI)
│
├── _shared-advanced-core/ # Advanced 과정 공용 리소스 (12~20장 내용 포함)
│ ├── labs/
│ │ ├── day01/ → Docker 개요 & 첫 걸음
│ │ ├── day02/ → 컨테이너 심화 (프로세스/자원/IO)
│ │ ├── day03/ → Dockerfile & 이미지 빌드
│ │ ├── day04/ → 이미지 최적화 (멀티스테이지)
│ │ ├── day05/ → 네트워킹 (브리지/DNS/통신)
│ │ ├── day06/ → 스토리지 & 백업/복구
│ │ ├── day07/ → Compose 실전
│ │ ├── day08/ → 디버깅 & 운영
│ │ └── day09/ → Jenkins CI 파이프라인
│ ├── capstone/ # 캡스톤 프로젝트
│ ├── docs/ # 강의 문서
│ └── templates/ # 공용 템플릿
│
├── _shared-onprem-core/ # OnPrem 솔루션 공용 리소스 (21~25장 내용 포함)
│ ├── solutions/
│ │ ├── odoo/ → Odoo ERP
│ │ ├── erpnext/ → ERPNext
│ │ ├── tryton/ → Tryton
│ │ ├── taiga/ → Taiga (프로젝트 관리)
│ │ └── zulip/ → Zulip (팀 메시지)
│ ├── captures/ # 실습 캡처 이미지
│ ├── docker/ # 공용 DB 초기화·인증 스크립트
│ └── scripts/ # 오케스트레이션 스크립트
│
Important
실습을 시작하기 전에 아래 항목을 모두 확인하세요. 기술 스택 이해도와 PC 사양에 따라 진행 가능한 단계가 달라집니다.
| 영역 | 필요 역량 | 참고 자료 |
|---|---|---|
| CLI / 터미널 | 명령줄 기본 사용법 (pwd, ls, cd, cat, grep 등) | Linux 기초 명령어 |
| Git | clone, add, commit, push, pull 기본 흐름 | Git 공식 문서 |
| Linux 기초 | 파일 권한, 환경변수, 프로세스, 패키지 관리(apt/yum) | — |
| 네트워크 기초 | IP, 포트, DNS, TCP/UDP 개념 이해 | — |
| Docker 기초 | 이미지/컨테이너/볼륨/네트워크 개념, Dockerfile 문법 | Docker 공식 튜토리얼 |
| 영역 | 필요 역량 |
|---|---|
| Docker Compose | docker-compose.yml 작성, 멀티 컨테이너 의존 관계 제어 |
| CI/CD 개념 | 파이프라인 단계(빌드→테스트→배포), Webhook 트리거 이해 |
| Jenkins | Declarative Pipeline(Jenkinsfile) 작성 기초 |
| GitLab | 브랜치 전략, Merge Request, CI/CD 연동 개념 |
| SonarQube | 품질 게이트, 코드 커버리지 개념 |
| Nexus / Harbor | 아티팩트·이미지 저장소 구조 이해 |
| 역방향 프록시 | Traefik / Nginx 라우팅, TLS 종료 개념 |
| 보안 기초 | 시크릿 관리(Vault), SSO(Keycloak), 이미지 취약점 스캔(Trivy) |
| 모니터링 | Prometheus 메트릭 수집, Grafana 대시보드, Loki 로그 집계 |
| 영역 | 필요 역량 |
|---|---|
| ERP 솔루션 운영 | Odoo, ERPNext, Tryton 기본 아키텍처 이해 |
| Python 기초 | 스크립트 작성, 패키지 관리(pip), 가상환경(venv) |
| AI / LLM 기초 | 임베딩, 벡터 유사도, RAG(Retrieval-Augmented Generation) 개념 |
| Vector DB | Qdrant, Chroma, Weaviate, pgvector 기본 사용법 |
| sLLM 서빙 | Ollama 모델 Pull·서빙, REST API 호출, GPU 드라이버 설정 |
Note
단계별 실습 범위에 따라 필요한 사양이 크게 다릅니다. 아래 표를 기준으로 자신의 진행 범위를 확인하세요.
| 실습 단계 | 최소 CPU | 최소 RAM | 최소 디스크 | 권장 RAM | 권장 디스크 | 비고 |
|---|---|---|---|---|---|---|
| 01~05장 (Docker 기초) | 4코어 | 8 GB | 50 GB | 16 GB | 100 GB | Docker Desktop 구동 기준 |
| 06~10장 (핵심 On-Prem 스택) | 8코어 | 16 GB | 400 GB | 32 GB | 600 GB | GitLab 단독 최소 8 GB RAM |
| 11장 (통합 DevSecOps Lab) | 8코어 | 32 GB | 300 GB | 64 GB | 500 GB | 전체 프로파일 동시 기동 기준 |
Advanced day01~09 (_shared-advanced-core/labs/) |
8코어 | 16 GB | 200 GB | 32 GB | 400 GB | Compose 멀티 컨테이너 구동 |
OnPrem 솔루션 (_shared-onprem-core/solutions/) |
8코어 | 16 GB | 200 GB | 32 GB | 400 GB | Odoo/ERPNext DB 포함 |
| 27장 (Vector DB) | 4코어 | 8 GB | 50 GB | 16 GB | 100 GB | 경량 Vector DB 실습 |
| 28장 (sLLM 서빙, CPU) | 8코어 | 16 GB | 100 GB | 32 GB | 200 GB | gemma3:2b 기준 |
| 28장 (sLLM 서빙, GPU) | 8코어 | 32 GB | 200 GB | 64 GB | 500 GB | NVIDIA GPU 8 GB VRAM 이상 |
| 운영체제 | 권장 설정 |
|---|---|
| Windows 10/11 | WSL 2 + Docker Desktop 최신 버전, RAM 16 GB 이상 권장 |
| macOS (Intel) | Docker Desktop for Mac, Rosetta 비활성화 권장 |
| macOS (Apple Silicon / M1~M4) | Docker Desktop ARM 빌드, platform: linux/amd64 에뮬레이션 주의 |
| Ubuntu 22.04 LTS | Docker Engine + Docker Compose Plugin 직접 설치, WSL 불필요 |
Tip
전체 커리큘럼(01~28장)을 모두 진행하려면 CPU 12코어 이상, RAM 32 GB 이상, NVMe SSD 1 TB 이상을 권장합니다. 클라우드 VM(AWS EC2, GCP Compute, Azure VM)을 활용하면 로컬 사양 제약을 해결할 수 있습니다.
| 플랫폼 | 용도 | 무료 플랜 여부 | 가입 URL |
|---|---|---|---|
| Docker Hub | 이미지 Pull/Push, 공개 레지스트리 | 무료 (Pull 제한 있음) | hub.docker.com |
| GitHub | 선수 repo(edumgt-lab-init) 및 소스 관리 |
무료 | github.com |
| GitLab.com (선택) | 클라우드 GitLab 연습용 (로컬 CE와 병행 가능) | 무료 (Free tier) | gitlab.com |
| SonarCloud (선택) | 공개 저장소 코드 품질 분석 클라우드판 | 오픈소스 무료 | sonarcloud.io |
| Hugging Face (선택) | sLLM 모델 다운로드 (28장) | 무료 | huggingface.co |
| AWS / GCP / Azure (선택) | 클라우드 VM에서 온프레미스 실습 환경 구성 | 유료 (프리 티어 한정 무료) | 각 클라우드 콘솔 참고 |
Note
로컬 PC에서만 실습하는 경우 Docker Hub와 GitHub 계정만으로도 01~28장 전 과정을 진행할 수 있습니다.
| 항목 | 예상 비용 | 비고 |
|---|---|---|
| Docker Hub (Personal) | 무료 | Pull 횟수 제한 있음 (6시간당 100회) |
| Docker Hub (Pro) | $9/월 ≈ 13,000원/월 | 무제한 Pull, 개인 레지스트리 무제한 |
| GitHub | 무료 | 공개/비공개 저장소 모두 무료 |
| GitLab.com (Free) | 무료 | CI 월 400분 무료 제공 |
| 전기 요금 | 약 5,000~20,000원/월 | 24시간 상시 운영 기준, PC 소비전력·전기요금에 따라 상이 |
| 소계 (기본) | 월 0~22,000원 | Docker Hub 무료 티어 사용 시 실질 비용 최소화 가능 |
Warning
아래 비용은 2025년 기준 대략적인 추정치이며, 사용 시간·리전·옵션에 따라 달라집니다. 반드시 각 클라우드 콘솔의 요금 계산기를 사용해 정확한 금액을 확인하세요.
| 시나리오 | AWS EC2 예시 | GCP Compute 예시 | Azure VM 예시 | 월 예상 비용 |
|---|---|---|---|---|
| 기초 실습 전용 (01~05장) | t3.medium (2vCPU/4GB) | e2-medium (2vCPU/4GB) | B2s (2vCPU/4GB) | 약 25,000~40,000원/월 |
| 핵심 On-Prem 스택 (06~11장) | m6i.2xlarge (8vCPU/32GB) | n2-standard-8 (8vCPU/32GB) | D8s v5 (8vCPU/32GB) | 약 200,000~350,000원/월 |
| 전체 통합 실습 (01~28장) | m6i.4xlarge (16vCPU/64GB) + SSD 1TB | n2-standard-16 (16vCPU/64GB) | D16s v5 (16vCPU/64GB) | 약 500,000~900,000원/월 |
| sLLM GPU 서빙 (28장) | g4dn.xlarge (4vCPU/16GB, T4 GPU) | n1-standard-4 + T4 GPU | NC4as T4 v3 | 약 150,000~350,000원/월 |
- 스팟/프리엠티블 인스턴스 활용: AWS Spot, GCP Preemptible은 On-Demand 대비 60~80% 저렴합니다.
- 실습 후 즉시 중지: VM을 사용하지 않을 때 중지(Stop)하면 컴퓨팅 비용이 발생하지 않습니다(스토리지 비용은 유지).
- 프리 티어 활용: AWS 신규 계정은 12개월간 t2.micro(1vCPU/1GB) 무료 제공. 기초 실습(01~05장) 진행 가능.
- Docker Hub 풀 제한 우회: 로컬 Nexus Repository(09장)를 구축하면 Pull 횟수 제한 없이 이미지를 캐싱할 수 있습니다.
- GitLab CE 자체 호스팅: GitLab.com CI 무료 400분 한계를 우회하려면 07장에서 로컬 GitLab CE를 구축하세요.
| 환경 | 기간 | 예상 총비용 |
|---|---|---|
| 로컬 PC (스펙 충족 시) | 1~3개월 | 5,000~60,000원 (전기 요금만) |
| 클라우드 (핵심 스택 위주) | 1~3개월 | 300,000~1,000,000원 |
| 클라우드 (전체 + GPU) | 1~3개월 | 1,000,000~3,000,000원 |
Tip
비용 부담을 최소화하려면 **로컬 PC(RAM 32 GB 이상)**를 우선 활용하고, GPU가 필요한 28장만 클라우드 GPU 인스턴스를 단기 사용하는 방식을 권장합니다.
| 단계 | 주제 | 이동 |
|---|---|---|
| 01 | Docker 소개 | 01-Docker-Introduction |
| 02 | Docker 설치 | 02-Docker-Installation |
| 03 | Docker Hub 이미지 Pull/Run | 03-Pull-from-DockerHub-and-Run-Docker-Images |
| 04 | 이미지 Build/Run/Push | 04-Build-new-Docker-Image-and-Run-and-Push-to-DockerHub |
| 05 | 핵심 Docker 명령어 | 05-Essential-Docker-Commands |
| 구성 | 내용 | 이동 |
|---|---|---|
| Compose 예제 | FastAPI 백엔드 + Nginx 프런트엔드 | docker/README.md |
| OCR 예제 | Tesseract 한국어·영어 OCR | tesseract/README.md |
| 단계 | 주제 | 이동 |
|---|---|---|
| 06 | Jenkins 온프레미스 구축 | 06-Jenkins-Server-On-Prem |
| 07 | GitLab CE 온프레미스 구축 | 07-GitLab-CE-On-Prem |
| 08 | SonarQube 온프레미스 구축 | 08-SonarQube-On-Prem |
| 09 | Nexus Repository 온프레미스 구축 | 09-Nexus-Repository-On-Prem |
| 10 | Drone CI 온프레미스 구축 | 10-Drone-CI-On-Prem |
| 11 | 통합 DevSecOps Lab | 11-Integrated-DevSecOps-Lab |
| 단계 | 주제 | 이동 |
|---|---|---|
| Advanced Day01 | Docker 개요 & 첫 걸음 | day01 |
| Advanced Day02 | 컨테이너 심화 (프로세스/자원/IO) | day02 |
| Advanced Day03 | 이미지 빌드 기초 (Dockerfile) | day03 |
| Advanced Day04 | 이미지 최적화 (멀티스테이지) | day04 |
| Advanced Day05 | 네트워킹 (브리지/DNS/통신) | day05 |
| Advanced Day06 | 스토리지 & 백업/복구 | day06 |
| Advanced Day07 | Compose 실전 | day07 |
| Advanced Day08 | 디버깅 & 운영 | day08 |
| Advanced Day09 | Jenkins CI 파이프라인 | day09 |
| 단계 | 솔루션 | 이동 |
|---|---|---|
| 21 | Odoo ERP | odoo |
| 22 | ERPNext | erpnext |
| 23 | Tryton | tryton |
| 24 | Taiga (프로젝트 관리) | taiga |
| 25 | Zulip (팀 메시지) | zulip |
| 단계 | 주제 | 이동 |
|---|---|---|
| Step 1 | Ollama LLM 서버 (RTX 3080 GPU) | 01-llm-server |
| Step 2 | Vector DB (Qdrant·pgvector·Chroma·Weaviate) | 02-vector-db |
| Step 3 | Open WebUI 브라우저 채팅 UI | 03-webui |
| Step 4 | 통합 RAG 스택 (Ollama+Qdrant+WebUI) | 04-rag-stack |
| Step 5 | AI 응용 개발 컨테이너 (Python·Jupyter·FastAPI) | 05-ai-dev-container |
# 상태 확인 (4.37+)
docker desktop status
# 시작 / 재시작 / 중지
docker desktop start
docker desktop restart
docker desktop stop
# 로그 확인
docker desktop logs# Docker Desktop 관련 프로세스 종료
Get-Process "*docker*" -ErrorAction SilentlyContinue | Stop-Process -Force
# Docker Desktop UI 재실행
Start-Process "C:\Program Files\Docker\Docker\Docker Desktop.exe"| 레이어 | 구성 요소 |
|---|---|
| Container Runtime | Docker Engine |
| SCM | GitLab CE |
| CI | Jenkins, Drone CI |
| Quality Gate | SonarQube |
| Artifact Registry | Nexus Repository OSS (또는 Docker Hub/Harbor) |
| Runtime Workload | Nginx, Spring Boot 등 |
- 개발자가 GitLab CE에 코드 Push
- Jenkins 또는 Drone CI 파이프라인 실행
- SonarQube 품질 검사 수행
- Docker 이미지 빌드 후 Nexus(또는 Docker Hub)로 Push
- 운영 노드가 이미지 Pull 후 배포
Tip
기본 체인은 GitLab -> Jenkins/Drone -> SonarQube -> Nexus -> Docker Runtime 으로 이해하면 됩니다.
Zone 1 (Dev): 개발자 PC, 로컬 DockerZone 2 (CI): GitLab, Jenkins/Drone, SonarQubeZone 3 (Artifact): Nexus/HarborZone 4 (Runtime): 서비스 컨테이너 실행 노드Zone 5 (Ops): 모니터링, 로깅, 백업, 보안
권장 정책:
- CI Zone -> Artifact Zone: Push 허용
- Runtime Zone -> Artifact Zone: Pull 허용
- Dev Zone -> Runtime Zone: 직접 접근 제한
Important
아래 수치는 단일 노드 실습/PoC 최소 기준입니다. 운영 환경은 최소 1.5~2배 여유 자원을 권장합니다.
- 06~10장: Jenkins, GitLab CE, SonarQube, Nexus, Drone
- 11장: Integrated DevSecOps Lab (
docker-compose.yml) 기본/선택 프로파일 - 기준 파일:
devsecops-on-prem/06-Jenkins-Server-On-Prem/Dockerfiledevsecops-on-prem/07-GitLab-CE-On-Prem/Dockerfiledevsecops-on-prem/08-SonarQube-On-Prem/Dockerfiledevsecops-on-prem/09-Nexus-Repository-On-Prem/Dockerfiledevsecops-on-prem/10-Drone-CI-On-Prem/Dockerfiledevsecops-on-prem/11-Integrated-DevSecOps-Lab/docker-compose.yml
| 구분 | Docker 이미지 | 최소 vCPU | 최소 RAM | 최소 디스크(볼륨) | 비고 |
|---|---|---|---|---|---|
| CI | jenkins/jenkins:lts-jdk17 |
2 | 4 GB | 50 GB | 플러그인/워크스페이스 증가 고려 |
| SCM | gitlab/gitlab-ce:17.5.2-ce.0 |
4 | 8 GB | 100 GB | 실무 최소 여유 반영 |
| Code Quality | sonarqube:community |
2 | 4 GB | 50 GB | 운영은 외부 PostgreSQL 연동 권장 |
| Artifact | sonatype/nexus3:3.70.1 |
2 | 4 GB | 100 GB | Blob 저장 증가 유의 |
| CI (경량) | drone/drone:2 |
1 | 1 GB | 20 GB | Runner 별도 산정 필요 |
| Reverse Proxy | traefik:v3.1 |
1 | 1 GB | 10 GB | 인증서/액세스 로그 포함 |
| DB | postgres:16 |
1 | 2 GB | 20 GB | Keycloak 백엔드 DB |
| IAM | quay.io/keycloak/keycloak:25.0.5 |
1 | 2 GB | 10 GB | 사용자 증가 시 확장 필요 |
| Secrets | hashicorp/vault:1.17 |
1 | 1 GB | 10 GB | 레포는 Dev 모드 |
| Scanner | aquasec/trivy:0.56.2 |
1 | 1 GB | 10 GB | 스캔 시 순간 부하 증가 |
| Metrics | prom/prometheus:v2.54.1 |
2 | 2 GB | 30 GB | 보관 기간에 비례해 디스크 증가 |
| Alert | prom/alertmanager:v0.27.0 |
1 | 1 GB | 5 GB | 알림 라우팅 |
| Dashboard | grafana/grafana:11.2.2 |
1 | 1 GB | 10 GB | 대시보드/플러그인 저장 |
| Logs | grafana/loki:3.1.1 |
2 | 2 GB | 30 GB | 로그 보관 정책 핵심 |
| Log Agent | grafana/promtail:3.1.1 |
1 | 1 GB | 5 GB | 호스트 로그 수집 |
| Private CA (옵션) | smallstep/step-ca:0.27.4 |
1 | 1 GB | 5 GB | private-ca profile |
| Harbor DB (옵션) | goharbor/harbor-db:v2.11.1 |
1 | 2 GB | 20 GB | harbor profile |
| Harbor Redis (옵션) | goharbor/redis-photon:v2.11.1 |
1 | 1 GB | 10 GB | harbor profile |
| Harbor Registry (옵션) | goharbor/registry-photon:v2.11.1 |
2 | 2 GB | 80 GB | harbor profile |
| 시나리오 | 최소 vCPU 합계 | 최소 RAM 합계 | 최소 디스크 합계 |
|---|---|---|---|
| 06~10장 핵심 스택 (Jenkins+GitLab+Sonar+Nexus+Drone) | 11 | 21 GB | 320 GB |
| 11장 기본 프로파일 (Traefik~Promtail) | 12 | 14 GB | 140 GB |
11장 + private-ca + harbor 프로파일 |
17 | 20 GB | 255 GB |
추가 권장 오버헤드: 2 vCPU, 4 GB RAM, 30 GB (호스트 OS + Docker)
- Keycloak: SSO 및 중앙 인증
- HashiCorp Vault: 비밀정보 중앙관리
- Trivy: 이미지 취약점 스캔 자동화
- Prometheus + Grafana: 메트릭/대시보드
- Loki + Promtail (또는 EFK/ELK): 로그 수집/분석
- Alertmanager: 알림 자동화
- Traefik / Nginx Proxy Manager: 리버스 프록시, TLS 종료
- 사설 CA 기반 인증서 운영 전략 수립
- Harbor: 내부 레지스트리 + 취약점 스캔 + 정책
- Nexus와 병행 또는 대체 가능
- GitLab, SonarQube, Nexus 볼륨/DB 정기 백업
- MinIO 등 오브젝트 스토리지 기반 보관
flowchart LR
subgraph Core["06~10 Core On-Prem Stack"]
DEV[Developer]
GITLAB["gitlab/gitlab-ce"]
JENKINS["jenkins/jenkins"]
DRONE["drone/drone"]
SONAR["sonarqube:community"]
NEXUS["sonatype/nexus3"]
RUNTIME[Docker Runtime Host]
DEV -->|Push| GITLAB
GITLAB -->|Webhook Trigger| JENKINS
GITLAB -->|Webhook Trigger| DRONE
JENKINS -->|Quality Scan| SONAR
DRONE -->|Quality Scan| SONAR
JENKINS -->|Build Push Image| NEXUS
DRONE -->|Build Push Image| NEXUS
RUNTIME -->|Pull Image| NEXUS
end
subgraph Lab["11 Integrated DevSecOps Lab"]
TRAEFIK["traefik:v3.1"]
POSTGRES["postgres:16"]
KEYCLOAK["keycloak:25.0.5"]
VAULT["vault:1.17"]
TRIVY["trivy:0.56.2"]
PROM["prometheus:v2.54.1"]
ALERT["alertmanager:v0.27.0"]
GRAFANA["grafana:11.2.2"]
LOKI["loki:3.1.1"]
PROMTAIL["promtail:3.1.1"]
STEPCA["step-ca:0.27.4 profile"]
HDB["harbor-db:v2.11.1 profile"]
HREDIS["harbor-redis:v2.11.1 profile"]
HREG["harbor-registry:v2.11.1 profile"]
KEYCLOAK -->|DB| POSTGRES
GRAFANA -->|Query Metrics| PROM
GRAFANA -->|Query Logs| LOKI
PROMTAIL -->|Ship Logs| LOKI
PROM -->|Alert Route| ALERT
TRAEFIK -->|Route| KEYCLOAK
TRAEFIK -->|Route| VAULT
TRAEFIK -->|Route| PROM
TRAEFIK -->|Route| GRAFANA
TRAEFIK -->|Route| HREG
HREG -->|Metadata State| HDB
HREG -->|Cache Queue| HREDIS
STEPCA -->|Internal TLS optional| TRAEFIK
TRIVY -->|Image Scan Target| HREG
end
산정 가정:
- 단일 Docker Host 최소 실습 기준
- HA/장기보관/대규모 부하는 미반영
- 디스크는 GitLab/SonarQube/Nexus부터 우선 확장 고려
# LISTEN 중인 80 포트 프로세스
sudo ss -ltnp 'sport = :80'
# 프로세스/사용자/FD 상세 확인
sudo lsof -iTCP:80 -sTCP:LISTEN -n -P# 방법 A: 서비스 종료 (예: nginx)
sudo systemctl stop nginx 2>/dev/null || sudo service nginx stop
# 방법 B: PID 강제 종료 (예시)
sudo kill -9 197sudo ss -ltnp 'sport = :80'Warning
kill -9는 마지막 수단으로만 사용하고, 가능하면 서비스 정상 종료를 우선 사용하세요.
| 애플리케이션 | Docker 이미지 |
|---|---|
| Nginx | nginx |
| 커스텀 Nginx | stacksimplify/mynginx_image1 |
| Spring Boot HelloWorld | stacksimplify/dockerintro-springboot-helloworld-rest-api |
| Jenkins LTS | jenkins/jenkins:lts-jdk17 |
| GitLab CE | gitlab/gitlab-ce:17.5.2-ce.0 |
| SonarQube Community | sonarqube:community |
| Nexus Repository OSS | sonatype/nexus3:3.70.1 |
| Drone CI | drone/drone:2 |
| Ollama | ollama/ollama:latest |
| Open WebUI | ghcr.io/open-webui/open-webui:main |
- Docker를 처음 학습하는 엔지니어
- 온프레미스 DevOps/Platform 구축을 시작하는 팀
- 도구 간 연결 구조를 빠르게 파악하려는 Solution Architect
- Phase 1 (기본기/PoC)
- 1~10 단계 실습 완료
- Jenkins/Drone 중 표준 CI 1개 선정
- Phase 2 (표준화)
- 브랜치 전략, 파이프라인 템플릿, Sonar 품질 게이트 표준화
- Nexus 저장소 구조(팀/환경별) 정리
- Phase 3 (운영 안정화)
- 모니터링/로그/알림 연계
- 백업/복구 리허설 및 장애 대응 Runbook 작성
- Phase 4 (보안 고도화)
- SSO, 비밀정보 중앙관리, 이미지 스캔/서명 정책 도입
난이도 순 확장 실습 구조:
_shared-advanced-core/labs/day01~09: Advanced 심화 과정 (구 12~20장)_shared-onprem-core/solutions/: OnPrem ERP/협업 솔루션 (구 21~25장)ai-tools/01-llm-server: Ollama LLM 서버 (RTX 3080 GPU 서빙)ai-tools/02-vector-db: Qdrant·pgvector·Chroma·Weaviate Vector DBai-tools/03-webui: Open WebUI 브라우저 채팅 UIai-tools/04-rag-stack: 통합 RAG 스택 (Ollama+Qdrant+WebUI)ai-tools/05-ai-dev-container: AI 응용 개발 컨테이너 (Python·Jupyter·FastAPI)
| 폴더 | 핵심 주제 |
|---|---|
day01 |
Docker 기초/첫 실행 |
day02 |
프로세스/자원/IO |
day03 |
Dockerfile/이미지 빌드 |
day04 |
멀티스테이지/최적화 |
day05 |
브리지/DNS/통신 |
day06 |
볼륨/백업/복구 |
day07 |
Compose 실전 |
day08 |
장애 분석/Runbook |
day09 |
CI 파이프라인 |
| 폴더 | 솔루션 |
|---|---|
odoo |
Odoo ERP |
erpnext |
ERPNext |
tryton |
Tryton |
taiga |
Taiga (프로젝트 관리) |
zulip |
Zulip (팀 메시지) |
| 폴더 | 핵심 주제 |
|---|---|
01-llm-server |
Ollama GPU 서빙 (RTX 3080, 포트 11435) |
02-vector-db |
Qdrant·pgvector·Chroma·Weaviate Vector DB |
03-webui |
Open WebUI 브라우저 채팅 UI (포트 3000) |
04-rag-stack |
통합 RAG 스택 — Ollama+Qdrant+WebUI 한 번에 기동 |
05-ai-dev-container |
AI 응용 개발 — Python·JupyterLab·FastAPI·RAG 라이브러리 |
Advanced 과정과 OnPrem 솔루션의 정식 파일은 아래 공용 폴더에 통합 관리합니다.
_shared-advanced-core/labs/day01~09: Advanced 심화 과정 실습 파일 (구 12~20장과 동일 내용)capstone/: 캡스톤 프로젝트docs/: 강의 문서templates/: 공용 Dockerfile·Compose 템플릿
_shared-onprem-core/solutions/odoo|erpnext|tryton|taiga|zulip: OnPrem 솔루션별 실습 파일 (구 21~25장과 동일 내용)docker/: 공용 DB 초기화·인증 스크립트scripts/: 오케스트레이션 스크립트 (start/stop/sync)captures/: 실습 캡처 이미지
- 임베딩(Vectorization): 텍스트/이미지 등을 고정 길이 벡터로 변환해 의미 유사성을 수치화합니다.
- 인덱싱(ANN): HNSW/IVF 같은 근사 최근접 탐색 인덱스로 대규모 벡터에서 빠르게 Top-K를 찾습니다.
- 유사도 계산: Cosine, Dot Product, Euclidean 거리로 질의 벡터와 저장 벡터의 유사도를 평가합니다.
- 메타데이터 필터: 태그/시간/권한 같은 조건을 함께 걸어 검색 범위를 줄입니다.
- RAG 연결: 검색된 문서를 LLM 프롬프트 컨텍스트로 주입해 환각을 줄이고 근거 기반 답변을 만듭니다.
- 설치 복잡도를 줄이고, 서비스별 버전을 고정하여 재현 가능한 실습 환경을 만듭니다.
- 로컬 노트북/서버 어디서든 동일 명령으로 기동/중지/정리할 수 있습니다.
- Qdrant
- Chroma
- Weaviate
- pgvector (PostgreSQL 확장)
실습 경로: 02-vector-db
Ollama Docker 이미지 하나로 Gemma3, Llama 3, DeepSeek-R1 등 최신 오픈소스 sLLM을 CPU/GPU 환경에서 바로 서빙할 수 있습니다. Open WebUI를 함께 기동하면 브라우저에서 멀티 모델 채팅 환경을 구성할 수 있습니다.
- Ollama: 모델 Pull/서빙/REST API 제공 (
/api/generate,/api/chat) - Open WebUI: 브라우저 기반 멀티 모델 채팅 UI (Ollama와 자동 연동)
| 도메인 | 추천 모델 | 특징 |
|---|---|---|
| 범용/교육 | gemma3:2b, gemma3:12b |
Google, 경량~중형 |
| 범용/대화 | llama3:8b, llama3:70b |
Meta, 생태계 최대 |
| 추론/코딩 | deepseek-r1:7b, deepseek-r1:14b |
추론 특화 |
| 다국어(한국어) | qwen2.5:7b |
한국어 강점 |
| 경량/엣지 | phi4 |
Microsoft, 14B |
# Step 1: LLM 서버 (GPU)
cd ai-tools/01-llm-server
docker compose -f docker-compose.gpu.yml up -d
# 모델 Pull (qwen3.5 권장 — VRAM 6.6GB, RTX 3080 완전 처리)
docker exec ollama ollama pull qwen3.5:latest
docker exec ollama ollama pull nomic-embed-text # 임베딩용
# REST API 테스트 (포트 11435)
curl -s http://localhost:11435/api/generate \
-H "Content-Type: application/json" \
-d '{"model":"qwen3.5:latest","prompt":"Docker란 무엇인가?","stream":false}' \
| python3 -m json.tool
# Step 3: Open WebUI (UI: http://localhost:3000)
cd ../03-webui && docker compose up -d
# 또는 Step 4: 전체 RAG 스택 한 번에
cd ../04-rag-stack && docker compose up -d실습 경로: ai-tools/
Windows 학습자는 먼저 WSL 개발 환경 구축 가이드로 WSL 2, Ubuntu, VS Code Remote WSL, Docker Desktop 연동을 완료합니다. 저장소는 /mnt/c/...보다 WSL 홈의 ~/workspace에 두는 것을 권장합니다.
AI 응용을 개발할 때는 AI 응용 개발 컨테이너를 사용합니다. FastAPI, JupyterLab, LangChain/LangGraph/LlamaIndex, Ollama, Qdrant/Chroma/pgvector 클라이언트, 테스트·정적 분석 도구가 포함되어 있으며, 기존 Ollama·Qdrant RAG 스택과 shared-net에서 연결됩니다.
KMS RAG 시스템에서 Ollama 컨테이너의 리소스 사용량과 로그를 확인하고, 모델 응답 및 RAG 작업 흐름을 점검하는 방법입니다.
컨테이너의 CPU·메모리 등 리소스 사용량은 docker stats로 실시간 확인할 수 있습니다.
docker stats kms-rag-ollama-1최근 로그 100줄을 확인한 뒤 새 로그를 계속 스트리밍하려면 다음 명령을 사용합니다.
docker logs -f --tail 100 kms-rag-ollama-1Ollama 로그에는 요청이나 작업 처리 정보가 표시될 수 있습니다. 다만 표시되는 로그 필드와 상세 수준은 Ollama 버전 및 설정에 따라 다릅니다.
Docker Desktop 또는 Linux Docker에서 Docker 소켓을 마운트해 Dozzle을 실행합니다.
docker run -d --name dozzle --restart unless-stopped -p 8888:8080 -v /var/run/docker.sock:/var/run/docker.sock amir20/dozzle:latest브라우저에서 http://localhost:8888에 접속하면 컨테이너 로그를 스트리밍하고 검색할 수 있습니다. CPU·메모리 같은 리소스 수치는 docker stats를 사용하고, 대시보드가 필요하면 전용 메트릭 스택을 구성하세요.
Docker 호스트에서 실행 중인 Ollama에 연결해 모델을 대화형으로 테스트하려면 Open WebUI를 실행합니다.
docker run -d --name open-webui --restart always -p 3000:8080 --add-host=host.docker.internal:host-gateway -e OLLAMA_BASE_URL=http://host.docker.internal:11434 -v open-webui:/app/backend/data ghcr.io/open-webui/open-webui:main브라우저에서 http://localhost:3000에 접속해 모델을 테스트하고 설정 및 응답 동작을 확인할 수 있습니다. 초당 토큰 수 등 제공되는 통계는 Open WebUI·Ollama 버전과 설정에 따라 달라질 수 있습니다. Ollama가 Docker 호스트가 아닌 Compose 네트워크에 있다면 OLLAMA_BASE_URL을 해당 네트워크에서 접근 가능한 Ollama 서비스 URL로 변경하세요.
Ollama 요청의 실제 문서·질문 맥락을 확인하려면 Ollama를 호출하는 애플리케이션 컨테이너의 로그를 살펴보세요. 먼저 실행 중인 컨테이너를 확인합니다.
docker psRAG 백엔드 또는 워커의 실제 컨테이너 이름으로 아래 명령의 플레이스홀더를 바꿔 로그를 스트리밍합니다.
docker logs -f --tail 100 <rag-backend-or-worker-container>프롬프트나 문서 내용을 로그로 남기면 민감한 정보가 노출될 수 있습니다. 운영 환경에서는 원본 프롬프트, 검색된 청크, 자격 증명 및 개인정보를 마스킹하거나 저장하지 않도록 하세요.
| 목적 | 권장 도구 |
|---|---|
| 실시간 리소스 사용량 확인 | docker stats |
| 로그 확인 | Dozzle / docker logs |
| 채팅·모델 테스트 | Open WebUI |
| 실제 RAG 작업 맥락 확인 | 백엔드·워커 로그 |