🚀 2026 开发者必看:
一、 Docker 核心命令百科全书
1. 镜像管理 (Images) --- 你的程序
| 命令 | 示例 | 核心用途 |
|---|---|---|
| 构建 | docker build -t app:v1 . |
根据 Dockerfile 创建镜像 |
| 查看 | docker images |
列出本地所有镜像 |
| 删除 | docker rmi [ID/Name] |
删除本地镜像 |
| 导出 | docker save -o app.tar app:v1 |
镜像打包成文件(跨服务器传输) |
| 导入 | docker load -i app.tar |
从文件恢复镜像 |
2. 容器生命周期 (Containers) --- 程序的运行实例
| 命令 | 示例 | 核心用途 |
|---|---|---|
| 创建启动 | docker run -d -p 80:80 --name web nginx |
最常用:创建并后台启动容器 |
| 启动 | docker start web |
启动容器 |
| 停止 | docker stop web |
停止容器运行 |
| 重启 | docker restart web |
重启容器 |
| 查看状态 | docker ps |
查看所有容器(只包含启动的) |
| 查看状态 | docker ps -a |
查看所有容器(含已停止) |
| 进入容器 | docker exec -it web sh |
调试必备:进入容器内部交互 |
| 删除 | docker rm -f web |
强制删除运行中的容器 |
3. 运维与性能监控 --- 线上"救火"神器
| 命令 | 示例 | 核心用途 |
|---|---|---|
| 日志查看 | docker logs -f --tail 100 web |
实时查看最后 100 行日志 |
| 性能监控 | docker stats |
实时监控 CPU、内存、网络 IO |
| 元数据 | docker inspect web |
查看容器 IP、挂载卷等原始 JSON 信息 |
| 进程查看 | docker top web |
查看容器内运行的具体进程 |
| 文件传输 | docker cp ./a.txt web:/app/ |
宿主机与容器间文件互传 |
4. 镜像发布与版本管理 (Distribution)
| 命令 | 示例 | 核心用途 |
|---|---|---|
| 打标签 | docker tag app:v1 registry.com/my-repo/app:v1 |
必经之路:关联远程仓库地址 |
| 仓库登录 | docker login registry.com |
验证私有仓库权限 |
| 镜像推送 | docker push registry.com/my-repo/app:v1 |
上传镜像至云端 |
5. 系统清理 --- 磁盘空间回收
- 清理停止的容器 :
docker container prune - 清理无用的镜像 :
docker image prune -a - 一键全系统清理 :
docker system prune -a --volumes(慎用,会清理数据卷)
二、 Dockerfile 常用指令深剖
| 指令 | 作用 | 生产级建议 |
|---|---|---|
| FROM | 指定基础镜像 | 建议使用 node:18-alpine,体积比普通版小 80% |
| WORKDIR | 设置工作目录 | 相当于容器内的 cd,不存在会自动创建 |
| COPY | 拷贝本地文件 | 优先拷贝依赖定义文件(如 package.json)以利用缓存 |
| RUN | 执行构建命令 | 多个命令用 && 连接,减少镜像层数(Layer) |
| ENV | 设置环境变量 | 运行时有效:程序可通过环境变量动态调整行为 |
| EXPOSE | 声明端口 | 仅做文档说明,告知该应用预计监听的端口 |
| VOLUME | 定义匿名卷 | 标记数据持久化目录,防止容器删除后数据丢失 |
三、 Docker 难点辨析:CMD vs ENTRYPOINT
这是面试中最常被问到的区别:
-
CMD :容器启动时的默认命令。它会被
docker run后的参数完全替换。 -
ENTRYPOINT :容器启动的入口。它不容易被覆盖,其后的内容会被当作参数传递给入口程序。
-
黄金实践 :
ENTRYPOINT ["node"]+CMD ["server.js"]。- 直接运行:执行
node server.js - 传入参数运行:
docker run app app.js会执行node app.js(保持了环境固定,灵活切换文件)。
- 直接运行:执行
四、 生产实战:Next.js 项目极致优化部署
使用多阶段构建 (Multi-stage builds) 实现镜像瘦身。
Dockerfile
vbnet
# 阶段 1: 安装依赖
FROM node:18-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
# 阶段 2: 编译构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# 阶段 3: 最终运行 (Runner)
FROM node:18-alpine AS runner
WORKDIR /app
ENV NODE_ENV production
ENV PORT 3000
# 仅拷贝运行必需的 standalone 产物,不拷贝源码
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
EXPOSE 3000
CMD ["node", "server.js"]
五、 避坑点与小贴士 (Tips)
-
必须要有的 .dockerignore:
在根目录创建该文件,排除 node_modules、.git、.next。如果不写,你的构建上下文会非常巨大,导致构建极慢。
-
端口映射的逻辑:
-p 8080:3000 意味着 宿主机(8080) : 容器内(3000)。
-
不要在镜像里存数据:
容器是易失的。数据库文件、用户上传的图片务必通过 -v 挂载到宿主机或使用云存储。
-
最小权限原则:
如果可能,尽量在 Dockerfile 中使用 USER node 切换非 root 用户运行,增加安全性。
-
时区问题:
默认镜像是 UTC 时间,通过 ENV TZ=Asia/Shanghai 修正。
六、 最常用的一套开发流程
- 本地开发 :通过
docker-compose搭建本地环境。 - 编写构建 :编写
Dockerfile,执行docker build -t app:v1 .。 - 打标分发 :
docker tag app:v1 registry.com/app:v1->docker push。 - 线上部署 :在服务器执行
docker pull->docker run。 - 日常监控 :
docker stats观察性能,docker logs查看异常。
如果你觉得这份全攻略对你有帮助,欢迎点赞、收藏并在评论区交流你的 Docker 使用心得!