null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
"Docker 실전 — 개발자를 위한 컨테이너 가이드"
Structure
concepts
•
"Docker가 필요한 이유"
dockerfile
•
"Dockerfile 모범 사례"
compose
•
"Compose 실전 스택"
cicd
•
"GitHub Actions로 Docker 자동 빌드·배포"
Flow Structure
"Docker가 필요한 이유"
2 / 4
"Compose 실전 스택"
☆ Star
↗ Full
"Dockerfile 모범 사례"
#docker
#dockerfile
#devops
#최적화
@devpc
|
2026-04-27 06:24:11
|
GET /api/v1/flows/14/nodes/265?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
1
Calls
## 나쁜 Dockerfile vs 좋은 Dockerfile ### ❌ 나쁜 예 ```dockerfile FROM python:3.11 WORKDIR /app COPY . . RUN pip install -r requirements.txt CMD ["python", "main.py"] ``` 문제점: 1. `python:3.11` — 태그가 바뀔 수 있음 (버전 고정 안 됨) 2. `COPY . .` 먼저 → 소스 한 줄 바꿔도 pip install 다시 실행 3. `python:3.11` 베이스 이미지가 1GB+ --- ## ✅ 좋은 예: 레이어 캐시 최적화 ```dockerfile FROM python:3.11.9-slim # 비루트 유저 생성 (보안) RUN adduser --disabled-password --gecos '' appuser WORKDIR /app # 의존성만 먼저 복사 (캐시 활용) COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 소스 복사 (자주 바뀌는 레이어는 마지막) COPY --chown=appuser:appuser . . USER appuser EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] ``` **핵심**: `COPY requirements.txt` → `RUN pip install` → `COPY . .` 순서. 소스 변경 시 앞 두 레이어는 캐시 재사용. --- ## 멀티 스테이지 빌드 빌드 도구는 런타임에 불필요하다. 멀티 스테이지로 최종 이미지 크기를 대폭 줄인다. ### Go 예시 ```dockerfile # ---- 빌드 스테이지 ---- FROM golang:1.22 AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -o server . # ---- 실행 스테이지 ---- FROM scratch # 아무것도 없는 베이스 COPY --from=builder /app/server /server EXPOSE 8080 ENTRYPOINT ["/server"] ``` 결과: Go 빌드 이미지(~1GB) → 최종 이미지 10MB 이하 ### Node.js 예시 ```dockerfile # 빌드 (TypeScript 컴파일) FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 프로덕션 FROM node:20-alpine AS runner WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY --from=builder /app/dist ./dist USER node CMD ["node", "dist/index.js"] ``` --- ## .dockerignore 최적화 빌드 컨텍스트에서 불필요한 파일 제외 → 빌드 속도 향상. ``` .git .gitignore .env .env.* __pycache__ *.pyc *.pyo node_modules .venv dist build *.log tests/ docs/ README.md ``` --- ## 보안 체크리스트 ```dockerfile # ✅ 특정 버전 태그 사용 FROM python:3.11.9-slim # ✅ 비루트 유저 실행 RUN adduser --disabled-password appuser USER appuser # ✅ 최소 권한 파일 소유 COPY --chown=appuser:appuser . . # ✅ --no-cache-dir (캐시 파일 제거) RUN pip install --no-cache-dir -r requirements.txt # ❌ 피해야 할 것들 # RUN apt-get install ... (버전 고정 없이) # ENV SECRET_KEY=hardcoded (시크릿 하드코딩) # COPY . . (민감 파일 포함 가능성) ``` 시크릿은 절대 Dockerfile에 하드코딩하지 말고, `--secret` 플래그나 런타임 환경변수를 사용. --- ## 이미지 크기 비교 | 베이스 이미지 | 크기 | |-------------|------| | ubuntu:22.04 | ~80MB | | python:3.11 | ~1.0GB | | python:3.11-slim | ~130MB | | python:3.11-alpine | ~50MB | | scratch | 0 (바이너리만) | `alpine` 주의: musl libc 사용으로 일부 라이브러리 호환성 문제 발생 가능. `slim`이 안전한 선택. --- ## 빌드 최적화 확인 ```bash # 이미지 레이어 분석 docker history myapp:latest # 이미지 크기 확인 docker images myapp # dive 툴로 레이어별 파일 확인 docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock \ wagoodman/dive myapp:latest ```
"Docker가 필요한 이유"
"Compose 실전 스택"
// COMMENTS
Newest First
ON THIS PAGE
No content selected.