• --name="nginx-lb"
  • --dns 8.8.8.8
  • --dns-search example.com
  • --dns和--dns-search 比较
  • --dns和--dns-search 作用

概述

用于学习和记录,以下内容来自chatgpt3.5,网络等,补充例子。

本文介绍了docker run的基础用法,及这些options的详细解释和例子。包括 -a stdin;-d, -i, -t, -P, -p, --rm, --name, --dns, --dns-search

docker系列其他文章:docker专栏

由于内容比较多,分为两篇博文,本文只对部分options进行详细说明,其他选项说明可以查看:
docker基础(五)之docker run(第二弹)

其他相关:docker基础(六)之docker create和docker exec

语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run 创建一个新的容器并运行一个命令

命令选项用法速查

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与-t同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb: 为容器指定一个名称;
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie": 设置环境变量;
  • --env-file=[]: 从指定文件读入环境变量;
  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container 四种类型;
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]: 开放一个端口或一组端口;
  • --volume , -v: 绑定一个卷

OPTIONS说明:

-a stdin

指定标准输入输出内容类型,可选STDIN/STDOUT/STDERR三项.

STDIN/STDOUT/STDERR指的是什么?

这些是标准的I/O流程符号

STDIN(标准输入)是指向程序的输入流,可以通过键盘或者重定向输入到程序中。

STDOUT(标准输出)是指向程序的输出流,程序默认会将输出发送到标准输出,可以重定向到文件或者其他地方。

STDERR(标准错误)也是一个输出流,用于发送程序的错误信息。

在Docker中,-a stdin参数可以将容器的标准输入重定向到指定的文件或设备,而STDIN/STDOUT/STDERR则是定义了标准的输入、输出、错误流的含义。

举例

假设我们有一个简单的Docker容器,该容器内部的程序需要从标准输入读取数据并将结果输出到标准输出或标准错误。

将容器的标准输入、标准输出、标准错误重定向到本地文件

我们可以使用docker run命令来启动一个容器,并将容器的标准输入、标准输出、标准错误重定向到本地文件。假设我们有一个名为"input.txt"的文件,我们想将其内容作为容器的标准输入,并将容器的标准输出和标准错误分别重定向到"output.txt"和"error.txt"文件中,我们可以使用以下命令:

docker run -i -a stdin=input.txt -a stdout=output.txt -a stderr=error.txt <image>

上述命令中,-i表示在容器的标准输入上启用交互式连接

-a stdin=input.txt表示将容器的标准输入重定向到"input.txt"文件

-a stdout=output.txt表示将容器的标准输出重定向到"output.txt"文件

-a stderr=error.txt表示将容器的标准错误重定向到"error.txt"文件。

这样,当容器启动后,它将从"input.txt"文件读取输入数据,并将输出和错误信息分别写入"output.txt"和"error.txt"文件中。

在Docker中,除了文件外,还可以将标准流重定向到设备或网络。

将容器的标准流重定向到设备

重定向到设备:

docker run -a stdin=/dev/tty -a stdout=/dev/lp0 -a stderr=/dev/console <image>

在这个例子中,标准输入被重定向到终端设备(/dev/tty),标准输出被重定向到打印机设备(/dev/lp0),标准错误被重定向到控制台设备(/dev/console)。

将容器的标准流重定向到网络

重定向到网络:

docker run -a stdout=| nc example.com 80

这个例子中,标准输出通过管道重定向到网络连接,使用nc命令将输出发送到远程主机的端口80。

-d

后台运行容器,并返回容器ID;
在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach 命令或 nsenter 工具等。

当使用-d参数时,容器将在后台运行,并返回容器的ID。这意味着容器将在后台运行,而不会占用当前终端的控制权。

示例

以下是一个示例,假设我们有一个名为my-container的容器,我们想要在后台运行它,并获取容器的ID:

docker run -d <image>

运行以上命令后,Docker会在后台启动指定的容器,并返回该容器的ID。通过此命令,容器将会在后台运行,而不会阻塞当前终端的控制权,同时可以获得容器的ID以供进一步操作。

应用场景

-d参数在Docker中的应用场景包括但不限于以下几种情况:

  • 后台服务运行:如果你需要在Docker中运行一项长期运行的服务,而不希望它占用你的终端,你可以使用-d参数将容器在后台以守护进程的方式运行。
  • 定时任务和周期性任务:有些任务需要以一定的时间间隔或者定时执行,使用-d参数可以让这些任务在后台按照你的计划自动执行,而不需要手动触发。
  • 后台作业:某些场景下,你可能需要在Docker中运行一些后台作业或者自动化任务,通过-d参数可以更加方便地实现这些目的。

总之,-d参数适用于需要在后台运行的场景,这样可以让容器以守护进程的方式独立运行,并且不会阻塞当前终端的控制权。

返回的容器ID作用

返回的容器ID可以用于识别和管理容器。

一旦容器在后台以守护进程的方式运行,容器ID就可以用于执行其他Docker命令,如停止容器、查看容器日志、执行进入容器等操作。

