Bài 39.4: Docker commands và best practices

Chào mừng bạn trở lại với chuỗi bài viết về Lập trình Web Front-end! Trong môi trường phát triển hiện đại, sự nhất quán và khả năng tái tạo là cực kỳ quan trọng. Đó là lý do tại sao Docker đã trở thành một công cụ không thể thiếu. Docker giúp đóng gói ứng dụng cùng với tất cả các thư viện, cấu hình cần thiết vào một "container" độc lập, đảm bảo rằng ứng dụng của bạn sẽ chạy chính xác như nhau trên mọi môi trường, từ máy tính cá nhân của bạn cho đến máy chủ sản xuất.

Trong bài viết này, chúng ta sẽ lặn sâu vào thế giới của Docker, khám phá những lệnh cơ bản và nâng cao mà một nhà phát triển web cần biết, cùng với những best practices quan trọng để tận dụng tối đa sức mạnh của Docker trong quy trình làm việc của bạn.

Tại Sao Docker Lại Quan Trọng Đối Với Nhà Phát Triển Web?

Bạn đã bao giờ gặp phải tình huống ứng dụng chạy tốt trên máy bạn nhưng lại lỗi khi triển khai lên server hay máy của đồng đội chưa? Đó chính là "it works on my machine" syndrome kinh điển! Docker giải quyết vấn đề này bằng cách cung cấp một môi trường chạy ứng dụng độc lập và nhất quán.

Đối với Front-end Dev, Docker có thể giúp:

  • Chuẩn hóa môi trường: Đảm bảo mọi thành viên trong team đều dùng cùng một phiên bản Node.js, cùng các dependencies, loại bỏ xung đột môi trường.
  • Chạy các dịch vụ phụ trợ dễ dàng: Dễ dàng khởi động một server API mock, một database tạm thời (như MongoDB, PostgreSQL) hoặc một Redis cache mà không cần cài đặt chúng trực tiếp lên máy tính của bạn.
  • Cô lập dự án: Mỗi dự án có thể có các dependencies hoặc phiên bản thư viện khác nhau mà không ảnh hưởng lẫn nhau.
  • Đơn giản hóa quy trình CI/CD: Tạo ra các image Docker có thể được build và deploy tự động một cách nhất quán.

Hãy cùng bắt đầu với những lệnh Docker mà bạn sẽ sử dụng hàng ngày!

Các Lệnh Docker Thiết Yếu (Essential Docker Commands)

Để làm việc hiệu quả với Docker, bạn cần nắm vững một bộ lệnh cốt lõi. Dưới đây là những lệnh quan trọng nhất:

1. Xây dựng (Build) Image: docker build

Lệnh này dùng để xây dựng một Docker Image từ một Dockerfile và ngữ cảnh (context) được cung cấp.

docker build -t ten-image-cua-ban:tag .
  • -t ten-image-cua-ban:tag: Gán một tên (name) và thẻ (tag) cho image của bạn. tag thường dùng để đánh dấu phiên bản (ví dụ: latest, v1.0.0). Nếu không chỉ định tag, mặc định sẽ là latest.
  • .: Chỉ định ngữ cảnh build. Thường là thư mục chứa Dockerfile và mã nguồn của bạn. Docker daemon sẽ nén toàn bộ nội dung trong thư mục này (trừ các file được liệt kê trong .dockerignore) và gửi nó đến daemon để xử lý.

Ví dụ: Xây dựng image cho ứng dụng React của bạn:

docker build -t my-react-app:latest .

Lệnh này sẽ tìm file Dockerfile trong thư mục hiện tại (.) và thực hiện các bước trong đó để tạo ra một image mới có tên my-react-app với tag latest.

2. Chạy (Run) Container Từ Image: docker run

Lệnh này tạo và chạy một container mới từ một image đã có.

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • IMAGE: Tên hoặc ID của image bạn muốn chạy.
  • [OPTIONS]: Các tùy chọn cấu hình container.
  • [COMMAND] [ARG...]: Lệnh và đối số để chạy bên trong container (ghi đè lệnh CMD hoặc ENTRYPOINT trong Dockerfile).

