docker run 是什么
docker run 是启动容器的主命令,把「创建容器」与「启动主进程」合并成一次调用:Docker 先按镜像生成可写层与容器元数据,再执行镜像里的 ENTRYPOINT/CMD,或执行命令行里指定的命令。它等价于 docker create 加 docker start,起临时容器、跑一次性任务、部署单容器服务都用它。
基本信息
| 语法 | docker run [选项] IMAGE [COMMAND] [ARG...] |
|---|---|
| 等价写法 | docker container run(命令分组新语法,行为一致) |
| 参数位置 | 选项写在镜像名前,命令与参数写在镜像名之后 |
| 适用平台 | Linux / macOS / Windows 上的 Docker Engine 与 Docker Desktop |
典型使用场景
- 跑一次性任务:加 --rm 执行完自动清理,不在机器上留下停止的容器
- 本地起依赖服务:数据库、缓存、消息队列用官方镜像直接拉起,避免在宿主机装环境
- 部署单容器应用:规模不大时用 run 起服务,再配合重启策略做进程守护
- 验证镜像行为:换 entrypoint 或换命令,看镜像里到底有什么、启动逻辑是否符合预期
- 流水线里跑构建容器:把代码挂载进容器,用统一版本的工具链编译,避免污染构建机
常用示例
常用示例
docker run -d --name web -p 8080:80 nginx:1.27-alpine # 后台起一个 web 服务
docker run --rm -it alpine:3.20 sh # 交互式试跑,退出即删
docker run --rm -v $PWD:/work -w /work golang:1.23 go build # 挂载代码后编译
docker run -d --restart unless-stopped --name api app/api:v1.2 # 崩溃自动拉起
docker run --entrypoint cat alpine:3.20 /etc/os-release # 换命令查看镜像内容高频选项速查
| 选项 | 作用 | 注意 |
|---|---|---|
| -d | 后台运行并打印容器 ID | 主进程退出容器就停止,它不是守护进程 |
| -it | 分配伪终端并保持标准输入 | 脚本与流水线里不要用 -t,会报没有终端 |
| --name | 指定容器名 | 全局唯一,含已停止容器也不能重名 |
| --rm | 退出后自动删除容器 | 与重启策略同时使用会报冲突 |
| -p | 把容器端口映射到宿主机 | 宿主端口被占用会直接启动失败 |
| -v | 挂载数据卷或宿主目录 | 源路径不存在时会被自动创建成目录 |
| -e | 注入环境变量 | 敏感值会出现在 inspect 与进程环境里 |
本地没有镜像时 run 会先尝试拉取,拉取失败才报错。容器名与宿主端口是全局资源,批量起服务前先规划命名与端口,避免起一半再改。
run 的配置在创建那一刻固化:端口、挂载、环境变量、网络都不能事后修改,只能删掉容器重建。Compose 与各种管理面板做的事,本质只是替你生成这些参数。
容器起不来时按顺序排查:docker ps -a 看状态是否已 Exited,docker logs 看主进程输出,docker inspect 看退出码与 OOMKilled 标记,再决定改参数还是改命令。
常见报错与原因
| 现象 | 原因 | 处理办法 |
|---|---|---|
| 端口已被占用 | 宿主端口被其他进程或容器监听 | 换宿主端口,或先找出占用进程再决定是否释放 |
| 容器名已被使用 | 同名容器还存在,含已停止的容器 | 先删掉旧容器,或换一个名字重新起 |
| 启动后立刻退出 | 主进程执行完就结束,或启动失败 | 看容器日志确认进程是否前台常驻 |
| 找不到镜像 | 名称拼写错误或尚未拉取 | 先手动拉取一次,确认镜像与标签存在 |
| 挂载目录没有权限 | 容器内用户与宿主目录属主不匹配 | 对齐用户编号,或放开挂载目录权限 |
容器存活的前提
- 启动命令必须是前台常驻进程,像把服务注册成系统服务再退出的写法会让容器刚起就停
- 配置挂载进容器前先确认宿主路径存在且内容正确,否则应用读到的是默认配置或空目录
- 依赖其他服务的容器要处理启动顺序,靠重启策略兜底只是权宜之计
- 需要持久化的目录一定要挂出来,否则容器重建后数据随可写层一起消失