- 1. 학습 로드맵
- 2. Docker Desktop 빠른 제어
- 3. 아키텍처 개요
- 4. 온프렘 최소 자원 산정
- 5. 운영 고도화 확장 스택
- 6. 통합 의존관계 다이어그램
- 7. WSL 포트 80 트러블슈팅
- 8. Docker 이미지 목록
- 9. 대상 독자와 도입 로드맵
- 10. 확장 커리큘럼 맵 (12~25)
- 11. 공용 리소스 폴더
# 상태 확인 (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) 기본/선택 프로파일 - 기준 파일:
06-Jenkins-Server-On-Prem/Dockerfile07-GitLab-CE-On-Prem/Dockerfile08-SonarQube-On-Prem/Dockerfile09-Nexus-Repository-On-Prem/Dockerfile10-Drone-CI-On-Prem/Dockerfile11-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 |
- Docker를 처음 학습하는 엔지니어
- 온프레미스 DevOps/Platform 구축을 시작하는 팀
- 도구 간 연결 구조를 빠르게 파악하려는 Solution Architect
- Phase 1 (기본기/PoC)
- 1~10 단계 실습 완료
- Jenkins/Drone 중 표준 CI 1개 선정
- Phase 2 (표준화)
- 브랜치 전략, 파이프라인 템플릿, Sonar 품질 게이트 표준화
- Nexus 저장소 구조(팀/환경별) 정리
- Phase 3 (운영 안정화)
- 모니터링/로그/알림 연계
- 백업/복구 리허설 및 장애 대응 Runbook 작성
- Phase 4 (보안 고도화)
- SSO, 비밀정보 중앙관리, 이미지 스캔/서명 정책 도입
난이도 순 확장 실습 구조:
12~20: Advanced Day01~Day0921~25: OnPrem 솔루션별 소스 학습(odoo, erpnext, tryton, taiga, zulip)
| 번호 | 폴더 | 핵심 주제 |
|---|---|---|
| 12 | 12-Advanced-Day01-Container-Basics |
Docker 기초/첫 실행 |
| 13 | 13-Advanced-Day02-Container-DeepDive |
프로세스/자원/IO |
| 14 | 14-Advanced-Day03-Image-Build |
Dockerfile/이미지 빌드 |
| 15 | 15-Advanced-Day04-Image-Optimization |
멀티스테이지/최적화 |
| 16 | 16-Advanced-Day05-Networking |
브리지/DNS/통신 |
| 17 | 17-Advanced-Day06-Storage-Backup |
볼륨/백업/복구 |
| 18 | 18-Advanced-Day07-Compose-Practice |
Compose 실전 |
| 19 | 19-Advanced-Day08-Debugging-Operations |
장애 분석/Runbook |
| 20 | 20-Advanced-Day09-Jenkins-CI |
CI 파이프라인 |
| 번호 | 폴더 | 솔루션 |
|---|---|---|
| 21 | 21-OnPrem-Solution-Odoo |
Odoo |
| 22 | 22-OnPrem-Solution-ERPNext |
ERPNext |
| 23 | 23-OnPrem-Solution-Tryton |
Tryton |
| 24 | 24-OnPrem-Solution-Taiga |
Taiga |
| 25 | 25-OnPrem-Solution-Zulip |
Zulip |
커리큘럼 폴더(12~25)와 별도로, 원본 병합 레포의 공용 리소스는 아래에 유지합니다.
_shared-advanced-core/- 공용 템플릿/문서/캡스톤 (
templates,docs,capstone) labs/dayXX는 상위 커리큘럼 폴더(12~20)로 연결되는 링크
- 공용 템플릿/문서/캡스톤 (
_shared-onprem-core/- 통합 오케스트레이션(
docker-compose.yml,start.sh,stop.sh,sync-solutions.sh) solutions/*는 상위 커리큘럼 폴더(21~25)로 연결되는 링크
- 통합 오케스트레이션(