docker run 高频场景实战手册
这份手册聚焦 5 个最常用的 docker run 场景,每个场景都包含“操作步骤+选项解析+验证方法+避坑要点”,你可以直接对照操作,遇到问题翻对应“避坑”部分即可解决。
场景 1:交互模式测试(临时用,用完就删)
适用场景:临时启动一个系统(如 Ubuntu、CentOS)或工具(如 Python、Node),执行几条命令测试(比如验证脚本在不同系统上是否能跑),不需要保留容器。
核心需求
- 能在容器里输入命令(交互);
- 有终端样式(方便操作);
- 测试完容器自动删除(不占空间)。
操作步骤(以 Ubuntu 为例)
-
启动交互容器
终端输入:docker run -it --rm ubuntu:22.04选项/字段 作用解析 -i保持输入流打开,让你能在容器里输入命令(比如 ls、cd)。-t分配伪终端,让容器里的命令行有“样式”(比如显示路径 root@容器ID:/#)。--rm容器停止后自动删除(退出终端后, docker ps -a看不到这个容器)。ubuntu:22.04指定用 Ubuntu 22.04 版本(不用 latest,避免版本意外更新)。 -
在容器内执行测试命令
进入容器后,终端会显示root@xxxx:/#(xxxx是容器 ID),可以执行命令:# 查看系统版本 cat /etc/os-release # 输出应包含 "VERSION="22.04.3 LTS (Jammy Jellyfish)"" # 安装一个小工具(比如 curl)测试 apt update && apt install -y curl curl --version # 验证 curl 安装成功 -
退出并清理
测试完输入exit,终端回到主机界面,容器自动删除。
验证方法
- 启动后能看到容器内终端(
root@xxxx:/#),且能输入命令; - 退出后执行
docker ps -a,看不到名为ubuntu:22.04的容器(因为--rm生效)。
避坑要点
-
坑:输入
docker run -it ubuntu后,执行apt install报错“无法定位包”。
解决:Ubuntu 镜像默认没更新软件源,先执行apt update再安装。 -
坑:退出容器后,想重新进入,却提示“容器不存在”。
原因:--rm会让容器退出后删除,所以临时测试别指望“二次进入”,如需多次操作,去掉--rm。
场景 2:后台启动服务(长期运行,如 Nginx/Redis)
适用场景:启动 Web 服务(Nginx)、缓存(Redis)等需要长期运行的应用,希望服务在后台跑,不占用终端,且方便管理(启停、看日志)。
核心需求
- 服务在后台运行(不卡终端);
- 能通过主机访问服务(端口映射);
- 给容器起个名字(方便后续操作)。
操作步骤(以 Nginx 为例)
-
启动后台 Nginx
终端输入:docker run -d -p 8080:80 --name my-nginx nginx:1.25选项/字段 作用解析 -d后台运行容器(执行后终端直接返回容器 ID,能继续输入其他命令)。 -p 8080:80端口映射:主机的 8080 端口 ↔ 容器的 80 端口(Nginx 默认用 80 端口)。 --name my-nginx给容器起名为 my-nginx(后续可用my-nginx代替容器 ID 操作,比如docker stop my-nginx)。nginx:1.25指定 Nginx 1.25 版本(稳定版,避免 latest带来的版本风险)。 -
管理服务(启停、日志)
# 查看容器是否在运行(状态应为 Up) docker ps # 停止服务(需要时) docker stop my-nginx # 重启服务(需要时) docker start my-nginx # 查看服务日志(比如谁访问了 Nginx) docker logs my-nginx # 实时看日志(加 -f 选项) docker logs -f my-nginx
验证方法
- 执行
docker ps能看到my-nginx容器,状态为Up,端口列显示0.0.0.0:8080->80/tcp; - 打开浏览器访问
localhost:8080,能看到 Nginx 欢迎页(“Welcome to nginx!”)。
避坑要点
-
坑:启动时报错“port is already allocated”(端口已被占用)。
解决:换一个主机端口,比如-p 8081:80;或用lsof -i :8080(Linux/Mac)查占用端口的程序,停止它。 -
坑:
docker ps看不到容器,执行docker logs my-nginx报错“no such container”。
原因:容器可能启动失败后退出了,用docker ps -a查看所有容器(包括已停止的),再用docker logs my-nginx看失败原因(比如端口被占用、配置错误)。
场景 3:数据持久化(如 MySQL/PostgreSQL,数据不丢)
适用场景:启动数据库(MySQL、PostgreSQL)、存储服务(MinIO)等“有状态应用”,需要确保容器删除后,数据依然保留(比如 MySQL 的表和数据)。
核心需求
- 数据存在容器外(主机或 Docker 数据卷);
- 容器删除/重建后,数据能复用;
- 能通过主机连接服务(如用 Navicat 连容器里的 MySQL)。
操作步骤(以 MySQL 8.0 为例)
-
启动带数据卷的 MySQL
终端输入:docker run -d -p 3306:3306 \ -v mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --name my-mysql \ mysql:8.0选项/字段 作用解析 -p 3306:3306端口映射:主机 3306 ↔ 容器 3306(MySQL 默认端口)。 -v mysql-data:/var/lib/mysql挂载数据卷: mysql-data(Docker 管理的命名数据卷) ↔ 容器内 MySQL 数据目录(/var/lib/mysql是 MySQL 存数据的地方)。-e MYSQL_ROOT_PASSWORD=123456设置环境变量:MySQL root 用户的密码为 123456(必须设置,否则 MySQL 启动失败)。 --name my-mysql命名容器为 my-mysql,方便后续操作。 -
验证数据持久化
# 1. 连接 MySQL 并创建测试数据 # 进入容器内的 MySQL 终端 docker exec -it my-mysql mysql -u root -p # 输入密码 123456,进入 MySQL 终端后执行: create database test_db; # 创建数据库 use test_db; create table user (id int); # 创建表 insert into user values (100); # 插入数据 exit # 退出 MySQL # 2. 停止并删除容器(模拟“容器故障”) docker stop my-mysql && docker rm my-mysql # 3. 用同一个数据卷重建容器 docker run -d -p 3306:3306 \ -v mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --name my-mysql-new \ mysql:8.0 # 4. 检查数据是否还在 docker exec -it my-mysql-new mysql -u root -p # 输入密码后执行: use test_db; select * from user; # 应输出 (100),说明数据没丢
验证方法
- 执行
docker volume ls能看到mysql-data数据卷; - 容器删除重建后,之前创建的数据库、表、数据依然存在。
避坑要点
-
坑:挂载主机目录(如
-v /home/user/mysql-data:/var/lib/mysql)后,MySQL 启动报错“Permission denied”。
原因:主机目录权限不足,容器内的 MySQL 进程(用户 ID 通常是 999)没权限读写。
解决:给主机目录授权:chmod 777 /home/user/mysql-data(简单粗暴,适合测试);或用命名数据卷(-v mysql-data:...,推荐,Docker 会自动处理权限)。 -
坑:数据卷重名导致数据混乱(比如之前创建过
mysql-data,里面有旧数据)。
解决:用docker volume rm mysql-data删除旧数据卷(先确保数据没用了),再重新创建容器。
场景 4:自定义配置启动(如 Nginx 加载自己的配置文件)
适用场景:服务需要用自己的配置(比如 Nginx 要加载自定义的 nginx.conf,Redis 要用 redis.conf 改端口/密码),而不是镜像默认配置。
核心需求
- 容器内的服务能读取主机上的自定义配置文件;
- 修改配置后,重启容器生效(不用重新构建镜像)。
操作步骤(以 Nginx 加载自定义配置为例)
-
准备自定义配置文件
在主机上创建一个目录(比如~/nginx-config),并在里面新建nginx.conf(自定义配置):# 主机终端执行: mkdir -p ~/nginx-config cd ~/nginx-config # 创建自定义 nginx.conf(比如改默认端口为 8080,加一个测试页面) cat > nginx.conf << 'EOF' user nginx; worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 8080; # 容器内 Nginx 监听 8080 端口(默认是 80) server_name localhost; location / { default_type text/plain; return 200 "这是我的自定义 Nginx 页面!\n"; # 自定义响应内容 } } } EOF -
启动 Nginx 并挂载自定义配置
终端输入:docker run -d -p 8080:8080 \ -v ~/nginx-config/nginx.conf:/etc/nginx/nginx.conf:ro \ --name my-nginx-custom \ nginx:1.25选项/字段 作用解析 -p 8080:8080端口映射:主机 8080 ↔ 容器 8080(因为自定义配置里 Nginx 监听 8080)。 -v ~/nginx-config/nginx.conf:/etc/nginx/nginx.conf:ro挂载配置文件:主机的 ~/nginx-config/nginx.conf↔ 容器内 Nginx 配置文件路径(/etc/nginx/nginx.conf);:ro表示容器对文件只读(防止误改)。 -
验证自定义配置生效
打开浏览器访问localhost:8080,应显示“这是我的自定义 Nginx 页面!”(而不是默认欢迎页)。 -
修改配置后重启
如果要改配置,直接在主机上编辑~/nginx-config/nginx.conf,改完重启容器:docker restart my-nginx-custom
验证方法
- 访问
localhost:8080能看到自定义内容; - 修改主机配置文件后,重启容器,新配置生效。
避坑要点
-
坑:挂载配置文件后,Nginx 启动报错“invalid configuration”(配置无效)。
解决:检查主机上的nginx.conf语法是否正确(可在容器内用nginx -t验证:docker exec my-nginx-custom nginx -t)。 -
坑:配置文件路径写错,导致容器用了默认配置(比如把
-v ~/nginx.conf:/etc/nginx/nginx.conf写成-v ~/nginx.conf:/etc/nginx/conf.d/default.conf)。
解决:查镜像的默认配置路径(比如 Nginx 官方镜像的主配置是/etc/nginx/nginx.conf,子配置在/etc/nginx/conf.d/),按镜像文档写对路径。
场景 5:限制资源使用(防止容器占满主机 CPU/内存)
适用场景:在共享主机上启动容器(比如开发服务器、测试环境),需要限制容器的 CPU 和内存使用(比如防止一个容器把主机内存吃光,导致其他服务崩溃)。
核心需求
- 限制容器最大内存(比如最多用 1GB);
- 限制容器最多用多少 CPU 核心(比如最多用 1 个核心)。
操作步骤(以 Redis 为例)
-
启动带资源限制的 Redis
终端输入:docker run -d -p 6379:6379 \ -m 1g \ --cpus 1 \ --name my-redis-limited \ redis:7.0选项/字段 作用解析 -m 1g限制容器最大内存为 1GB(单位支持 b/k/m/g,比如 512m表示 512MB)。--cpus 1限制容器最多使用 1 个 CPU 核心(比如 0.5表示最多用 0.5 个核心)。redis:7.0指定 Redis 7.0 版本(稳定版)。 -
验证资源限制
# 查看容器详细信息(包括资源限制) docker inspect my-redis-limited | grep -A 10 "Resources" # 输出中应能看到 "Memory": 1073741824(1GB 对应的字节数)、"Cpus": 1.0 # (可选)用 stress 工具测试内存限制(需要进入容器安装) docker exec -it my-redis-limited bash apt update && apt install -y stress stress --vm 1 --vm-bytes 1.5g # 尝试分配 1.5GB 内存 # 此时容器会因内存超限被 Docker 终止,用 `docker ps -a` 查看状态为 Exited
验证方法
- 执行
docker inspect能看到配置的内存和 CPU 限制; - 当容器尝试使用超过限制的资源时,会被限制(CPU)或终止(内存)。
避坑要点
-
坑:
-m单位写错(比如1G写成1g没问题,但写成1GB会报错)。
解决:单位只能用b(字节)、k(KB)、m(MB)、g(GB),小写大写均可(1G和1g一样)。 -
坑:限制内存太小(比如给 MySQL 设
-m 100m),导致服务启动失败。
解决:根据应用需求设合理的资源限制(比如 MySQL 至少给 512MB 内存),可先不限制启动,用docker stats看正常运行时的资源占用,再设置限制。
总结:高频选项速查表
| 场景/需求 | 必用选项组合 | 示例命令片段 |
|---|---|---|
| 临时交互测试 | -it --rm | docker run -it --rm ubuntu:22.04 |
| 后台服务+端口访问 | -d -p 主机端口:容器端口 --name | docker run -d -p 8080:80 --name my-nginx nginx:1.25 |
| 数据持久化(数据库) | -v 数据卷:容器数据目录 -e 环境变量 | docker run -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 |
| 自定义配置 | -v 主机配置文件:容器配置文件[:ro] | docker run -v ~/nginx.conf:/etc/nginx/nginx.conf:ro nginx:1.25 |
| 资源限制 | -m 内存 --cpus CPU核心数 | docker run -m 1g --cpus 1 redis:7.0 |
遇到问题时,先查对应场景的“避坑要点”,90% 的新手问题都能解决~ 如需其他场景的详细操作,随时告诉我!
更多推荐
所有评论(0)