怎么通过容器ID查看任务的日志

要通过容器ID来查看任务的执行日志或状态,可以使用docker logs命令。这对于在容器中运行的服务或定时任务来说非常有用。
举个例子,假设我们有一个名为 “my-container” 的容器,我们可以通过以下方式使用容器ID来查看其日志:

docker logs <container_id>

例如如果容器ID是e3f00b2aedff,我们可以使用以下命令来查看这个容器执行任务的日志:

docker logs e3f00b2aedff

这将显示容器内服务或任务的输出,可以帮助我们了解任务的执行状态和日志信息。

具体来说,可以使用容器ID来执行如下操作:

  1. 停止容器:使用docker stop命令,需要提供容器ID来指定哪个容器进行停止操作。
  2. 查看容器日志:使用docker logs命令可以查看容器的日志输出,同样需要提供容器ID
  3. 进入容器:使用docker exec命令可以在运行中的容器内执行命令,同样需要提供容器ID

因此,返回的容器ID可以用于作为容器的唯一标识,用于执行其他针对容器的操作。

-i

以交互模式运行容器,通常与 -t 同时使用;

-t

为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-i参数在Docker中表示以交互模式运行容器。通常与-t参数一起使用,-t参数表示分配一个伪终端(pseudo-TTY)-i-t一起使用时,可以让用户与容器进行交互,从而可以输入命令并查看容器的输出。

使用-i参数的含义是告诉Docker在容器内部打开一个交互式会话,允许用户在终端中输入命令,并且能够查看容器执行命令的实时输出。

举个例子,假设我们有一个名为 “my-container” 的容器,我们可以通过以下命令以交互模式运行容器(假设该容器包含了交互式的命令行工具):

docker run -it <image>

在这个例子中,-it参数结合了-i-t,启动了一个交互式终端,允许用户输入命令并查看实时输出。

伪终端(pseudo-TTY)是什么,怎么使用?

伪终端(pseudo-TTY)是一种**在计算机中模拟终端设备的技术,使用户可以与程序进行交互。**在Docker中,-t参数用于分配一个伪终端给容器,并将容器的标准输入和输出连接到此伪终端,使用户可以与容器中的命令进行交互。

下面是一个示例,演示如何使用-t参数来分配一个伪终端给容器:

docker run -t -i ubuntu /bin/bash

在这个例子中,我们使用-t参数来为容器分配一个伪终端,同时使用-i参数以交互模式运行容器。在这种情况下,我们使用了 ubuntu 镜像,并执行了 /bin/bash 命令,这将在容器中启动一个交互式的 Bash shell这样,用户就可以与容器中运行的 Bash shell 进行交互。

一旦容器中的 Bash shell启动,你就可以在终端中输入命令,并且能够看到命令的输出。例如,你可以运行 ls 命令查看容器的文件列表,或者运行其他的系统命令。

其他方式使用伪终端进行交互

除了交互式的 Bash shell,还有很多其他方式可以在 Docker 容器中使用伪终端(pseudo-TTY)进行交互。以下是一些示例:

1. 运行交互式的 Python 解释器:
docker run -it python /usr/bin/python

这个命令会启动一个交互式的 Python 解释器,允许你在容器中编写和执行 Python 代码。

2. 运行交互式的 Node.js 控制台:
docker run -it node /usr/bin/node

这个命令会启动一个交互式的 Node.js 控制台,允许你在容器中编写和执行 JavaScript 代码。

3. 运行交互式的 MySQL 客户端:
docker run -it mysql mysql -h <host> -u <username> -p

这个命令会启动一个交互式的 MySQL 客户端,使你可以连接到 MySQL 服务器并在容器中执行 SQL 查询。

4. 运行交互式的 Redis 客户端:
docker run -it --rm redis redis-cli -h <host>

这个命令会启动一个交互式的 Redis 客户端,允许你连接到 Redis 服务器并执行 Redis 命令。

5. 运行交互式的 PostgreSQL 客户端:
docker run -it --rm postgres psql -h <host> -U <username> -d <database>

这个命令会启动一个交互式的 PostgreSQL 客户端,使你可以连接到 PostgreSQL 服务器并执行 SQL 查询。

6. 运行交互式的 MongoDB 客户端:
docker run -it --rm mongo mongo --host <host>

这个命令会启动一个交互式的 MongoDB 客户端,允许你连接到 MongoDB 服务器并执行 MongoDB 命令和查询。

总之,在 Docker 容器中,你可以使用伪终端来与各种命令行工具进行交互,这为开发、测试和调试提供了很大的灵活性。

除了上述示例,你还可以在容器中与各种其他命令行工具进行交互,包括版本控制系统(如 Git)、网络工具(如 cURL)、文本处理工具(如 sedawk)以及编程语言的 REPL(交互式解释器)等。在 Docker 容器中使用伪终端可以让你在一个独立、隔离的环境中测试和执行各种命令行工具。