- Docker run 命令详解:这些常用选项,用熟了效率翻倍
- -d:后台运行容器,不占用命令行
- -it:交互模式运行,直接进入容器终端
- -p / -P:端口映射,让外部能访问容器
- -p:指定端口映射(推荐常用)
- -P:随机端口映射(临时测试用)
- -e / --env-file:设置环境变量,初始化容器配置
- -e:直接设置单个环境变量
- --env-file:从文件读取多个环境变量
- -v:数据卷挂载,避免数据丢失
- --name:给容器起个好记的名字
- -h:指定容器的主机名
- -m:限制容器使用的最大内存
- --cpuset:绑定容器到指定 CPU 核心
- --dns:指定容器的 DNS 服务器
- --expose:开放容器内部端口(仅声明)
- --link:链接到另一个容器(容器间通信)
- --net:指定容器的网络类型
- bridge:默认网络(容器间通过桥接通信)
- host:使用主机网络(容器共享主机的网络栈)
- none:无网络(容器不配置网络)
- container::共享另一个容器的网络
- -a:指定标准输入输出类型
- 常用选项组合示例
- 1. 完整的 MySQL 启动命令(生产常用)
- 2. 临时测试 Redis 容器
Docker run 命令详解:这些常用选项,用熟了效率翻倍
接触 Docker 有段时间了,docker run命令简直是日常高频操作。刚开始对着一堆选项犯怵,不知道-d和-it有啥区别,-p和-P该怎么用。后来慢慢在实际场景中摸索,把每个常用选项都试了个遍,才发现其实每个选项都有明确的用途,组合起来用也没那么复杂。今天就把我整理的docker run核心选项分享出来,每个选项都带实际能用的例子,新手也能跟着上手。
先明确下docker run的基础语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]。核心就是中间的OPTIONS,不同选项组合能实现不同的容器运行效果,下面逐个说说那些实用的选项。
-d:后台运行容器,不占用命令行
这是我最常用的选项之一。刚学 Docker 时,不知道加-d,启动容器后命令行直接卡住,关掉窗口容器也跟着停了。加了-d之后,容器会在后台默默运行,还会返回一个唯一的容器 ID,后续管理容器(比如停止、重启)都能用这个 ID 或者容器名操作。
# 后台启动 MySQL 容器,不占用命令行dockerrun -d --name mysql-backend mysql:5.7启动后用docker ps就能看到运行中的容器,命令行还能继续做其他操作,特别方便。
-it:交互模式运行,直接进入容器终端
有时候需要进入容器内部操作,比如查看文件、执行命令,这时候就需要-i和-t组合使用。-i是交互模式,-t会分配一个伪终端,两者搭配就能直接进入容器的命令行界面。
# 交互模式启动 Ubuntu 容器,直接进入终端dockerrun -it --name ubuntu-test ubuntu:latest /bin/bash执行完命令后,会直接进入 Ubuntu 容器的终端,能像在本地机器上一样执行ls、pwd、apt-get install等命令。退出容器用exit即可,不过要注意,这种方式启动的容器,退出后会自动停止,如果想让容器继续后台运行,可以加-d后台启动,之后用docker exec -it 容器名 /bin/bash重新进入。
-p / -P:端口映射,让外部能访问容器
容器里的应用默认是“隔离”的,外部无法直接访问,必须通过端口映射才能打通。-p是指定端口映射,-P是随机端口映射,两者用法不同,场景也不一样。
-p:指定端口映射(推荐常用)
格式是主机端口:容器端口,比如把容器的 3306 端口(MySQL 默认端口)映射到主机的 3307 端口,这样外部就能通过localhost:3307访问容器里的 MySQL 服务。
# 指定端口映射,主机 3307 对应容器 3306dockerrun -d -p3307:3306 --name mysql-port mysql:5.7-P:随机端口映射(临时测试用)
不想手动指定端口的话,用-P会让 Docker 随机分配一个主机端口,适合临时测试容器是否能正常运行。
# 随机端口映射,后台启动 MySQLdockerrun -d -P --name mysql-random-port mysql:5.7启动后用docker ps查看,会发现PORTS列显示类似0.0.0.0:32768->3306/tcp,32768 就是随机分配的主机端口。
-e / --env-file:设置环境变量,初始化容器配置
很多镜像启动时需要配置初始化参数,比如 MySQL 的 root 密码、Redis 的密码,这时候用-e就能直接设置环境变量,不用进入容器后再配置。
-e:直接设置单个环境变量
# 启动 MySQL 并设置 root 密码为 root123dockerrun -d -p3307:3306 --name mysql-env\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7这里的\是换行符,让命令更清晰,避免一行写太长。不同镜像的环境变量不同,比如 Redis 可以用-e REDIS_PASSWORD=123456设置密码,具体要看镜像的官方说明。
–env-file:从文件读取多个环境变量
如果需要设置多个环境变量,逐个写-e太麻烦,可以把环境变量写在一个文件里,用--env-file读取。
先创建一个env.list文件,内容如下:
MYSQL_ROOT_PASSWORD=root123 MYSQL_DATABASE=test_db MYSQL_USER=test_user MYSQL_PASSWORD=test_pwd然后启动容器时指定这个文件:
# 从 env.list 文件读取环境变量启动 MySQLdockerrun -d -p3307:3306 --name mysql-env-file\--env-file env.list\mysql:5.7启动后会自动创建test_db数据库和test_user用户,不用手动操作,特别适合多环境变量的场景。
-v:数据卷挂载,避免数据丢失
容器的默认存储是临时的,一旦容器被删除,里面的数据也会跟着消失。-v选项能把容器里的目录挂载到主机的目录,数据会直接存在主机上,就算容器删了,数据也能保留。
# 挂载 MySQL 数据目录和配置目录到主机dockerrun -d -p3307:3306 --name mysql-volume\-eMYSQL_ROOT_PASSWORD=root123\-v /mydata/mysql/data:/var/lib/mysql\# 挂载数据目录-v /mydata/mysql/conf:/etc/mysql/conf.d\# 挂载配置目录mysql:5.7这样一来,MySQL 的数据会存在主机的/mydata/mysql/data目录,配置文件存在/mydata/mysql/conf目录。后续修改配置时,直接在主机上编辑文件就行,不用进入容器;就算不小心删了容器,重新启动时再挂载同一个目录,数据就能恢复。
–name:给容器起个好记的名字
默认情况下,Docker 会给容器随机分配一个奇怪的名字,比如quirky_jones,后续管理起来很不方便。--name能给容器指定一个自定义名字,比如mysql-5.7、redis-dev,后续用docker stop、docker restart时,直接用名字操作就行,不用记长长的容器 ID。
# 给容器起名为 mysql-5.7,方便后续管理dockerrun -d -p3307:3306 --name mysql-5.7\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7-h:指定容器的主机名
容器内部的主机名默认是容器 ID 的前几位,用-h可以自定义容器的主机名,在容器内部执行hostname命令就能看到设置的名字。
# 指定容器主机名为 mysql-hostdockerrun -d -p3307:3306 --name mysql-host\-h mysql-host\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7进入容器后执行hostname,会输出mysql-host,适合需要根据主机名识别容器的场景。
-m:限制容器使用的最大内存
为了避免某个容器占用过多主机内存,影响其他应用运行,可以用-m限制容器的最大内存。格式是内存大小,支持b(字节)、k(千字节)、m(兆字节)、g(吉字节)。
# 限制容器最大内存为 1Gdockerrun -d -p3307:3306 --name mysql-memory\-m 1g\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7这样容器最多只能使用 1G 内存,超过后会被限制,避免占用过多资源。
–cpuset:绑定容器到指定 CPU 核心
如果主机有多个 CPU 核心,可以用--cpuset把容器绑定到指定核心上运行,避免 CPU 资源争抢,提升容器性能。
# 绑定容器到 CPU 核心 0 和 1(核心编号从 0 开始)dockerrun -d -p3307:3306 --name mysql-cpuset\--cpuset0,1\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7适合对 CPU 性能要求较高的容器,比如数据库、计算密集型应用。
–dns:指定容器的 DNS 服务器
容器默认使用主机的 DNS 服务器,如果需要自定义 DNS,可以用--dns指定。
# 指定容器 DNS 为 8.8.8.8(谷歌 DNS)和 114.114.114.114(国内 DNS)dockerrun -d -p3307:3306 --name mysql-dns\--dns8.8.8.8\--dns114.114.114.114\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7适合需要访问特定网络环境的场景,比如跨网段访问。
–expose:开放容器内部端口(仅声明)
--expose用来声明容器开放的端口,但不会做端口映射,只是告诉 Docker 这个容器会使用这些端口,通常用于容器间通信,或者让外部知道容器的端口用途。
# 声明容器开放 3306 端口(仅声明,不映射)dockerrun -d --name mysql-expose\--expose3306\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7注意:--expose只是声明,外部还是无法直接访问,需要配合-p或容器网络才能访问。
–link:链接到另一个容器(容器间通信)
如果两个容器需要通信,比如 Web 容器需要连接 MySQL 容器,可以用--link建立链接,让 Web 容器能直接通过容器名访问 MySQL 容器,不用知道 MySQL 容器的 IP。
# 先启动 MySQL 容器dockerrun -d --name mysql-link\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7# 启动 Web 容器,链接到 MySQL 容器dockerrun -d --name web-link\--link mysql-link:mysql\# 格式:目标容器名:别名nginx:latest这样 Web 容器内部就能通过mysql这个别名访问 MySQL 容器,比如连接 MySQL 时,主机名填mysql就行,不用手动查 MySQL 容器的 IP。
–net:指定容器的网络类型
Docker 支持多种网络类型,用--net可以指定容器使用的网络,常用的有bridge(默认)、host、none、container:四种。
bridge:默认网络(容器间通过桥接通信)
# 使用默认 bridge 网络(可不写 --net bridge)dockerrun -d -p3307:3306 --name mysql-bridge\-eMYSQL_ROOT_PASSWORD=root123\--net bridge\mysql:5.7host:使用主机网络(容器共享主机的网络栈)
容器会直接使用主机的 IP 和端口,不用做端口映射,容器的端口就是主机的端口。
# 使用 host 网络,容器 3306 端口直接对应主机 3306 端口dockerrun -d --name mysql-host-net\-eMYSQL_ROOT_PASSWORD=root123\--nethost\mysql:5.7启动后直接用localhost:3306就能访问 MySQL,不用加-p映射。
none:无网络(容器不配置网络)
# 无网络配置,容器无法访问外部,外部也无法访问容器dockerrun -d --name mysql-none-net\-eMYSQL_ROOT_PASSWORD=root123\--net none\mysql:5.7适合不需要网络的离线容器场景。
container::共享另一个容器的网络
容器会共享指定容器的网络栈,和被共享的容器在同一个网络环境中。
# 共享 mysql-link 容器的网络dockerrun -d --name mysql-share-net\-eMYSQL_ROOT_PASSWORD=root123\--net container:mysql-link\mysql:5.7-a:指定标准输入输出类型
-a用来指定容器的标准输入(STDIN)、标准输出(STDOUT)、标准错误(STDERR)的内容类型,通常和-i配合使用,一般场景下用得不多。
# 指定标准输出和标准错误,交互模式启动容器dockerrun -a STDOUT -a STDERR -i --name mysql-std\-eMYSQL_ROOT_PASSWORD=root123\mysql:5.7常用选项组合示例
实际使用中,很少单独用一个选项,大多是组合使用,这里分享几个我平时常用的组合命令:
1. 完整的 MySQL 启动命令(生产常用)
dockerrun -d -p3307:3306 --name mysql-prod\-eMYSQL_ROOT_PASSWORD=root123\-eMYSQL_DATABASE=test_db\-v /mydata/mysql/data:/var/lib/mysql\-v /mydata/mysql/conf:/etc/mysql/conf.d\-m 2g\--cpuset0,1\--net bridge\mysql:5.7这个命令组合了后台运行、端口映射、环境变量、数据挂载、内存限制、CPU 绑定,基本能满足生产环境的需求。
2. 临时测试 Redis 容器
dockerrun -it -p6379:6379 --name redis-test\-eREDIS_PASSWORD=123456\--rm\# 容器退出后自动删除redis:latest redis-server --requirepass123456--rm选项是退出后自动删除容器,适合临时测试,不用手动清理。
其实docker run的选项虽然多,但不用一次性全部记住。先把-d、--name、-p、-e、-v、-it这几个常用的用熟,能应对大部分日常场景。遇到特殊需求时,再去查对应的选项就行,用得多了自然就记住了。Docker 的核心是“简单易用”,没必要一开始就死记硬背,跟着例子敲几遍,慢慢就上手了。