docker

服务架构

docker-client-server

镜像架构

docker-image

基础技术

容器生命周期

docker-lifecycle

Dockerfile

# ============ 构建阶段 ============
# ARG 定义构建参数,可在构建时通过 --build-arg 传入
ARG NODE_VERSION=18
ARG BUILD_ENV=production

# 第一阶段:构建阶段,包含完整的构建工具
FROM node:${NODE_VERSION} AS builder

# LABEL 添加元数据标签,用于镜像管理
LABEL maintainer="dev@example.com"
LABEL description="Web application with multi-stage build"
LABEL version="1.0.0"
LABEL build.env="${BUILD_ENV}"

# WORKDIR 设置工作目录,如果目录不存在会自动创建
WORKDIR /build

# 设置环境变量,ENV 在整个构建过程和运行期都有效
ENV NODE_ENV=${BUILD_ENV}
ENV NPM_CONFIG_LOGLEVEL=warn

# COPY 复制本地文件到镜像,支持通配符和多个源
COPY package*.json ./
COPY tsconfig.json ./
COPY src ./src

# RUN 执行命令,&& 连接多个命令,\ 用于换行
RUN npm ci && \
    npm run build && \
    npm prune --production && \
    rm -rf /build/node_modules/.cache

# ============ 运行时阶段 ============
# 第二阶段:运行阶段,使用轻量级基础镜像
FROM node:${NODE_VERSION}-alpine AS runtime

# 添加元数据标签
LABEL stage="runtime"

# 安装系统依赖和运行时工具
RUN apk add --no-cache \
    curl \
    tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata

# 创建非 root 用户(安全最佳实践)
RUN addgroup -g 1001 -S appgroup && \
    adduser -S appuser -u 1001 -G appgroup

WORKDIR /app

# 从构建阶段复制文件(多阶段构建的关键)
COPY --from=builder --chown=appuser:appgroup /build/dist ./dist
COPY --from=builder --chown=appuser:appgroup /build/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /build/package*.json ./

# ADD 类似 COPY,但可以自动解压 tar 文件或从 URL 下载
# 这里演示复制本地压缩包(如果有的话)
# ADD app-config.tar.gz /app/config/

# VOLUME 创建挂载点,用于数据持久化
VOLUME ["/app/logs", "/app/data"]

# EXPOSE 声明容器监听端口(TCP 默认,可指定 UDP)
EXPOSE 3000
EXPOSE 8080/udp

# HEALTHCHECK 定义健康检查命令
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:3000/health || exit 1

# STOPSIGNAL 设置停止容器的信号,默认是 SIGTERM
STOPSIGNAL SIGTERM

# 切换到非 root 用户
USER appuser

# ENTRYPOINT 设置入口点,与 CMD 结合使用
# ENTRYPOINT 不会被 docker run 的参数覆盖,CMD 可以作为 ENTRYPOINT 的参数
ENTRYPOINT ["node"]

# CMD 提供默认命令,如果 docker run 指定了命令则会被覆盖
# 使用 exec 形式(JSON 数组)避免 shell 解释,提高效率
CMD ["dist/server.js"]

# ONBUILD 延迟执行指令,当此镜像被其他 Dockerfile 作为基础镜像时触发
ONBUILD COPY . /app
ONBUILD RUN npm install

镜像管理/仓库(Registry)

网络

存储/数据卷(Storage/Volumes)

Docker Compose

厂商