spinny:~/writing $ less docker-containers-complete-guide.md
12Binago ng Docker ang paraan ng pagbuo, pagpapadala, at pagpapatakbo natin ng software. Sa halip na "gumagana sa makina ko," ginagarantiya ng Docker na pareho ang takbo ng iyong application kahit saan - sa iyong laptop, sa makina ng katrabaho, sa CI/CD, at sa production. Sa gabay na ito, magsisimula tayo mula sa zero hanggang sa pag-deploy ng isang tunay na application.34## Ano ang Docker?56Ang Docker ay isang platform na nagpa-package ng iyong application at lahat ng dependencies nito sa isang standardized unit na tinatawag na **container**. Ang container ay isang isolated, magaan na proseso na nagbabahagi ng host OS kernel ngunit may sariling filesystem, network, at process space.78```mermaid9graph TD10 subgraph "Traditional Deployment"11 A1[App 1] --> OS1[Guest OS]12 A2[App 2] --> OS2[Guest OS]13 OS1 --> HV[Hypervisor]14 OS2 --> HV15 HV --> HW1[Hardware]16 end1718 subgraph "Docker Deployment"19 B1[App 1] --> D1[Container]20 B2[App 2] --> D2[Container]21 D1 --> DE[Docker Engine]22 D2 --> DE23 DE --> HW2[Hardware]24 end25```2627### Mga Container vs Virtual Machine2829| Aspeto | Mga Container | Virtual Machine |30|--------|-------------|-----------------|31| **Startup** | Segundo | Minuto |32| **Laki** | MB | GB |33| **OS** | Nagbabahagi ng host kernel | Buong guest OS |34| **Isolation** | Antas ng proseso | Antas ng hardware |35| **Performance** | Halos native | Overhead mula sa hypervisor |36| **Density** | Daan-daan bawat host | Sampu-sampu bawat host |3738## Pag-install ng Docker3940```bash41# macOS42brew install --cask docker4344# Ubuntu/Debian45curl -fsSL https://get.docker.com | sh46sudo usermod -aG docker $USER4748# Verify installation49docker --version50docker run hello-world51```5253## Mga Pangunahing Konsepto5455### Mga Image5657Ang image ay isang read-only template na may mga tagubilin para sa paggawa ng container. Isipin ito bilang isang snapshot ng iyong application at ng kapaligiran nito.5859```bash60# Pull an image from Docker Hub61docker pull node:20-alpine6263# List local images64docker images6566# Remove an image67docker rmi node:20-alpine68```6970### Mga Container7172Ang container ay isang tumatakbo na instance ng isang image. Maaari kang gumawa, mag-start, mag-stop, at mag-delete ng mga container.7374```bash75# Run a container76docker run -d --name my-app -p 3000:3000 node:20-alpine7778# List running containers79docker ps8081# List all containers (including stopped)82docker ps -a8384# Stop a container85docker stop my-app8687# Remove a container88docker rm my-app8990# View logs91docker logs my-app9293# Execute a command inside a running container94docker exec -it my-app sh95```9697## Pagsulat ng Dockerfile9899Ang Dockerfile ay isang text file na may mga tagubilin para sa pagbuo ng image. Bawat tagubilin ay gumagawa ng isang layer.100101### Basic na Dockerfile para sa isang Node.js App102103```dockerfile104# Use an official Node.js runtime as base image105FROM node:20-alpine106107# Set working directory108WORKDIR /app109110# Copy package files first (better caching)111COPY package.json package-lock.json ./112113# Install dependencies114RUN npm ci --only=production115116# Copy application code117COPY . .118119# Expose the port the app runs on120EXPOSE 3000121122# Command to run the application123CMD ["node", "server.js"]124```125126### Pagbuo at Pagpapatakbo127128```bash129# Build the image130docker build -t my-node-app .131132# Run the container133docker run -d -p 3000:3000 my-node-app134135# Visit http://localhost:3000136```137138## Multi-Stage Build139140Ang mga multi-stage build ay nagpapanatiling maliit ng iyong production image sa pamamagitan ng paghihiwalay ng build environment mula sa runtime.141142```dockerfile143# Stage 1: Build144FROM node:20-alpine AS builder145WORKDIR /app146COPY package.json package-lock.json ./147RUN npm ci148COPY . .149RUN npm run build150151# Stage 2: Production152FROM node:20-alpine AS runner153WORKDIR /app154COPY --from=builder /app/dist ./dist155COPY --from=builder /app/node_modules ./node_modules156COPY --from=builder /app/package.json ./157EXPOSE 3000158CMD ["node", "dist/server.js"]159```160161Gumagawa ito ng image na naglalaman lamang ng compiled output at production dependencies - walang source code, walang dev dependencies, walang build tools.162163### Next.js Multi-Stage Halimbawa164165```dockerfile166FROM node:20-alpine AS deps167WORKDIR /app168COPY package.json package-lock.json ./169RUN npm ci170171FROM node:20-alpine AS builder172WORKDIR /app173COPY --from=deps /app/node_modules ./node_modules174COPY . .175RUN npm run build176177FROM node:20-alpine AS runner178WORKDIR /app179ENV NODE_ENV=production180COPY --from=builder /app/public ./public181COPY --from=builder /app/.next/standalone ./182COPY --from=builder /app/.next/static ./.next/static183EXPOSE 3000184CMD ["node", "server.js"]185```186187## Mga Volume: Persistent na Data188189Bilang default, nawawala ang data sa loob ng container kapag inalis ang container. Nilulutas ito ng mga volume.190191```bash192# Create a named volume193docker volume create my-data194195# Run with a volume196docker run -d -v my-data:/app/data my-app197198# Bind mount (map host directory to container)199docker run -d -v $(pwd)/data:/app/data my-app200201# List volumes202docker volume ls203```204205## Networking206207Gumagawa ang Docker ng mga isolated network para makipag-usap ang mga container.208209```bash210# Create a custom network211docker network create my-network212213# Run containers on the same network214docker run -d --name api --network my-network my-api215docker run -d --name db --network my-network postgres:16216217# Containers can reach each other by name218# From "api" container: postgres://db:5432219```220221```mermaid222graph LR223 subgraph "my-network"224 API[api container\nport 3000] -- "db:5432" --> DB[db container\nport 5432]225 end226 User -- "localhost:3000" --> API227```228229## Docker Compose230231Hinahayaan ka ng Docker Compose na i-define at patakbuhin ang mga multi-container application gamit ang isang YAML file.232233### docker-compose.yml234235```yaml236services:237 api:238 build: ./api239 ports:240 - "3000:3000"241 environment:242 - DATABASE_URL=postgres://user:pass@db:5432/mydb243 depends_on:244 - db245246 db:247 image: postgres:16-alpine248 environment:249 - POSTGRES_USER=user250 - POSTGRES_PASSWORD=pass251 - POSTGRES_DB=mydb252 volumes:253 - pgdata:/var/lib/postgresql/data254 ports:255 - "5432:5432"256257 redis:258 image: redis:7-alpine259 ports:260 - "6379:6379"261262volumes:263 pgdata:264```265266### Mga Command267268```bash269# Start all services270docker compose up -d271272# View logs273docker compose logs -f274275# Stop all services276docker compose down277278# Rebuild and restart279docker compose up -d --build280281# Scale a service282docker compose up -d --scale api=3283```284285## .dockerignore286287Tulad ng `.gitignore`, pinipigilan ng file na ito ang mga hindi kailangang file na makopya sa image.288289```plaintext290node_modules291.git292.env293*.md294.next295dist296coverage297```298299## Mga Pinakamahuhusay na Kasanayan para sa Production300301### 1. Gumamit ng Maliliit na Base Image302303```dockerfile304# Bad: 1GB+305FROM node:20306307# Good: ~180MB308FROM node:20-alpine309```310311### 2. Huwag Patakbuhin bilang Root312313```dockerfile314FROM node:20-alpine315RUN addgroup -S app && adduser -S app -G app316USER app317WORKDIR /home/app318COPY --chown=app:app . .319```320321### 3. Gumamit ng Specific na Image Tag322323```dockerfile324# Bad: can change unexpectedly325FROM node:latest326327# Good: pinned version328FROM node:20.11-alpine3.19329```330331### 4. Samantalahin ang Build Cache332333Ayusin ang mga tagubilin ng iyong Dockerfile mula sa pinakamadalang hanggang sa pinakamadalas na nagbabago:334335```dockerfile336FROM node:20-alpine337WORKDIR /app338339# These change rarely - cached340COPY package.json package-lock.json ./341RUN npm ci --only=production342343# This changes often - not cached344COPY . .345```346347### 5. Health Check348349```dockerfile350HEALTHCHECK --interval=30s --timeout=3s --retries=3 \351 CMD wget -qO- http://localhost:3000/health || exit 1352```353354### 6. Gumamit ng Environment Variable355356```dockerfile357ENV NODE_ENV=production358ENV PORT=3000359```360361## Cheat Sheet ng mga Karaniwang Docker Command362363```bash364# Images365docker build -t name:tag . # Build image366docker images # List images367docker rmi image_name # Remove image368docker image prune # Remove unused images369370# Containers371docker run -d -p 3000:3000 image # Run detached372docker ps # List running373docker stop container_name # Stop374docker rm container_name # Remove375docker logs -f container_name # Follow logs376docker exec -it container sh # Shell into container377378# Compose379docker compose up -d # Start services380docker compose down # Stop services381docker compose logs -f # Follow all logs382docker compose ps # List services383384# Cleanup385docker system prune -a # Remove everything unused386```387388## Mula Docker Papuntang Kubernetes389390Pinangangasiwaan ng Docker ang mga indibidwal na container. Kapag kailangan mong i-orchestrate ang daan-daang container sa maraming server, kailangan mo ng Kubernetes. Nagpupunan ang Docker at Kubernetes:3913921. **Docker**: nagbubuo at nagpapatakbo ng mga container3932. **Kubernetes**: nag-o-orchestrate ng mga container sa malaking sukat (scheduling, scaling, healing)394395Kung interesado ka sa susunod na hakbang, tingnan ang aking artikulo tungkol sa Introduction to Kubernetes.396397## Konklusyon398399Ang Docker ay isang pundamental na kasanayan para sa mga modernong developer. Inaalis nito ang mga hindi pagkakatugma ng kapaligiran, pinapasimple ang deployment, at pundasyon ito ng container orchestration gamit ang Kubernetes. Magsimula sa isang simpleng Dockerfile, lumipat sa Docker Compose para sa mga multi-service app, at i-adopt ang multi-stage build at security best practice habang lumalaki ka.400401Ang pinakamahusay na paraan para matuto ng Docker ay i-containerize ang isang proyekto na ginagawa mo na. Magsimula ngayon.402
:Docker para sa mga Baguhan: Mula sa Unang Image Hanggang sa Production Deploylines 1-402 (END) — press q to close