# Docker 面试总览:镜像、容器与可复现交付

⚡ 30 秒速记

  • 镜像 = 只读分层文件系统 + 启动配置;容器 = 镜像上加一层可写层、跑起来的隔离进程
  • 隔离靠 namespace(进程、网络、挂载视图),限资源靠 cgroup,和宿主机共享内核,所以不是轻量虚拟机
  • Dockerfile 先拷 package.json 和锁文件再装依赖,最后拷源码,改业务代码能复用依赖层;多阶段构建只把产物放进运行镜像
  • 可写层是临时的:数据进 volume 或外部存储,配置和密钥运行时注入,服务之间用服务名不用 IP
  • 生产要点:非 root、处理 SIGTERM、资源上限、健康检查、不可变 tag 或 digest,别用 latest

镜像可以理解成一个只读的安装包,容器就是拿这个安装包跑起来的一个被隔离的进程。 隔离靠 Linux 的 namespace,让容器只看得见自己的进程、网络和文件系统,限 CPU、内存靠 cgroup,但它和宿主机共用同一个内核,所以比虚拟机轻、启动快,安全边界也更薄。写 Dockerfile 我最在意两点:依赖层放前面吃缓存,多阶段构建让运行镜像里只有产物。

FROM node:22-alpine AS build
WORKDIR /app
COPY package.json yarn.lock ./
RUN corepack enable && yarn install --immutable   # 只有锁文件变了才重装
COPY . .
RUN yarn build

FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
USER node
COPY --from=build --chown=node:node /app/.next/standalone ./
COPY --from=build --chown=node:node /app/.next/static ./.next/static
CMD ["node", "server.js"]

镜像由一组不可变层和元数据组成,容器启动时在其上增加可写层并创建受隔离的进程。namespace 分隔进程号、网络、挂载点等视图,cgroup 控制 CPU、内存等资源;宿主与容器仍共享内核,所以镜像能比完整虚拟机更小、启动更快,也意味着内核漏洞和过高权限需要认真防护。

一份可维护的前端镜像通常使用多阶段构建:构建阶段安装完整依赖并产出静态文件或 Next.js standalone 包,运行阶段只复制产物和生产依赖。依赖清单应先于源码复制,这样日常改业务代码时还能复用安装层;.dockerignore 则避免把 .git、本地缓存和密钥送进 build context。latest 不能提供可追溯性,发布应使用不可变 tag 或 digest。

webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部