Các tùy chọn phổ biến:

  • -d (detached): Chạy container ở chế độ nền (background).
  • -p host_port:container_port: Ánh xạ (map) một cổng từ máy host của bạn đến một cổng trong container. Rất quan trọng để truy cập ứng dụng web đang chạy bên trong.
  • -v host_path:container_path hoặc -v volume_name:container_path: Ánh xạ một volume hoặc thư mục từ host vào container. Hữu ích cho việc chia sẻ dữ liệu hoặc phát triển (hot-reloading).
  • --name container_name: Đặt tên cụ thể cho container để dễ quản lý.
  • -e VAR_NAME=value: Truyền biến môi trường vào container.
  • --network network_name: Kết nối container vào một network cụ thể (quan trọng khi làm việc với Docker Compose).
  • -it: Cấp phát pseudo-TTY và giữ STDIN mở. Thường dùng khi muốn tương tác với container (ví dụ: chạy bash shell bên trong).

Ví dụ: Chạy container ứng dụng React bạn vừa build:

docker run -d -p 3000:3000 --name my-react-container my-react-app:latest
  • -d: Chạy ở chế độ nền.
  • -p 3000:3000: Ánh xạ cổng 3000 của máy host tới cổng 3000 trong container (nơi ứng dụng React dev server thường chạy).
  • --name my-react-container: Đặt tên cho container là my-react-container.
  • my-react-app:latest: Sử dụng image my-react-app với tag latest.

Sau khi chạy lệnh này, bạn có thể truy cập ứng dụng của mình qua trình duyệt tại http://localhost:3000.

3. Xem Danh Sách Containers: docker ps

Lệnh này hiển thị các containers đang chạy.

docker ps
  • docker ps -a: Hiển thị tất cả containers, bao gồm cả những container đã dừng.

Ví dụ:

docker ps

Output sẽ hiển thị thông tin về container my-react-container nếu nó đang chạy, bao gồm ID container, image đang sử dụng, lệnh đã chạy, thời gian tạo, trạng thái, cổng được map và tên container.

4. Xem Danh Sách Images: docker images

Hiển thị các Docker images đã được tải xuống hoặc build trên máy của bạn.

docker images

Ví dụ:

docker images

Bạn sẽ thấy danh sách các image, bao gồm my-react-app, các image base (như node:18-alpine), dung lượng và thời gian tạo.

5. Dừng (Stop) Container: docker stop

Dừng một container đang chạy một cách "duyên dáng" (gracefully). Docker sẽ gửi tín hiệu stop (SIGTERM) và chờ container thoát. Nếu container không thoát sau một khoảng thời gian (mặc định 10 giây), Docker sẽ gửi tín hiệu kill (SIGKILL).

docker stop container_id_or_name [container_id_or_name...]

Ví dụ:

docker stop my-react-container

Hoặc dừng nhiều container:

docker stop container1 container2
6. Xóa (Remove) Container: docker rm

Xóa một container đã dừng.

docker rm container_id_or_name [container_id_or_name...]
  • -f (force): Buộc xóa container đang chạy. Sử dụng cẩn thận!

Ví dụ:

docker rm my-react-container

Để xóa container vừa dừng:

docker stop my-react-container
docker rm my-react-container

Hoặc xóa container đang chạy (không khuyến khích trừ khi cần thiết):

docker rm -f my-react-container
7. Xóa (Remove) Image: docker rmi

Xóa một Docker image.

docker rmi image_id_or_name [image_id_or_name...]
  • -f (force): Buộc xóa image, ngay cả khi có container đang sử dụng nó.

Ví dụ:

docker rmi my-react-app:latest

Để xóa image, trước tiên bạn phải dừng và xóa tất cả containers đang sử dụng image đó, trừ khi dùng -f.

8. Thực Thi Lệnh Bên Trong Container: docker exec

Chạy một lệnh mới bên trong một container đang chạy.

docker exec [OPTIONS] container_id_or_name COMMAND [ARG...]
  • -it: Quan trọng để tương tác với shell bên trong container (ví dụ: mở bash terminal).

Ví dụ: Cài đặt một package mới trong container dev React của bạn:

docker exec -it my-react-container npm install lodash

Lệnh này sẽ mở một phiên tương tác (-it) với container my-react-container và thực thi lệnh npm install lodash bên trong nó.

Ví dụ khác: Mở bash shell bên trong container để debug:

docker exec -it my-react-container bash

Bây giờ bạn đang ở trong terminal của container, có thể kiểm tra file, chạy lệnh nội bộ, v.v. Gõ exit để thoát.

9. Xem Logs Của Container: docker logs

Hiển thị output (stdout và stderr) từ một container.

