Docker run 命令(实战总结)

Docker run 命令:从零开始掌握容器化部署的核心指令

在现代软件开发中,Docker 已经成为不可或缺的工具。它让开发者能够“一次构建,随处运行”,而这一切的核心,正是 docker run 命令。无论你是初学者还是已有经验的开发者,理解这个命令,就等于掌握了进入容器世界的钥匙。

想象一下,你有一个打包好的应用程序,就像一个装满工具的工具箱。docker run 就是打开这个箱子、把工具拿出来用的那把钥匙。它不只启动一个容器,更是一整套配置、运行、管理的入口。


什么是 Docker run 命令?

docker run 是 Docker 官方提供的最核心命令之一,用于根据指定的镜像创建并启动一个容器。它几乎涵盖了容器运行的所有配置选项。

简单来说,docker run 的作用是:

  • 检查本地是否有指定的镜像
  • 如果没有,自动从远程仓库(如 Docker Hub)下载
  • 基于该镜像创建一个可运行的容器实例
  • 启动容器并运行指定的命令
  • 保持容器运行,直到你手动停止或命令执行完毕

这个命令就像是一个“容器制造机”,你输入参数,它就帮你把应用“组装”好并运行起来。


基础语法与关键参数解析

docker run 的基本语法如下:

docker run [选项] [镜像名] [命令]

我们来拆解几个核心参数,每个都至关重要:

-d 参数:后台运行容器

当你希望容器在后台运行,不占用当前终端,就要使用 -d(detach)参数。

docker run -d nginx

注释:此命令会从 Docker Hub 下载 nginx 镜像(如果本地没有),创建一个容器,并在后台运行。你不会看到容器输出,但容器仍在运行。

-p 参数:端口映射

容器内部的服务默认无法被外部访问。使用 -p 可以将主机端口映射到容器端口。

docker run -d -p 8080:80 nginx

注释:将主机的 8080 端口映射到容器的 80 端口。访问 http://localhost:8080 就能看到 nginx 的欢迎页面。

-v 参数:挂载数据卷

容器重启后,内部数据会丢失。使用 -v 可以把主机目录挂载到容器中,实现数据持久化。

docker run -d -p 8080:80 -v /home/user/nginx:/usr/share/nginx/html nginx

注释:将主机的 /home/user/nginx 目录挂载到容器的 /usr/share/nginx/html 路径。你修改主机文件,容器内的网页内容也会实时更新。


常见使用场景与实战案例

启动一个简单的 Web 服务

假设你想快速搭建一个静态网页服务器,可以用 Nginx。

docker run -d -p 8080:80 \
  -v $(pwd)/html:/usr/share/nginx/html \
  --name my-nginx \
  nginx

注释:

  • -d:后台运行
  • -p 8080:80:映射端口
  • -v $(pwd)/html:/usr/share/nginx/html:挂载当前目录下的 html 文件夹
  • --name my-nginx:为容器命名,便于后续管理
  • nginx:镜像名称

现在,你可以在 html 文件夹中放入 index.html,访问 http://localhost:8080 即可看到内容。


运行一个 Python 脚本

Docker 不仅能运行 Web 服务,还能运行脚本。比如你有一个 hello.py 文件:

print("Hello from Docker!")

你可以用以下命令运行它:

docker run -i -t --rm python:3.9-slim \
  python hello.py

注释:

  • -i:保持标准输入打开(交互式)
  • -t:分配一个伪终端
  • --rm:容器退出后自动删除(适合一次性任务)
  • python:3.9-slim:使用 Python 3.9 的轻量镜像
  • python hello.py:在容器中运行脚本

运行后,你会看到输出 Hello from Docker!,然后容器自动退出。


启动一个数据库容器(MySQL)

数据库是很多应用的依赖。Docker 让你快速部署数据库,无需安装。

docker run -d \
  --name mysql-dev \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -p 3306:3306 \
  -v /data/mysql:/var/lib/mysql \
  mysql:8.0

注释:

  • --name mysql-dev:给容器起个名字
  • -e MYSQL_ROOT_PASSWORD=123456:设置环境变量,初始化 root 密码
  • -p 3306:3306:映射数据库端口
  • -v /data/mysql:/var/lib/mysql:持久化存储数据库文件
  • mysql:8.0:使用 MySQL 8.0 镜像

启动后,你可以用 MySQL 客户端连接 localhost:3306,使用 root 用户和密码 123456 登录。


容器管理与常见问题处理

查看正在运行的容器

docker ps

注释:列出当前正在运行的容器。如果想查看所有容器(包括已停止的),使用 docker ps -a

查看容器日志

docker logs my-nginx

注释:查看名为 my-nginx 的容器输出日志,帮助排查问题。

停止与删除容器

docker stop my-nginx
docker rm my-nginx

注释:

  • docker stop:优雅停止容器
  • docker rm:删除容器(注意:容器必须已停止)

重新运行容器

如果容器被删除,可以再次运行 docker run。但建议用 --name 命名容器,避免重复命名冲突。


高级技巧:自定义启动行为

设置工作目录

docker run -it \
  --workdir /app \
  -v $(pwd):/app \
  ubuntu:20.04 \
  bash

注释:

  • --workdir /app:进入容器后默认工作路径为 /app
  • -v $(pwd):/app:挂载当前目录
  • ubuntu:20.04:使用 Ubuntu 镜像
  • bash:启动 bash shell

这样你就可以在容器中直接操作项目文件。

限制资源使用

docker run -d \
  --memory="512m" \
  --cpus="1.5" \
  nginx

注释:

  • --memory="512m":限制容器最多使用 512MB 内存
  • --cpus="1.5":限制最多使用 1.5 个 CPU 核心

这在资源受限的服务器上非常实用,防止某个容器占满资源。


常见误区与最佳实践

误区 正确做法
忘记用 -d 后台运行,终端被占用 -d 参数
没有挂载数据卷,数据丢失 -v 挂载持久化目录
重复使用相同容器名 --name 命名,避免冲突
不清理停止的容器 定期运行 docker system prune 清理

总结:掌握 Docker run 命令,就是掌握容器化的核心

docker run 命令看似简单,实则功能强大。它是你进入 Docker 世界的第一步,也是你日常开发、部署、调试的主力工具。

通过本文,你已经学会了:

  • 基础语法与常见参数(-d, -p, -v, --name
  • 实际案例:运行 Web 服务、脚本、数据库
  • 容器管理:查看、日志、停止、删除
  • 高级技巧:工作目录、资源限制
  • 避坑指南与最佳实践

记住:docker run 不只是一个命令,它是一套完整的应用运行环境配置方式。熟练掌握它,你就能在任何环境中快速部署应用,真正实现“环境一致性”。

从今天开始,把 docker run 写进你的开发流程吧。当你能熟练使用它时,你会发现,原来开发效率可以提升这么多。