Bài 39.4: Docker commands và best practices

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ứaDockerfile
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ệnhCMD
hoặcENTRYPOINT
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 imagemy-react-app
với taglatest
.
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ùngdocker 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 filepackage.json
vàpackage-lock.json
(hoặcyarn.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ướcRUN npm install
mà không cần copy lại toàn bộ code.RUN npm install
: Thực thi lệnhnpm 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ớidocker 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ùngdocker 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 filedocker-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ởidocker-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ệnhRUN
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 RUN
và CMD
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ạynpm 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ênnode_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 chonode_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).
- 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
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
trongdocker-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