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 prune、docker volume prune 和 docker 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 用户、固定依赖和健康检查,并通过日志、资源指标和镜像扫描验证部署结果。