docker logs [OPTIONS] container_id_or_name
  • -f (follow): Theo dõi output log theo thời gian thực (giống như tail -f).
  • --tail n: Hiển thị n dòng cuối cùng của log.

Ví dụ:

docker logs my-react-container

Để xem log theo thời gian thực khi container đang chạy:

docker logs -f my-react-container
10. Dọn Dẹp Hệ Thống: docker system prune

Một lệnh cực kỳ hữu ích để giải phóng dung lượng ổ đĩa bằng cách xóa các tài nguyên Docker không sử dụng: containers đã dừng, networks không kết nối với container nào, images "dangling" (không được gắn tag và không được sử dụng bởi container nào), và build cache.

docker system prune [OPTIONS]
  • -a (all): Xóa cả các containers đang chạy và images đang được sử dụng (sử dụng rất cẩn thận!). Thường dùng docker system prune không có -a để xóa an toàn hơn.
  • --volumes: Bao gồm cả việc xóa các volumes không được sử dụng.

Ví dụ:

docker system prune

Lệnh này sẽ hỏi xác nhận trước khi xóa. Thêm -f để bỏ qua xác nhận (không khuyến khích trừ khi trong script tự động).

docker system prune --volumes

Lệnh này sẽ xóa cả volumes không được sử dụng, giúp giải phóng nhiều dung lượng hơn nhưng cần chắc chắn bạn không cần dữ liệu trong các volumes đó.

11. Tải Image Từ Registry: docker pull

Tải một image từ Docker Registry (mặc định là Docker Hub).

docker pull image_name:tag

Ví dụ: Tải image Node.js version 18 với tag alpine:

docker pull node:18-alpine
12. Đẩy Image Lên Registry: docker push

Đẩy image cục bộ của bạn lên Docker Registry (cần đăng nhập).

docker push your_registry/image_name:tag
  • your_registry: Tên registry (ví dụ: docker.io/your_username cho Docker Hub).

Ví dụ: Đẩy image my-react-app lên Docker Hub (giả sử username là myuser):

docker push myuser/my-react-app:latest

Trước đó, bạn có thể cần tag lại image với username của mình: docker tag my-react-app:latest myuser/my-react-app:latest.

Dockerfile Cơ Bản Cho Ứng Dụng Frontend

Để build image, bạn cần Dockerfile. Đây là file văn bản chứa các hướng dẫn từng bước để tạo image.

Ví dụ Dockerfile đơn giản cho ứng dụng Node.js/React/Next.js (development mode):

# Bước 1: Chọn Base Image
# Sử dụng một image Node.js với tag "alpine" để có kích thước nhỏ gọn.
FROM node:18-alpine

# Bước 2: Đặt Thư Mục Làm Việc
# Định nghĩa thư mục làm việc mặc định bên trong container.
WORKDIR /app

# Bước 3: Copy File Dependencies
# Copy package.json và package-lock.json (hoặc yarn.lock) vào thư mục làm việc.
# Việc copy riêng này giúp tận dụng cache của Docker nếu dependencies không đổi.
COPY package*.json ./

# Bước 4: Cài Đặt Dependencies
# Chạy lệnh để cài đặt các gói dependencies.
RUN npm install

# Bước 5: Copy Toàn Bộ Mã Nguồn
# Copy phần còn lại của mã nguồn ứng dụng vào thư mục làm việc.
COPY . .

# Bước 6: Expose Cổng
# Chỉ định cổng mà ứng dụng chạy bên trong container sẽ lắng nghe.
# Cổng mặc định cho React dev server là 3000, Next.js là 3000, Vue CLI là 8080...
EXPOSE 3000

# Bước 7: Lệnh Khởi Động
# Lệnh sẽ được thực thi khi container được khởi động.
CMD ["npm", "start"] # Hoặc ["npm", "run", "dev"] cho Next.js dev mode

