这份手册聚焦 5 个最常用的 docker run 场景,每个场景都包含“操作步骤+选项解析+验证方法+避坑要点”,你可以直接对照操作,遇到问题翻对应“避坑”部分即可解决。

场景 1:交互模式测试(临时用,用完就删)

适用场景:临时启动一个系统(如 Ubuntu、CentOS)或工具(如 Python、Node),执行几条命令测试(比如验证脚本在不同系统上是否能跑),不需要保留容器。

核心需求

  • 能在容器里输入命令(交互);
  • 有终端样式(方便操作);
  • 测试完容器自动删除(不占空间)。

操作步骤(以 Ubuntu 为例)

  1. 启动交互容器
    终端输入:

    docker run -it --rm ubuntu:22.04  
    
    选项/字段作用解析
    -i保持输入流打开,让你能在容器里输入命令(比如 lscd)。
    -t分配伪终端,让容器里的命令行有“样式”(比如显示路径 root@容器ID:/#)。
    --rm容器停止后自动删除(退出终端后,docker ps -a 看不到这个容器)。
    ubuntu:22.04指定用 Ubuntu 22.04 版本(不用 latest,避免版本意外更新)。
  2. 在容器内执行测试命令
    进入容器后,终端会显示 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 安装成功  
    
  3. 退出并清理
    测试完输入 exit,终端回到主机界面,容器自动删除。

验证方法

  • 启动后能看到容器内终端(root@xxxx:/#),且能输入命令;
  • 退出后执行 docker ps -a,看不到名为 ubuntu:22.04 的容器(因为 --rm 生效)。

避坑要点

  1. :输入 docker run -it ubuntu 后,执行 apt install 报错“无法定位包”。
    解决:Ubuntu 镜像默认没更新软件源,先执行 apt update 再安装。

  2. :退出容器后,想重新进入,却提示“容器不存在”。
    原因--rm 会让容器退出后删除,所以临时测试别指望“二次进入”,如需多次操作,去掉 --rm

场景 2:后台启动服务(长期运行,如 Nginx/Redis)

适用场景:启动 Web 服务(Nginx)、缓存(Redis)等需要长期运行的应用,希望服务在后台跑,不占用终端,且方便管理(启停、看日志)。

核心需求

  • 服务在后台运行(不卡终端);
  • 能通过主机访问服务(端口映射);
  • 给容器起个名字(方便后续操作)。

操作步骤(以 Nginx 为例)

  1. 启动后台 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 带来的版本风险)。
  2. 管理服务(启停、日志)

    # 查看容器是否在运行(状态应为 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!”)。

避坑要点

  1. :启动时报错“port is already allocated”(端口已被占用)。
    解决:换一个主机端口,比如 -p 8081:80;或用 lsof -i :8080(Linux/Mac)查占用端口的程序,停止它。

  2. 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 为例)

  1. 启动带数据卷的 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,方便后续操作。
  2. 验证数据持久化

    # 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 数据卷;
  • 容器删除重建后,之前创建的数据库、表、数据依然存在。

避坑要点

  1. :挂载主机目录(如 -v /home/user/mysql-data:/var/lib/mysql)后,MySQL 启动报错“Permission denied”。
    原因:主机目录权限不足,容器内的 MySQL 进程(用户 ID 通常是 999)没权限读写。
    解决:给主机目录授权:chmod 777 /home/user/mysql-data(简单粗暴,适合测试);或用命名数据卷(-v mysql-data:...,推荐,Docker 会自动处理权限)。

  2. :数据卷重名导致数据混乱(比如之前创建过 mysql-data,里面有旧数据)。
    解决:用 docker volume rm mysql-data 删除旧数据卷(先确保数据没用了),再重新创建容器。

场景 4:自定义配置启动(如 Nginx 加载自己的配置文件)

适用场景:服务需要用自己的配置(比如 Nginx 要加载自定义的 nginx.conf,Redis 要用 redis.conf 改端口/密码),而不是镜像默认配置。

核心需求

  • 容器内的服务能读取主机上的自定义配置文件;
  • 修改配置后,重启容器生效(不用重新构建镜像)。

操作步骤(以 Nginx 加载自定义配置为例)

  1. 准备自定义配置文件
    在主机上创建一个目录(比如 ~/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  
    
  2. 启动 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 表示容器对文件只读(防止误改)。
  3. 验证自定义配置生效
    打开浏览器访问 localhost:8080,应显示“这是我的自定义 Nginx 页面!”(而不是默认欢迎页)。

  4. 修改配置后重启
    如果要改配置,直接在主机上编辑 ~/nginx-config/nginx.conf,改完重启容器:

    docker restart my-nginx-custom  
    

验证方法

  • 访问 localhost:8080 能看到自定义内容;
  • 修改主机配置文件后,重启容器,新配置生效。

避坑要点

  1. :挂载配置文件后,Nginx 启动报错“invalid configuration”(配置无效)。
    解决:检查主机上的 nginx.conf 语法是否正确(可在容器内用 nginx -t 验证:docker exec my-nginx-custom nginx -t)。

  2. :配置文件路径写错,导致容器用了默认配置(比如把 -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 为例)

  1. 启动带资源限制的 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 版本(稳定版)。
  2. 验证资源限制

    # 查看容器详细信息(包括资源限制)  
    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)或终止(内存)。

避坑要点

  1. -m 单位写错(比如 1G 写成 1g 没问题,但写成 1GB 会报错)。
    解决:单位只能用 b(字节)、k(KB)、m(MB)、g(GB),小写大写均可(1G1g 一样)。

  2. :限制内存太小(比如给 MySQL 设 -m 100m),导致服务启动失败。
    解决:根据应用需求设合理的资源限制(比如 MySQL 至少给 512MB 内存),可先不限制启动,用 docker stats 看正常运行时的资源占用,再设置限制。

总结:高频选项速查表

场景/需求必用选项组合示例命令片段
临时交互测试-it --rmdocker run -it --rm ubuntu:22.04
后台服务+端口访问-d -p 主机端口:容器端口 --namedocker 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% 的新手问题都能解决~ 如需其他场景的详细操作,随时告诉我!

更多推荐