docker run 核心参数详解:从开发到部署的实用指南
docker run 是 Docker 最核心的命令,用于从镜像创建并启动一个容器。掌握其关键参数,不仅能提升开发效率,还能确保生产环境的安全与稳定。以下是开发者在日常工作中必须掌握的核心参数及其最佳实践。
一、-d:后台运行(Detached Mode)
作用:让容器在后台运行,不占用当前终端。
适用场景:
- 生产服务(如 NestJS API、数据库)
- 长期运行的后台任务
- CI/CD 中的临时服务
示例:
bash
docker run -d --name my-app node:18 npm start优势:
- 不阻塞终端,可继续执行其他命令。
- 适合自动化脚本和编排系统(如 Kubernetes、Docker Compose)。
二、-it:交互式终端(Interactive + TTY)
作用:
-i:保持标准输入(stdin)开放,允许与容器交互。-t:分配一个伪终端(TTY),提供类似本地 shell 的体验。
适用场景:
- 调试容器内部环境
- 临时进入容器排查问题
- 学习或测试新镜像
示例:
bash
docker run -it ubuntu:22.04 /bin/bash执行流程:
- 启动
ubuntu:22.04容器 - 分配交互式终端
- 执行
/bin/bash,进入 shell - 可执行
ls,ps,cat等命令 - 输入
exit退出并停止容器
提示:若镜像无 bash(如 Alpine),可使用 /bin/sh:
bash
docker run -it alpine:latest /bin/sh三、-p:端口映射(Publish Port)
作用:将主机端口映射到容器端口,实现外部访问。
语法:
bash
-p <主机端口>:<容器端口>示例:
bash
docker run -d -p 3000:3000 my-nestjs-app含义:
- 主机的
3000端口 → 容器的3000端口 - 外部可通过
http://localhost:3000访问应用
高级用法:
- 映射多个端口:bash
-p 3000:3000 -p 9229:9229 # 应用 + 调试端口 - 指定 IP 绑定:bash
-p 127.0.0.1:3000:3000 # 仅允许本地访问
生产建议:
- 避免将容器 80 端口直接映射到主机 80(需 root 权限),建议使用 3000、8080 等高位端口。
- 结合 Nginx 或负载均衡器处理 80/443 转发。
四、-v:卷挂载(Volume Mount)
作用:将主机目录或文件挂载到容器内,实现数据持久化或开发热更新。
语法:
bash
-v <主机路径>:<容器路径>示例:开发环境热更新
bash
docker run -it -p 3000:3000 -v $(pwd):/app node:18 npm run dev工作原理:
- 主机当前目录(
$(pwd))挂载到容器/app - 你在主机修改代码 → 容器内
/app文件实时更新 - 开发服务器(如
nodemon、vite)检测到变化,自动重启
优势:
- 无需重新构建镜像即可看到代码变更
- 提升 TypeScript/Nest/Bun 项目的开发效率
其他用法:
- 挂载配置文件:bash
-v ./config/prod.yaml:/app/config.yaml - 持久化数据库数据:bash
-v db-data:/var/lib/postgresql/data
注意:$(pwd) 在 Windows PowerShell 中为 ${PWD},或使用绝对路径。
五、-e:环境变量注入(Environment Variables)
作用:向容器注入环境变量,控制应用行为。
语法:
bash
-e <KEY>=<VALUE>示例:
bash
docker run -d \
-e NODE_ENV=production \
-e DATABASE_URL=postgresql://db:5432/app \
-e JWT_SECRET=your-super-secret-key \
my-nestjs-app典型用途:
- 区分环境:
NODE_ENV=development/production - 配置数据库连接、API 密钥、第三方服务凭证
- 控制日志级别:
LOG_LEVEL=debug
安全建议:
- 禁止在命令行硬编码敏感信息(如
-e JWT_SECRET=abc123),避免被ps命令泄露。 - 生产环境应使用:
- Docker Secrets(Swarm)
- Kubernetes Secrets
.env文件 +--env-file(开发环境可用):bashdocker run --env-file .env my-app
六、--network:自定义网络(Custom Network)
作用:将容器连接到指定网络,实现服务间通信。
背景:
- 默认情况下,每个容器运行在独立的网络命名空间。
- 多个容器(如 Web 服务 + 数据库)需在同一网络中才能通过服务名通信。
创建自定义网络:
bash
docker network create app-network启动容器并加入网络:
bash
# 启动数据库
docker run -d --name postgres --network app-network postgres:15
# 启动应用,通过 postgres 访问数据库
docker run -d --name api --network app-network -p 3000:3000 my-nestjs-app应用配置:
plaintext
DATABASE_HOST=postgres # 容器名即 DNS 名
DATABASE_PORT=5432优势:
- 服务间通过名称通信,无需记住 IP
- 网络隔离,不同应用组可使用不同网络
- 支持自定义 DNS、驱动、网关等高级配置
七、综合示例:一个完整的开发命令
bash
docker run -it \
--name nest-dev \
-p 3000:3000 \
-p 9229:9229 \
-v $(pwd):/app \
-e NODE_ENV=development \
--network app-network \
node:18 \
sh -c "npm install && npm run dev"解释:
-it:交互式终端,便于查看日志-p:映射应用和调试端口-v:挂载源码,支持热更新-e:设置开发环境变量--network:加入自定义网络,可连接数据库等服务sh -c:组合命令,先安装依赖再启动开发服务器
八、总结:核心参数速查表
| 参数 | 用途 | 典型场景 |
|---|---|---|
-d | 后台运行 | 生产服务 |
-it | 交互式终端 | 调试、测试 |
-p | 端口映射 | 暴露服务 |
-v | 卷挂载 | 热更新、持久化 |
-e | 环境变量 | 配置应用 |
--network | 自定义网络 | 服务间通信 |
掌握这些 docker run 核心参数,你就能灵活应对从本地开发到生产部署的各种场景。它们是 DevOps 实践的基石,也是现代全栈开发者必须熟练运用的工具。