docker run -it 参数中i和t必须同时用吗?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 参数 正文

基本语法

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
  • [OPTIONS]:运行容器时使用的参数,非常丰富,可以控制容器的方方面面。
  • IMAGE[:TAG|@DIGEST]:必须指定的参数,表示要运行的镜像,可以是镜像名(如 nginx),也可以是镜像名加标签(如 nginx:latest),或者是镜像的摘要(@sha256:...)。
  • [COMMAND]:可选参数,在容器启动后要执行的命令,如果镜像中已经定义了默认的启动命令(CMDENTRYPOINT),这里的命令会覆盖它。
  • [ARG...]:可选参数,传递给 [COMMAND] 的参数。

核心参数分类详解

下面我将参数按照功能进行分类,并解释每个参数的作用、常用场景和示例。

docker run it 参数
(图片来源网络,侵删)

容器名称和标识

  • --name string

    • 作用:为容器指定一个自定义名称,如果不指定,Docker 会自动生成一个随机名称(如 angry_babbage)。
    • 场景:当你需要通过名称来管理容器(如 docker stop my_container)时,这个参数非常有用。
    • 示例
      docker run --name my_web_server -d nginx
  • -i, --interactive

    • 作用:以交互模式运行容器,通常与 -t 一起使用。
    • 场景:当你需要进入容器的 Shell 进行交互时。
    • 示例
      docker run -it ubuntu /bin/bash
  • -t, --tty

    • 作用:为容器分配一个伪终端(pseudo-terminal)。
    • 场景:与 -i 配合使用,让你获得一个可交互的 Shell 环境。
    • 示例
      docker run -it ubuntu /bin/bash

后台运行和资源控制

  • -d, --detach

    docker run it 参数
    (图片来源网络,侵删)
    • 作用:在后台运行容器,并打印出容器 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

端口映射

这是将容器内部服务暴露给外部世界的关键。

docker run it 参数
(图片来源网络,侵删)
  • -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 数据库容器,它需要:

  1. 在后台运行。
  2. 命名为 my_mysql
  3. 设置 root 用户密码为 my-secret-pw
  4. 将数据持久化到宿主机的 /var/lib/mysql 目录。
  5. 将容器的 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

这将输出一份非常详尽的列表,是学习和查阅的最佳资料。

-- 展开阅读全文 --
头像
神舟战神k660d i7 d2拆机
« 上一篇 01-14
神舟战神Z6-i78154S2拆机有何亮点?
下一篇 » 01-14

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]