基本语法
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
[OPTIONS]:运行容器时使用的参数,非常丰富,可以控制容器的方方面面。IMAGE[:TAG|@DIGEST]:必须指定的参数,表示要运行的镜像,可以是镜像名(如nginx),也可以是镜像名加标签(如nginx:latest),或者是镜像的摘要(@sha256:...)。[COMMAND]:可选参数,在容器启动后要执行的命令,如果镜像中已经定义了默认的启动命令(CMD或ENTRYPOINT),这里的命令会覆盖它。[ARG...]:可选参数,传递给[COMMAND]的参数。
核心参数分类详解
下面我将参数按照功能进行分类,并解释每个参数的作用、常用场景和示例。

(图片来源网络,侵删)
容器名称和标识
-
--name string- 作用:为容器指定一个自定义名称,如果不指定,Docker 会自动生成一个随机名称(如
angry_babbage)。 - 场景:当你需要通过名称来管理容器(如
docker stop my_container)时,这个参数非常有用。 - 示例:
docker run --name my_web_server -d nginx
- 作用:为容器指定一个自定义名称,如果不指定,Docker 会自动生成一个随机名称(如
-
-i, --interactive- 作用:以交互模式运行容器,通常与
-t一起使用。 - 场景:当你需要进入容器的 Shell 进行交互时。
- 示例:
docker run -it ubuntu /bin/bash
- 作用:以交互模式运行容器,通常与
-
-t, --tty- 作用:为容器分配一个伪终端(pseudo-terminal)。
- 场景:与
-i配合使用,让你获得一个可交互的 Shell 环境。 - 示例:
docker run -it ubuntu /bin/bash
后台运行和资源控制
-
-d, --detach
(图片来源网络,侵删)- 作用:在后台运行容器,并打印出容器 ID。
- 场景:这是运行 Web 服务、数据库等需要长期运行的应用的标准方式。
- 示例:
docker run -d --name my_nginx nginx
-
--rm- 作用:容器停止后自动删除,这个参数不能与
-d同时使用。 - 场景:适用于运行一次性任务、测试或调试,避免留下无用的容器。
- 示例:
docker run --rm ubuntu echo "Hello, Docker!" # 容器执行完毕后,会立即被删除
- 作用:容器停止后自动删除,这个参数不能与
-
-m, --memory bytes- 作用:限制容器可以使用的最大内存。
- 场景:防止某个容器占用过多系统内存,影响其他应用或系统稳定性。
- 示例:
docker run -m 512m my_memory_hungry_app
-
--cpus string- 作用:限制容器可以使用的 CPU 核心数。
- 场景:进行资源隔离和性能调优。
- 示例:
# 限制最多使用 0.5 个 CPU 核心 docker run --cpus="0.5" my_cpu_intensive_app # 限制最多使用 2 个 CPU 核心 docker run --cpus="2" my_cpu_intensive_app
端口映射
这是将容器内部服务暴露给外部世界的关键。

(图片来源网络,侵删)
-
-P, --publish-all- 作用:将容器所有暴露的端口(
EXPOSE指令声明的端口)随机映射到宿主机的高位端口(1024以上)。 - 场景:快速启动一个容器,不关心具体映射的端口。
- 示例:
# nginx 镜像暴露了 80 端口,Docker 会随机映射一个宿主机端口到 80 docker run -d -P nginx # 查看映射关系 docker port my_nginx
- 作用:将容器所有暴露的端口(
-
-p, --publish list-
作用:将容器的端口映射到宿主机的指定端口,这是最常用、最灵活的方式。
-
语法:
[宿主机IP:]宿主机端口:容器端口 -
场景:需要精确控制服务访问端口时。
-
示例:
# 1. 映射宿主机 8080 端口到容器 80 端口 docker run -d -p 8080:80 nginx # 2. 映射宿主机所有 IP 的 80 端口到容器 80 端口 docker run -d -p 80:80 nginx # 3. 映射宿主机特定 IP (192.168.1.100) 的 80 端口到容器 80 端口 docker run -d -p 192.168.1.100:80:80 nginx # 4. 映射宿主机随机高位端口到容器 80 端口(类似 -P,但可以指定容器端口) docker run -d -p 80 nginx
-
数据卷管理
这是实现数据持久化的关键。
-
-v, --volume list-
作用:挂载一个数据卷到容器中,数据卷可以是宿主机目录、命名卷或匿名卷。
-
语法:
[宿主机路径:]容器内路径[:ro] -
场景:数据库数据、应用配置、用户上传文件等需要持久化的数据。
-
示例:
# 1. 挂载宿主机目录到容器(匿名卷) docker run -d -v /my/data:/app/data nginx # 宿主机的 /my/data 目录会被自动创建 # 2. 挂载宿主机目录到容器(命名卷) # 首先创建一个命名卷 docker volume create my_app_data # 然后挂载它 docker run -d -v my_app_data:/app/data nginx # 3. 挂载宿主机文件到容器 docker run -it -v ~/.bashrc:/root/.bash ubuntu /bin/bash # 4. 以只读模式挂载 docker run -d -v /my/config:/etc/nginx/conf.d:ro nginx
-
-
--mount-
作用:功能更强大、语法更清晰的挂载方式,是
-v的替代方案,推荐在新版本 Docker 中使用。 -
语法:
type=TYPE,source=SOURCE,destination=TARGET,OPTIONS -
场景:当需要更精细地控制挂载选项时。
-
示例:
# 等同于 -v /my/data:/app/data docker run -d --mount type=bind,source=/my/data,target=/app/data nginx # 等同于 -v my_app_data:/app/data docker run -d --mount type=volume,source=my_app_data,target=/app/data nginx
-
网络配置
-
--network string-
作用:将容器连接到指定的网络。
-
场景:容器间需要通信,或需要自定义网络策略时。
-
示例:
# 1. 使用默认的 bridge 网络 docker run -d --name web1 --network bridge nginx # 2. 创建一个自定义网络并连接容器 docker network create my_app_net docker run -d --name web_server --network my_app_net nginx docker run -d --name db_server --network my_app_net postgres # web_server 和 db_server 现在可以通过名称互相通信
-
环境变量
-
-e, --env list- 作用:设置容器的环境变量。
- 场景:传递配置信息给应用程序,如数据库密码、API 密钥等。
- 示例:
docker run -e "MY_APP_ENV=production" -e "DB_PASSWORD=secret" my_app
-
--env-file list-
作用:从一个文件中读取环境变量。
-
场景:当需要传递大量环境变量时,使用文件更方便。
-
示例:
# 创建一个 .env 文件 # cat > .env <<EOF # MY_APP_ENV=production # DB_PASSWORD=secret # EOF # 运行容器时加载文件 docker run --env-file .env my_app
-
综合示例
假设我们要运行一个 MySQL 数据库容器,它需要:
- 在后台运行。
- 命名为
my_mysql。 - 设置
root用户密码为my-secret-pw。 - 将数据持久化到宿主机的
/var/lib/mysql目录。 - 将容器的
3306端口映射到宿主机的33060端口。
docker run -d \ --name my_mysql \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -v /var/lib/mysql:/var/lib/mysql \ -p 33060:3306 \ mysql:8.0
命令分解:
docker run:启动容器命令。-d:后台运行。--name my_mysql:容器命名为my_mysql。-e MYSQL_ROOT_PASSWORD=my-secret-pw:设置环境变量,用于设置数据库密码。-v /var/lib/mysql:/var/lib/mysql:挂载宿主机目录,实现数据持久化。-p 33060:3306:端口映射,外部可以通过33060访问容器内的3306。mysql:8.0:使用的镜像和标签。
获取帮助
如果你想查看所有可用的参数及其详细说明,可以使用 docker run --help 命令。
docker run --help
这将输出一份非常详尽的列表,是学习和查阅的最佳资料。
