docker-workflow
npx skills add https://github.com/icartsh/icartsh_plugin --skill docker-workflow
Agent 安装分布
Skill 文档
Docker Workflow
Overview
Docker 컨í ì´ëíë ì í리ì¼ì´ì ê³¼ ê·¸ ì¢ ìì±ì ì´ì ê°ë¥íê³ ì¬í ê°ë¥í 컨í ì´ëë¡ í¨í¤ì§íì¬ ê°ë°, í ì¤í¸ ë° ë°°í¬ë¥¼ ë¥ë¥ íí©ëë¤. ì´ SKILLì ê°ë°ë¶í° ì´ìì ì´ë¥´ê¸°ê¹ì§ ì 문ì ì¸ Docker ìí¬íë¡ì°ë¥¼ ìë´í©ëë¤.
Core Capabilities
- ë©í° ì¤í ì´ì§ ë¹ë (Multi-stage builds): ìµì ì ì´ë¯¸ì§ í¬ê¸°ë¥¼ ìí´ ë¹ëì ë°íì ì¢ ìì±ì ë¶ë¦¬í©ëë¤.
- Docker Compose ì¤ì¼ì¤í¸ë ì´ì : ë¤í¸ìí¹ê³¼ ì¢ ìì±ì ê°ì¶ ë¤ì¤ 컨í ì´ë ì í리ì¼ì´ì ì ê´ë¦¬í©ëë¤.
- ì´ë¯¸ì§ ìµì í: ëª¨ë² ì¬ë¡ë¥¼ íµí´ ì´ë¯¸ì§ í¬ê¸°ë¥¼ 50-90% ì¤ì ëë¤.
- ê°ë° ìí¬íë¡ì°: Hot-reload, 볼륨 ë§ì´í¸ ë° íê²½ë³ ì¤ì ì ì§ìí©ëë¤.
- ëë²ê¹ ë구: 컨í ì´ë ì¡°ì¬, health checks ë° í¸ë¬ë¸ìí ì í¸ë¦¬í°ë¥¼ ì ê³µí©ëë¤.
- ì´ì ì¤ë¹ (Production readiness): ë³´ì ê°í(Security hardening), health checks ë° ë°°í¬ ì ëµì ë¤ë£¹ëë¤.
When to Use This Skill
ë¤ìì ìíí ë íì±ííì¸ì:
- ìë¡ì´ ì í리ì¼ì´ì 컨í ì´ëí
- Dockerë¡ ê°ë° íê²½ 구ì¶
- ì´ì íê²½ì ì í©í Docker ì´ë¯¸ì§ ìì±
- ë¤ì¤ 컨í ì´ë ì í리ì¼ì´ì ì¤ì¼ì¤í¸ë ì´ì
- 컨í ì´ë ì´ì ëë²ê¹
- Docker ë¹ë ë° ì´ë¯¸ì§ ìµì í
Workflow Phases
Phase 1: Initial Setup
.dockerignore ìì±
ë¹ë 컨í ì¤í¸ìì ë¶íìí íì¼ì ì ì¸í©ëë¤:
node_modules/
__pycache__/
*.pyc
.git/
.env
*.log
dist/
build/
coverage/
í¬ê´ì ì¸ í
í릿ì examples/.dockerignore를 참조íì¸ì.
íµì¬ ìì¹:
- ë¹ë ìí°í©í¸ ë° ì¢ ìì± ì ì¸
- 민ê°í íì¼(.env, ì격 ì¦ëª ) ì ì¸
- ë²ì ê´ë¦¬ ìì¤í (.git) ì ì¸
- 컨í ì¤í¸ í¬ê¸° ì¶ì = ë¹ë ìë í¥ì
ì í리ì¼ì´ì ì구 ì¬í ë¶ì
ë¤ìì ê²°ì í©ëë¤:
- ë°íì (Node.js, Python, Go, Java)
- ì¢ ìì± ë° í¨í¤ì§ 매ëì
- ë¹ë ì구 ì¬í vs ë°íì ì구 ì¬í
- í¬í¸ ë ¸ì¶ ë° ë³¼ë¥¨ íìì±
Phase 2: Multi-Stage Dockerfile
ì ëµ ì í
ë©í° ì¤í ì´ì§ ë¹ëë ìµì¢ ì´ë¯¸ì§ í¬ê¸°ë¥¼ 50-90% ì¤ì¬ì¤ëë¤:
# Stage 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# Stage 2: Production
FROM node:18-alpine
WORKDIR /app
COPY /app/dist ./dist
COPY /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
Node.js, Python, Go, Java, Rust í
í릿ì examples/Dockerfile.multi-stage를 참조íì¸ì.
ë ì´ì´ ìºì± ìµì í (Optimize Layer Caching)
ììê° ì¤ìí©ëë¤ – ì주 ë³ê²½ëë ì½í ì¸ ë ë§ì§ë§ì ë°°ì¹íì¸ì:
# â
ì¢ì: ì¢
ìì±ì´ ë³ëë¡ ìºìë¨
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
# â ëì¨: íì¼ì´ íëë§ ë³ê²½ëì´ë ìºìê° ë¬´í¨íë¨
COPY . .
RUN npm ci
ë³´ì ëª¨ë² ì¬ë¡ ì ì©
# í¹ì ë²ì ì¬ì©
FROM node:18.17.1-alpine
# non-root ì¬ì©ìë¡ ì¤í
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
USER nodejs
# ìì ê¶ê³¼ í¨ê» ë³µì¬
COPY . .
ë³´ì ì²´í¬ë¦¬ì¤í¸:
- ë² ì´ì¤ ì´ë¯¸ì§ ë²ì ê³ ì (Pin versions)
- ìµìíì ë² ì´ì¤ ì´ë¯¸ì§ ì¬ì© (alpine, slim)
- non-root ì¬ì©ìë¡ ì¤í
- ì·¨ì½ì ì¤ìº ì¤ì
- ì¤ì¹ í¨í¤ì§ ìµìí
Phase 3: Docker Compose Setup
ìë¹ì¤ ì ì
docker-compose.ymlì ìì±í©ëë¤:
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://db:5432/myapp
depends_on:
db:
condition: service_healthy
volumes:
- ./src:/app/src # ê°ë° ì hot-reload
networks:
- app-network
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: myapp
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 5s
networks:
- app-network
volumes:
postgres-data:
networks:
app-network:
모ëí°ë§, í, ìºì±ì´ í¬í¨ë ì ì²´ ê¸°ë¥ ì¤ì ì examples/docker-compose.ymlì 참조íì¸ì.
íê²½ ì¤ì
íê²½ë³ë¡ override íì¼ì ì¬ì©í©ëë¤:
ê°ë°ì© (docker-compose.override.yml):
services:
app:
build:
target: development
volumes:
- ./src:/app/src
environment:
- NODE_ENV=development
command: npm run dev
ì´ìì© (docker-compose.prod.yml):
services:
app:
build:
target: production
restart: always
environment:
- NODE_ENV=production
ì¬ì©ë²:
# ê°ë° (override íì¼ì´ ìëì¼ë¡ ì¬ì©ë¨)
docker-compose up
# ì´ì
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Phase 4: Build and Run
ë¹ë ëª ë ¹
# 기본 ë¹ë
docker build -t myapp:latest .
# í¹ì ì¤í
ì´ì§ ë¹ë
docker build --target production -t myapp:prod .
# BuildKitì ì¬ì©í ë¹ë (ë¹ ë¦)
DOCKER_BUILDKIT=1 docker build -t myapp:latest .
ì¤í ëª ë ¹
# ë¨ì¼ 컨í
ì´ë
docker run -d -p 3000:3000 -e NODE_ENV=production myapp:latest
# Docker Compose
docker-compose up -d
# ë¡ê·¸ íì¸
docker-compose logs -f app
# 컨í
ì´ë ë´ ëª
ë ¹ ì¤í
docker-compose exec app sh
# ì¤ì§ ë° ì ê±°
docker-compose down -v
Phase 5: Debugging and Troubleshooting
Helper ì¤í¬ë¦½í¸ ì¬ì©
scripts/docker_helper.sh ì í¸ë¦¬í°ë ì¼ë°ì ì¸ ëë²ê¹
ìì
ì ì ê³µí©ëë¤:
# 컨í
ì´ë ìí ì²´í¬
./scripts/docker_helper.sh health myapp
# ìì¸ ì ë³´ ì¡°ì¬
./scripts/docker_helper.sh inspect myapp
# ë¡ê·¸ íì¸
./scripts/docker_helper.sh logs myapp 200
# Shell ì´ê¸°
./scripts/docker_helper.sh shell myapp
# ì´ë¯¸ì§ í¬ê¸° ë¶ì
./scripts/docker_helper.sh size myapp:latest
# 리ìì¤ ì 리 (Cleanup)
./scripts/docker_helper.sh cleanup
ì¼ë°ì ì¸ ì´ì
컨í ì´ëê° ì¦ì ì¢ ë£ëë ê²½ì°:
docker logs myapp
docker run -it --entrypoint sh myapp:latest
ë¤í¸ìí¬ ì°ê²°ì±:
docker network inspect myapp_default
docker exec myapp ping db
볼륨 ê¶í:
# Dockerfileìì ìì
RUN chown -R nodejs:nodejs /app/data
Phase 6: Optimization
ì´ë¯¸ì§ í¬ê¸° ì¶ì
ì ëµ:
- ë ìì ë² ì´ì¤ ì´ë¯¸ì§ ì¬ì© (alpine > slim > debian)
- ë¹ë ë구 ì ì¸ë¥¼ ìí´ ë©í° ì¤í ì´ì§ ë¹ë íì©
- ë ì´ì´ ì를 ì¤ì´ê¸° ìí´ RUN ëª ë ¹ ê²°í©
- ëì¼í ë ì´ì´ ë´ìì ì 리(Clean up) ìí
- .dockerignore íì©
ìì:
# â
ì¢ì: ê²°í© ë° ì 리 ìë£
RUN apt-get update && \
apt-get install -y --no-install-recommends package1 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
ë¹ë ì±ë¥
# BuildKit íì±í
export DOCKER_BUILDKIT=1
# ìºì ë§ì´í¸(Cache mounts) ì¬ì©
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
# ë³ë ¬ ë¹ë
docker-compose build --parallel
Phase 7: Production Deployment
ì´ì íê²½ì© Dockerfile
FROM node:18-alpine AS production
# ë³´ì: non-root ì¬ì©ì
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
WORKDIR /app
COPY /app/dist ./dist
USER nodejs
# Health check
HEALTHCHECK \
CMD node healthcheck.js
EXPOSE 3000
CMD ["node", "dist/index.js"]
ë°°í¬ ëª ë ¹
# Registryì© íê·¸ ì§ì
docker tag myapp:latest registry.example.com/myapp:v1.0.0
# Registryë¡ Push
docker push registry.example.com/myapp:v1.0.0
# ë°°í¬
docker-compose pull && docker-compose up -d
# 무ì¤ë¨ ì
ë°ì´í¸ (Rolling update)
docker-compose up -d --no-deps --build app
Common Patterns
Full-Stack Application
- Frontend + Backend + Database + Redis
examples/docker-compose.yml참조
Microservices
- API Gateway + Multiple Services + Message Queue
- ë¤í¸ìí¬ ê²©ë¦¬(Network isolation) ë° ìë¹ì¤ ê²ì(Service discovery)
ê°ë° ì Hot Reload ì ì©
- ìì¤ ì½ë를 ìí 볼륨 ë§ì´í¸
- ê°ë° ì¤ì ì ìí override íì¼
Best Practices Summary
Security (ë³´ì)
â
latestê° ìë 구체ì ì¸ ì´ë¯¸ì§ ë²ì ì¬ì©
â
non-root ì¬ì©ìë¡ ì¤í
â
민ê°í ë°ì´í°ìë secrets management ì¬ì©
â
ì´ë¯¸ì§ì ì·¨ì½ì ì¤ìº ì¤ì
â
ìµìíì ë² ì´ì¤ ì´ë¯¸ì§ ì¬ì©
Performance (ì±ë¥)
â ë©í° ì¤í ì´ì§ ë¹ë ì¬ì© â ë ì´ì´ ìºì± ìµì í â .dockerignore ì¬ì© â RUN ëª ë ¹ ê²°í© â BuildKit ì¬ì©
Development (ê°ë°)
â ë¤ì¤ 컨í ì´ë ì±ì docker-compose ì¬ì© â hot-reload를 ìí´ ë³¼ë¥¨(Volumes) ì¬ì© â health checks 구í â ì ì í ì¢ ìì± ìì ì ì©
Production (ì´ì)
â ì¬ìì ì ì± (Restart policies) ì¤ì â ì¤ì¼ì¤í¸ë ì´ì (Swarm, Kubernetes) ì¬ì© â health checksë¡ ëª¨ëí°ë§ â Reverse proxy ì¬ì© â Rolling updates 구í
Helper Resources
- scripts/docker_helper.sh: 컨í ì´ë ì¡°ì¬, health checks, ìëí
- examples/Dockerfile.multi-stage: Node.js, Python, Go, Java, Rustì© í í릿
- examples/docker-compose.yml: ì ì²´ 기ë¥ì ê°ì¶ ë©í° ìë¹ì¤ ì¤ì
- examples/.dockerignore: í¬ê´ì ì¸ ë¬´ì(Ignore) í¨í´
Quick Reference
Essential Commands
# ë¹ë
docker build -t myapp .
docker-compose build
# ì¤í
docker run -d -p 3000:3000 myapp
docker-compose up -d
# ë¡ê·¸
docker logs -f myapp
docker-compose logs -f
# ì¤í (Execute)
docker exec -it myapp sh
docker-compose exec app sh
# ì¤ì§
docker-compose down
# ì 리 (Clean)
docker system prune -a
Debugging
# ì¡°ì¬ (Inspect)
docker inspect myapp
# ìí (Stats)
docker stats myapp
# ë¤í¸ìí¬
docker network inspect bridge
# 볼륨
docker volume ls