docker基础(四)之docker run(第一弹)

概述

用于学习和记录,以下内容来自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 容器中使用伪终端可以让你在一个独立、隔离的环境中测试和执行各种命令行工具。

-P

随机端口映射,容器内部端口随机映射到主机的端口

当你使用-P选项时,Docker 会随机选择一个宿主机端口,然后将它映射到容器中的对应端口上。这意味着你可以从外部访问容器中的服务,而不需要关心端口的具体映射情况。

举例来说,假设你有一个运行着Web服务器的容器,它在容器内部监听80端口。如果你使用了 -P 选项启动了这个容器,Docker会随机选择一个宿主机端口(比如32768),并将它映射到容器内部的80端口上。这意味着你可以通过访问主机的32768端口来访问容器中的Web服务器。

-p

指定端口映射,格式为:主机(宿主)端口:容器端口

当你使用 -p 选项时,你可以手动指定要映射的主机端口和容器端口。比如:

docker run -p 8080:80 my_web_server

这样,主机的8080端口会被映射到容器内部的80端口。这意味着你可以通过访问主机的8080端口来访问Web服务器。

--rm

在容器停止运行时自动删除容器。

--rm参数指定在容器停止运行时自动删除容器。当容器退出运行后,使用--rm参数启动的容器将被自动清理,从而避免占用系统资源和空间。

举个例子,如果你运行下面的命令:

docker run --rm -it alpine /bin/sh

在这种情况下,当你退出交互式的Alpine容器后,容器将会被自动删除。这在一些临时性任务或者一次性的操作中特别有用,因为你不需要手动去清理容器占用的资源。

换句话说,如果你就临时使用一下这个镜像的容器,一会就要删掉的话,就加上--rm,这样的话,当你执行exit退出容器的时候,系统就会自动帮你清理这个容器了,就不需要你手动再来docker stopdocker rm了。

--name="nginx-lb"

为容器指定一个名称;
--name参数用于为运行的容器指定一个名称。这个名称可以让你更容易地识别和管理容器,而不必依赖于Docker自动生成的随机名称。

这样做有几个作用:

  1. 便于识别:通过为容器指定名称,你可以使用自定义的名称来标识和识别容器,而不必依赖于Docker生成的ID或随机名称。
  2. 管理和操作:当你需要执行一些Docker操作,比如停止、启动、删除容器等等,使用自定义名称会更加直观和便捷

举例来说,如果你运行以下命令将一个NGINX容器命名为"nginx-lb"

docker run --name="nginx-lb" -d nginx

之后,你可以通过名称"nginx-lb"来引用这个容器,而不必去记录或记忆其容器ID。如果需要停止或删除这个容器,也可以直接使用名称来进行操作。这使得管理和操作Docker容器变得更加方便。

如果你不使用--name参数为容器指定一个名称,Docker将会为容器自动生成一个随机的唯一名称。这个名称通常是一个有趣的、令人快乐的单词组合,比如"festive_wozniak"或者"cool_morse"这样的形式。

这个随机生成的名称可能对于识别和管理容器来说没那么直观,因此在实际中可能更倾向于为容器指定一个有意义的自定义名称。 如果你决定不指定名称,Docker也可以正常运行,但你可能需要使用容器ID或随机生成的名称来引用和管理容器,这可能不太方便。因此,为了方便识别和管理,最好形式化地为容器指定一个名称。

--dns 8.8.8.8

指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com

指定容器DNS搜索域名,默认和宿主一致;

--dns--dns-search 比较

--dns参数用于指定容器使用的DNS服务器,而--dns-search参数用于指定容器的DNS搜索域名

--dns--dns-search 作用

  • --dns的作用是容器将使用指定的DNS服务器来进行域名解析。 这对于一些需要自定义DNS解析的场景下非常有用,例如在某些网络不通畅的环境下,你可能需要使用一个靠谱的DNS服务来保证容器内部应用的正常运行。
  • --dns-search的作用是指定容器的DNS搜索域名。这个设置允许你在容器内部对无域名的请求做出自定义的搜索处理。 比如,如果你指定了example.com作为搜索域名,那么当在容器内部使用不完整的主机名时,容器将会自动尝试使用example.com这个域名来完成解析,而不是仅依赖于默认的搜索域。

如果不指定这两个参数,容器将默认使用宿主机的DNS配置。这通常不会导致问题,因为容器会和宿主机一致地使用相同的DNS服务器和搜索域名。 但在一些特定情况下,特别是需要自定义网络配置或者需要使用特定的DNS服务时,你可能需要使用–dns和–dns-search参数来覆盖默认的DNS设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值