Giải thích:

  • FROM: Chỉ định image cơ bản mà image của bạn sẽ được xây dựng dựa trên đó. node:18-alpine cung cấp môi trường Node.js nhẹ.
  • WORKDIR: Thiết lập thư mục làm việc hiện tại cho tất cả các lệnh tiếp theo (như COPY, RUN, CMD).
  • COPY package*.json ./: Sao chép các file package.jsonpackage-lock.json (hoặc yarn.lock) từ thư mục ngữ cảnh (.) vào thư mục làm việc (./app) trước khi copy toàn bộ mã nguồn. Điều này là một best practice để tận dụng Docker layer caching. Nếu chỉ có dependencies thay đổi, Docker chỉ cần chạy lại bước RUN npm install mà không cần copy lại toàn bộ code.
  • RUN npm install: Thực thi lệnh npm install bên trong image để cài đặt các dependencies.
  • COPY . .: Sao chép toàn bộ nội dung còn lại từ thư mục ngữ cảnh (.) vào thư mục làm việc (./app) trong image.
  • EXPOSE 3000: Khai báo rằng container sẽ lắng nghe trên cổng 3000. Đây chỉ là tài liệu hóa, bạn vẫn cần dùng -p với docker run để ánh xạ cổng này ra host.
  • CMD ["npm", "start"]: Lệnh mặc định sẽ được chạy khi container khởi động (trừ khi bạn chỉ định một lệnh khác khi dùng docker run).

Docker Compose: Quản Lý Nhiều Container

Trong các dự án web thực tế, bạn thường cần nhiều hơn một container (ví dụ: frontend, backend API, database, cache...). Docker Compose là công cụ giúp định nghĩa và chạy các ứng dụng multi-container. Bạn sử dụng file docker-compose.yml (hoặc .yaml) để cấu hình các service, networks và volumes.

Ví dụ docker-compose.yml đơn giản:

# Phiên bản cấu hình Docker Compose
version: '3.8'

# Định nghĩa các services (các container của ứng dụng)
services:
  # Service frontend (ứng dụng React/Next.js/Vue...)
  frontend:
    # Build image từ Dockerfile trong thư mục ./frontend
    build:
      context: ./frontend # Đường dẫn đến thư mục chứa Dockerfile
      dockerfile: Dockerfile # Tên file Dockerfile (mặc định là Dockerfile)
    # Ánh xạ cổng: host_port:container_port
    ports:
      - "3000:3000"
    # Ánh xạ volumes: host_path:container_path
    # Dùng bind mount cho thư mục code để hỗ trợ hot-reloading trong dev mode
    # Dùng anonymous volume cho node_modules để tránh ghi đè từ host và tận dụng cache
    volumes:
      - ./frontend:/app
      - /app/node_modules # Anonymous volume cho node_modules
    # Đặt biến môi trường cho container
    environment:
      - NODE_ENV=development
      # Có thể thêm các biến môi trường khác như API_URL, etc.
    # Kết nối service này vào mạng nội bộ được định nghĩa dưới đây
    networks:
      - app-network
    # Đảm bảo backend chạy trước frontend (nếu có)
    # depends_on:
    #   - backend

  # Ví dụ thêm service backend (nếu có)
  # backend:
  #   build: ./backend
  #   ports:
  #     - "5000:5000"
  #   networks:
  #     - app-network

  # Ví dụ thêm service database (nếu có)
  # database:
  #   image: postgres:13-alpine # Sử dụng image có sẵn từ Docker Hub
  #   environment:
  #     POSTGRES_DB: mydatabase
  #     POSTGRES_USER: myuser
  #     POSTGRES_PASSWORD: mypassword
  #   volumes:
  #     - db_data:/var/lib/postgresql/data # Lưu data database vào named volume
  #   networks:
  #     - app-network

# Định nghĩa networks
networks:
  app-network:
    driver: bridge # Loại network (bridge là mặc định)

# Định nghĩa volumes (nếu sử dụng named volumes)
# volumes:
#   db_data: # Named volume cho database

Các lệnh Docker Compose cơ bản:

  • docker-compose up: Build (nếu cần) và khởi động tất cả các service trong file docker-compose.yml.
    • -d: Chạy ở chế độ detached (nền).
    • --build: Buộc build lại image trước khi chạy (hữu ích khi bạn thay đổi Dockerfile hoặc mã nguồn).
  • docker-compose down: Dừng và xóa các containers, networks, volumes được tạo bởi docker-compose up.
    • -v: Bao gồm cả việc xóa các named volumes.
  • docker-compose ps: Hiển thị trạng thái của các services.
  • docker-compose logs [service_name]: Xem log của một hoặc tất cả các service.
  • docker-compose exec service_name command: Thực thi lệnh bên trong container của một service đang chạy.

Ví dụ:

# Khởi động toàn bộ ứng dụng multi-container
docker-compose up -d

# Dừng và xóa toàn bộ ứng dụng
docker-compose down

