spinny:~/writing $ vim docker-containers-complete-guide.md
1~2Docker da thay doi cach chung ta xay dung, phan phoi va chay phan mem. Thay vi "chay duoc tren may cua toi", Docker dam bao rang ung dung cua ban chay giong nhau o moi noi - tren laptop cua ban, tren may cua dong nghiep, trong CI/CD va trong production. Trong huong dan nay, chung ta se di tu con so khong den viec deploy mot ung dung thuc te.3~4## Docker la gi?5~6Docker la mot nen tang dong goi ung dung cua ban va tat ca cac phu thuoc cua no vao mot don vi chuan hoa goi la **container**. Container la mot tien trinh co lap, nhe, chia se kernel OS cua may chu nhung co he thong tap tin, mang va khong gian tien trinh rieng.7~8```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 end17~18 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```26~27### Container vs May Ao28~29| Khia canh | Container | May Ao |30|-----------|-----------|--------|31| **Khoi dong** | Giay | Phut |32| **Kich thuoc** | MB | GB |33| **OS** | Chia se kernel may chu | OS khach day du |34| **Co lap** | Cap tien trinh | Cap phan cung |35| **Hieu suat** | Gan nhu native | Chi phi tu hypervisor |36| **Mat do** | Hang tram moi may chu | Hang chuc moi may chu |37~38## Cai dat Docker39~40```bash41# macOS42brew install --cask docker43~44# Ubuntu/Debian45curl -fsSL https://get.docker.com | sh46sudo usermod -aG docker $USER47~48# Verify installation49docker --version50docker run hello-world51```52~53## Cac Khai niem Cot loi54~55### Image56~57Image la mot template chi doc voi cac huong dan de tao container. Hay nghi ve no nhu mot ban chup nhanh cua ung dung va moi truong cua no.58~59```bash60# Pull an image from Docker Hub61docker pull node:20-alpine62~63# List local images64docker images65~66# Remove an image67docker rmi node:20-alpine68```69~70### Container71~72Container la mot phien ban dang chay cua mot image. Ban co the tao, khoi dong, dung va xoa container.73~74```bash75# Run a container76docker run -d --name my-app -p 3000:3000 node:20-alpine77~78# List running containers79docker ps80~81# List all containers (including stopped)82docker ps -a83~84# Stop a container85docker stop my-app86~87# Remove a container88docker rm my-app89~90# View logs91docker logs my-app92~93# Execute a command inside a running container94docker exec -it my-app sh95```96~97## Viet Dockerfile98~99Dockerfile la mot tap tin van ban voi cac huong dan de xay dung image. Moi huong dan tao mot layer.100~101### Dockerfile Co ban cho Ung dung Node.js102~103```dockerfile104# Use an official Node.js runtime as base image105FROM node:20-alpine106~107# Set working directory108WORKDIR /app109~110# Copy package files first (better caching)111COPY package.json package-lock.json ./112~113# Install dependencies114RUN npm ci --only=production115~116# Copy application code117COPY . .118~119# Expose the port the app runs on120EXPOSE 3000121~122# Command to run the application123CMD ["node", "server.js"]124```125~126### Build va Chay127~128```bash129# Build the image130docker build -t my-node-app .131~132# Run the container133docker run -d -p 3000:3000 my-node-app134~135# Visit http://localhost:3000136```137~138## Multi-Stage Build139~140Multi-stage build giu cho image production cua ban nho bang cach tach moi truong build khoi runtime.141~142```dockerfile143# Stage 1: Build144FROM node:20-alpine AS builder145WORKDIR /app146COPY package.json package-lock.json ./147RUN npm ci148COPY . .149RUN npm run build150~151# 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```160~161Dieu nay tao ra mot image chi chua dau ra da bien dich va cac phu thuoc production - khong co ma nguon, khong co phu thuoc phat trien, khong co cong cu build.162~163### Vi du Multi-Stage cho Next.js164~165```dockerfile166FROM node:20-alpine AS deps167WORKDIR /app168COPY package.json package-lock.json ./169RUN npm ci170~171FROM node:20-alpine AS builder172WORKDIR /app173COPY --from=deps /app/node_modules ./node_modules174COPY . .175RUN npm run build176~177FROM 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```186~187## Volume: Du lieu Ben vung188~189Mac dinh, du lieu ben trong container se mat khi container bi xoa. Volume giai quyet van de nay.190~191```bash192# Create a named volume193docker volume create my-data194~195# Run with a volume196docker run -d -v my-data:/app/data my-app197~198# Bind mount (map host directory to container)199docker run -d -v $(pwd)/data:/app/data my-app200~201# List volumes202docker volume ls203```204~205## Mang206~207Docker tao cac mang co lap de cac container giao tiep voi nhau.208~209```bash210# Create a custom network211docker network create my-network212~213# Run containers on the same network214docker run -d --name api --network my-network my-api215docker run -d --name db --network my-network postgres:16216~217# Containers can reach each other by name218# From "api" container: postgres://db:5432219```220~221```mermaid222graph LR223 subgraph "my-network"224 API[api container\nport 3000] -- "db:5432" --> DB[db container\nport 5432]225 end226 User -- "localhost:3000" --> API227```228~229## Docker Compose230~231Docker Compose cho phep ban dinh nghia va chay cac ung dung nhieu container voi mot tap tin YAML duy nhat.232~233### docker-compose.yml234~235```yaml236services:237 api:238 build: ./api239 ports:240 - "3000:3000"241 environment:242 - DATABASE_URL=postgres://user:pass@db:5432/mydb243 depends_on:244 - db245~246 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"256~257 redis:258 image: redis:7-alpine259 ports:260 - "6379:6379"261~262volumes:263 pgdata:264```265~266### Cac Lenh267~268```bash269# Start all services270docker compose up -d271~272# View logs273docker compose logs -f274~275# Stop all services276docker compose down277~278# Rebuild and restart279docker compose up -d --build280~281# Scale a service282docker compose up -d --scale api=3283```284~285## .dockerignore286~287Giong nhu `.gitignore`, tap tin nay ngan cac tap tin khong can thiet bi sao chep vao image.288~289```plaintext290node_modules291.git292.env293*.md294.next295dist296coverage297```298~299## Cac Phuong phap Tot nhat cho Production300~301### 1. Su dung Image Co so Nho302~303```dockerfile304# Bad: 1GB+305FROM node:20306~307# Good: ~180MB308FROM node:20-alpine309```310~311### 2. Khong Chay voi Quyen Root312~313```dockerfile314FROM node:20-alpine315RUN addgroup -S app && adduser -S app -G app316USER app317WORKDIR /home/app318COPY --chown=app:app . .319```320~321### 3. Su dung Tag Image Cu the322~323```dockerfile324# Bad: can change unexpectedly325FROM node:latest326~327# Good: pinned version328FROM node:20.11-alpine3.19329```330~331### 4. Tan dung Build Cache332~333Sap xep cac huong dan Dockerfile tu it thay doi nhat den thay doi nhieu nhat:334~335```dockerfile336FROM node:20-alpine337WORKDIR /app338~339# These change rarely - cached340COPY package.json package-lock.json ./341RUN npm ci --only=production342~343# This changes often - not cached344COPY . .345```346~347### 5. Health Check348~349```dockerfile350HEALTHCHECK --interval=30s --timeout=3s --retries=3 \351 CMD wget -qO- http://localhost:3000/health || exit 1352```353~354### 6. Su dung Bien Moi truong355~356```dockerfile357ENV NODE_ENV=production358ENV PORT=3000359```360~361## Bang Tham chieu Nhanh cac Lenh Docker Thuong dung362~363```bash364# Images365docker build -t name:tag . # Build image366docker images # List images367docker rmi image_name # Remove image368docker image prune # Remove unused images369~370# 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 container377~378# Compose379docker compose up -d # Start services380docker compose down # Stop services381docker compose logs -f # Follow all logs382docker compose ps # List services383~384# Cleanup385docker system prune -a # Remove everything unused386```387~388## Tu Docker den Kubernetes389~390Docker quan ly cac container rieng le. Khi ban can dieu phoi hang tram container tren nhieu may chu, ban can Kubernetes. Docker va Kubernetes bo sung cho nhau:391~3921. **Docker**: xay dung va chay container3932. **Kubernetes**: dieu phoi container o quy mo lon (lap lich, mo rong, tu phuc hoi)394~395Neu ban quan tam den buoc tiep theo, hay xem bai viet cua toi ve Gioi thieu Kubernetes.396~397## Ket luan398~399Docker la mot ky nang co ban cho cac nha phat trien hien dai. No loai bo su khong nhat quan ve moi truong, don gian hoa viec deploy va la nen tang cho viec dieu phoi container voi Kubernetes. Bat dau voi mot Dockerfile don gian, chuyen sang Docker Compose cho cac ung dung nhieu dich vu, va ap dung multi-stage build cung cac phuong phap bao mat tot nhat khi ban phat trien.400~401Cach tot nhat de hoc Docker la container hoa mot du an ma ban dang lam viec. Hay bat dau ngay hom nay.402~
NORMAL · docker-containers-complete-guide.md [readonly]402 lines · :q to close