Skip to content

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

执行流程

  1. 启动 ubuntu:22.04 容器
  2. 分配交互式终端
  3. 执行 /bin/bash,进入 shell
  4. 可执行 ls, ps, cat 等命令
  5. 输入 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 文件实时更新
  • 开发服务器(如 nodemonvite)检测到变化,自动重启

优势

  • 无需重新构建镜像即可看到代码变更
  • 提升 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(开发环境可用):
      bash
      docker 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 实践的基石,也是现代全栈开发者必须熟练运用的工具。