# Dừng, xóa ứng dụng và cả volumes (cẩn thận với dữ liệu database!)
docker-compose down -v

Docker Compose làm cho việc quản lý môi trường phát triển phức tạp trở nên đơn giản hơn rất nhiều!

Best Practices Khi Sử Dụng Docker Cho Phát Triển Web Frontend

Sử dụng Docker không chỉ là về việc biết lệnh, mà còn là áp dụng những phương pháp tốt nhất để tối ưu hóa hiệu suất, bảo mật và trải nghiệm phát triển.

1. Tối Ưu Hóa Dockerfile (Dockerfile Optimization)
  • Tận Dụng Layer Caching: Docker xây dựng image theo từng lớp (layer). Mỗi lệnh trong Dockerfile tạo ra một layer mới. Nếu một layer không thay đổi so với lần build trước, Docker sẽ sử dụng cache. Đặt các lệnh ít thay đổi (như cài đặt dependencies) trước các lệnh thay đổi thường xuyên (như copy mã nguồn).
  • Sử Dụng Multi-Stage Builds: Đặc biệt hữu ích cho các ứng dụng cần bước build (ví dụ: compile TypeScript, build production bundle với Webpack/Rollup/esbuild). Bạn có thể dùng một stage để build ứng dụng (với tất cả các build tools) và một stage khác nhỏ gọn hơn (chỉ chứa runtime như Node.js hoặc thậm chí một web server tĩnh như Nginx/Caddy nếu output là các file HTML/CSS/JS tĩnh) để chạy ứng dụng cuối cùng. Điều này giúp image cuối cùng nhỏ hơn đáng kể, giảm thời gian pull và diện tích tấn công (attack surface).

    # Stage 1: Build Stage
    FROM node:18-alpine AS builder
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    RUN npm run build # Lệnh build ứng dụng production
    
    # Stage 2: Run Stage (dành cho production build)
    # Nếu output là các file tĩnh (SPA), có thể dùng Nginx
    FROM nginx:alpine
    COPY --from=builder /app/dist /usr/share/nginx/html # Copy output build từ stage 'builder'
    # EXPOSE 80 # Mặc định Nginx chạy trên cổng 80
    # CMD ["nginx", "-g", "daemon off;"]
    
    # Nếu output cần Node.js runtime (ví dụ: server-side rendering với Next.js production build)
    # FROM node:18-alpine
    # WORKDIR /app
    # COPY --from=builder /app/package*.json ./ # Copy dependencies (chỉ production)
    # RUN npm install --production
    # COPY --from=builder /app/.next ./.next # Copy output build (.next cho Next.js)
    # COPY --from=builder /app/public ./public # Copy thư mục public
    # EXPOSE 3000
    # CMD ["npm", "start"] # Lệnh start cho production
    
  • Sử Dụng RUN hiệu quả: Kết hợp nhiều lệnh RUN bằng cách sử dụng && để giảm số lượng layers. Ví dụ: RUN apt-get update && apt-get install -y ... && rm -rf /var/lib/apt/lists/*.

2. Sử Dụng .dockerignore

Tương tự như .gitignore, file .dockerignore cho phép bạn loại trừ các file và thư mục khỏi ngữ cảnh build. Điều này quan trọng vì:

  • Giảm kích thước ngữ cảnh: Ngữ cảnh nhỏ hơn, quá trình gửi ngữ cảnh đến Docker daemon nhanh hơn.
  • Tránh sao chép không cần thiết: Loại bỏ các thư mục như node_modules (từ máy host), .git, .env, các thư mục build cục bộ (dist, build), v.v., giúp quá trình copy trong Dockerfile nhanh hơn và tránh ghi đè lên dependencies được cài đặt trong container.

Ví dụ .dockerignore cho dự án Node.js/React:

node_modules
build
dist
.env
.git
.DS_Store
npm-debug.log*
yarn-debug.log*
yarn-error.log*
3. Sử Dụng Minimal Base Images

Chọn base image càng nhỏ gọn càng tốt. Các image dựa trên Alpine Linux (ví dụ: node:18-alpine, nginx:alpine) rất phổ biến vì chúng có kích thước nhỏ hơn đáng kể so với các base image đầy đủ (như Ubuntu). Image nhỏ hơn giúp:

  • Tải image nhanh hơn.
  • Giảm diện tích tấn công (ít package, ít lỗ hổng bảo mật tiềm ẩn).
4. Chạy Ứng Dụng Bằng User Không Phải Root (Non-root User)

Theo mặc định, các lệnh RUNCMD trong Dockerfile thường chạy với quyền root bên trong container. Đây là một rủi ro bảo mật. Nên tạo một user không có quyền root và chạy ứng dụng bằng user đó.

# ... các bước trước (FROM, WORKDIR, COPY, RUN npm install) ...

# Tạo một user mới (ví dụ: nodeuser)
RUN addgroup --system appgroup && adduser --system --ingroup appgroup appuser
# Đặt quyền sở hữu thư mục làm việc cho user mới
RUN chown -R appuser:appgroup /app

# Chuyển sang user mới
USER appuser

# Lệnh khởi động ứng dụng (sẽ chạy dưới user appuser)
CMD ["npm", "start"]
5. Quản Lý Dependencies và Volumes Hiệu Quả (Đặc Biệt Trong Phát Triển)
  • Dependencies: Như đã nói ở mục Dockerfile, copy package.json trước, chạy npm install, rồi mới copy code.
  • Volume Mounts trong Development: Sử dụng bind mounts (-v ./frontend:/app) là tuyệt vời cho hot-reloading vì code thay đổi trên host sẽ tự động phản ánh trong container. Tuy nhiên, cần lưu ý:
    • Các file trong thư mục bind mount trên host sẽ ghi đè lên nội dung tương ứng trong container. Nếu node_modules tồn tại trên host, nó có thể ghi đè lên node_modules được cài đặt trong container, gây lỗi do khác hệ điều hành/kiến trúc.
    • Giải pháp phổ biến là thêm một volume ẩn danh (anonymous volume) cho thư mục node_modules trong container: -v ./frontend:/app -v /app/node_modules. Điều này nói với Docker rằng hãy ánh xạ ./frontend trên host vào /app trong container, nhưng tạo một volume riêng biệt cho /app/node_modules bên trong container, ngăn không cho node_modules trên host ghi đè lên. Docker Compose giúp cấu hình điều này dễ dàng hơn (như ví dụ docker-compose.yml ở trên).
6. Sử Dụng Biến Môi Trường Cho Cấu Hình (Environment Variables)

Không nên "hardcode" các thông tin cấu hình (API endpoint, database credentials, secret keys...) trực tiếp vào Dockerfile hoặc mã nguồn. Thay vào đó, sử dụng biến môi trường. Docker cung cấp nhiều cách để truyền biến môi trường vào container:

  • docker run -e VAR_NAME=value ...
  • Sử dụng key environment trong docker-compose.yml.
  • Sử dụng file .env kết hợp với Docker Compose.

Điều này giúp image của bạn trở nên chung chung hơn và cấu hình được quản lý bên ngoài container, linh hoạt và bảo mật hơn.

7. Triển Khai Sản Xuất (Production Deployment)
  • Build Image Production: Sử dụng multi-stage build để tạo image production nhỏ gọn, chỉ chứa code đã build và runtime cần thiết (không bao gồm dev dependencies, build tools...).
  • Không Chạy Dev Server: Image production không nên chạy dev server (ví dụ: npm start của Create React App). Thay vào đó, build ứng dụng (npm run build) và phục vụ các file tĩnh bằng một web server hiệu quả như Nginx, hoặc chạy server production của framework (ví dụ: npm start cho Next.js production build).
  • Quản Lý Secrets: Đối với thông tin nhạy cảm trong production, hãy sử dụng các công cụ quản lý secrets của nền tảng triển khai (Docker Swarm Secrets, Kubernetes Secrets, AWS Secrets Manager, HashiCorp Vault...).
8. Sử Dụng HEALTHCHECK

Thêm lệnh HEALTHCHECK vào Dockerfile để Docker daemon có thể kiểm tra xem ứng dụng bên trong container có thực sự khỏe mạnh và sẵn sàng phục vụ request hay không, thay vì chỉ kiểm tra xem process chính có đang chạy hay không.

# ... các bước khác ...

# Kiểm tra sức khỏe bằng cách gọi một endpoint đơn giản (ví dụ: /health trên cổng 3000)
HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl --fail http://localhost:3000/ || exit 1

# ... các bước khác ...

Điều này giúp các hệ thống điều phối (orchestrators) như Docker Swarm hoặc Kubernetes biết khi nào cần khởi động lại container bị lỗi hoặc chuyển traffic đi chỗ khác.

Comments

There are no comments at the moment.