跳到正文
前端知识库
工程化

Docker 基础知识速览

从镜像、容器、网络和存储四个概念出发,快速掌握 Docker 的常用操作、排障入口与安全边界。

3 分钟Docker · 容器 · 部署 · 网络 · 面试

Docker 基础知识速览

一、Docker 解决什么问题

Docker 用镜像描述应用及其运行依赖,用容器启动镜像的隔离进程。它把“在我的机器上能运行”的环境差异收敛到可分发的构建产物,但不会自动解决应用配置、数据持久化、网络安全或高可用。

Dockerfile -> build -> Image -> run -> Container
                              |
                              +-> Network / Volume / Logs

几个常见概念:

概念 含义 面试中的边界
镜像(image) 分层、只读的应用模板 应固定版本或摘要,不能当运行时数据盘
容器(container) 镜像启动后的隔离进程 容器销毁后,未挂载的数据通常会丢失
Registry 镜像仓库 私有仓库需要认证、扫描和访问控制
Docker daemon 负责构建、创建和管理容器的服务 CLI 连接不上时先检查 daemon 和权限
Volume Docker 管理的持久化存储 不要把数据库数据只放在容器可写层

二、最常用的生命周期命令

# 构建和查看
docker build -t app:dev .
docker image ls
docker image inspect app:dev

# 运行、查看、停止
docker run --name app -p 3000:3000 app:dev
docker ps
docker logs --tail 200 app
docker exec -it app sh
docker stop app
docker rm app

-p 3000:3000 的左侧是宿主机端口,右侧是容器内端口;EXPOSE 只是镜像元数据,不会自动把端口暴露到宿主机。生产环境应明确绑定地址、反向代理和访问控制,不能把管理端口无条件映射到公网。

查看问题时先收集证据:

docker ps -a
docker inspect app
docker logs app
docker stats app
docker events --since 10m

不要一遇到磁盘问题就执行全局清理。docker image prunedocker volume prunedocker system prune 可能删除仍需要的缓存或数据;执行前先用 docker system df 确认对象和恢复方式。

三、Dockerfile 的基本原则

FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=build /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]

回答 Dockerfile 题时至少说明:

  • 多阶段构建让编译工具不进入运行镜像;
  • 先复制 lockfile 并安装依赖,利用缓存且保证可复现;
  • 使用非 root 用户,避免应用漏洞直接获得容器 root 权限;
  • 运行进程使用 exec 形式的 CMD,让信号能正确传给应用;
  • 通过 .dockerignore 排除 .git、本地依赖、密钥和构建缓存。

四、网络和存储速记

网络

  • 默认情况下容器有独立网络命名空间;同一 user-defined network 中的服务可以通过服务名互相解析。
  • -p host:container 做端口发布;容器之间通信通常不需要把内部端口发布到宿主机。
  • 容器无法访问外网时,依次检查容器网络、默认路由、DNS、代理和防火墙;不要只改应用代码。
  • --network none 可用于不需要网络的任务;需要跨网络访问时应采用最小权限和明确的出口策略。

存储

数据类型 建议方式 说明
临时缓存 tmpfs 或容器可写层 容器重建后不保留
数据库、上传文件 named volume 或外部对象存储 明确备份、权限和生命周期
开发源码挂载 bind mount 适合开发,不要默认用于生产数据

镜像应尽量无状态。容器日志输出到 stdout/stderr,由运行平台收集;不要把日志文件无限写入容器层。

五、30 秒口述模板

我会把 Docker 分成镜像、容器、网络和存储四部分:镜像提供可复现的运行模板,容器是隔离进程;网络负责服务发现和端口边界,Volume 负责容器外的数据生命周期。落地时使用多阶段构建、非 root 用户、固定依赖和健康检查,并通过日志、资源指标和镜像扫描验证部署结果。

六、高频追问入口