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

目录

  • 概述
  • 语法
  • 命令选项用法速查
  • OPTIONS说明:
  • -a stdin
    • STDIN/STDOUT/STDERR指的是什么?
    • 举例
      • 将容器的标准输入、标准输出、标准错误重定向到本地文件
      • 将容器的标准流重定向到设备
      • 将容器的标准流重定向到网络
  • -d
    • 示例
    • 应用场景
    • 返回的容器ID作用
    • 怎么通过容器ID查看任务的日志
  • -i
  • -t
    • 伪终端(pseudo-TTY)是什么,怎么使用?
    • 其他方式使用伪终端进行交互
      • 1. 运行交互式的 Python 解释器:
      • 2. 运行交互式的 Node.js 控制台:
      • 3. 运行交互式的 MySQL 客户端:
      • 4. 运行交互式的 Redis 客户端:
      • 5. 运行交互式的 PostgreSQL 客户端:
      • 6. 运行交互式的 MongoDB 客户端:
  • -P
  • -p
  • `--rm`
  • `--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 容器中使用伪终端可以让你在一个独立、隔离的环境中测试和执行各种命令行工具。

-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设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于C/C++的easyx实现贪吃蛇游戏

文章目录&#xff1a; 一&#xff1a;运行效果 1.演示 2.思路和功能 二&#xff1a;代码 文件架构 Demo 必备知识&#xff1a;基于C/C的easyx图形库教程 一&#xff1a;运行效果 1.演示 效果图◕‿◕✌✌✌ 基于C/C的easyx实现贪吃蛇游戏运行演示 参考&#xff1a;【C语…

5.5.5、【AI技术新纪元:Spring AI解码】使用PGvector设置向量存储及进行相似性搜索

使用PGvector设置向量存储及进行相似性搜索 本节指导您如何设置PGvector VectorStore来存储文档嵌入并执行相似性搜索。 PGvector是一个开源的PostgreSQL扩展,能够支持存储和搜索机器学习生成的嵌入向量,提供查找精确和近似最近邻的功能。它设计得与PostgreSQL的其他特性无…

Oracle:ORA-01830错误-更改数据库时间格式

1,先把报错SQL语句拿出来执行&#xff0c;看看是不是报的这个错 ORA-01830: 日期格式图片在转换整个输入字符串之前结束 2&#xff0c;然后查看默认日期格式是不是“YYYY-MM-DD HH24:MI:SS”&#xff08;正确格式&#xff09;。&#xff1b; 执行&#xff1a; SELECT * FRO…

citus的快速开始

准备 dockercitus最新版本&#xff08;docker pull citusdata/citus&#xff09; docker网络 docker network create --subnet172.72.9.0/24 citus-test docker network ls启动citus服务 启动协调节点 docker run -dit --name citus-cod -p 5433:5432 -e POSTGRES_PASSWOR…

Transformer的前世今生 day06(Self-Attention和RNN、LSTM的区别)

Self-Attention和RNN、LSTM的区别 RNN的缺点&#xff1a;无法做长序列&#xff0c;当输入很长时&#xff0c;最后面的输出很难参考前面的输入&#xff0c;即长序列会缺失上文信息&#xff0c;如下&#xff1a; 可能一段话超过50个字&#xff0c;输出效果就会很差了 LSTM通过忘…

【SAP-ABAP】CO01保存时错误DBSQL_DUPLICATE_KEY_ERROR

找到该表的主键OBJNR&#xff0c;事务代码SM56中查看当前缓冲到该key的号码段&#xff0c;事务代码SNRO修改对象名称OBJNR编号范围状态。 事务代码SM13查看数据更新记录

静态路由实验配置

题目及实验图 第一步划分IP IP配置如下 1&#xff09;R1&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sy R1 [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip ad 192.168.1.1 30 [R1-GigabitEthernet0/0/1]ip ad 192.168.1.5…

LeetCode 热题 HOT 100(P21~P30)

系列文章&#xff1a; LeetCode 热题 HOT 100(P1~P10)-CSDN博客 LeetCode 热题 HOT 100(P11~P20)-CSDN博客 LeetCode 热题 HOT 100(P21~P30)-CSDN博客 LC48rotate_image . - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个 n n 的二维矩阵 matrix 表…

for循环三种跳出循环的方法(retrun、continue、break)

return return是最常用的&#xff0c;不能单独在for循环中使用&#xff0c;要在函数中配合使用。 function fn () {for (var i 1; i < 5; i) {if (i 4) {return false;}console.log(i); // 分别输出 1&#xff0c;2, 3}console.log(end); // 未执行 } fn();使用return会…

JavaScript 如何设置私有属性

ES6之前的私有属性模拟 1、构造函数形式创建对象 function Person(name) {let _name name; // 私有属性this.getName function() {return _name;};this.setName function(newName) {_name newName;}; }let person new Person(Alice); console.log(person.getName()); //…

一文彻底搞懂Redis底层数据结构

文章目录 1. 数据结构与数据类型的关系2. 底层数据结构详解2.1 SDS: 简单动态字符串2.2 双端链表2.3 压缩列表2.4 哈希表2.5 整数集合2.6 跳表2.7 quicklist2.8 listpack 1. 数据结构与数据类型的关系 Redis是一个基于内存的数据存储系统&#xff0c;它支持多种数据结构和数据…

vue项目报这个错是 Same `value` exist in the tree: 0008E3000E1A?

警告 "Same value exist in the tree: 0008E3000E1A" 表示在树形选择器中存在相同的值。这通常是由于树形选择器的数据中存在重复的值造成的。就是返回的值中&#xff0c;有俩个id相同

基于K-近邻的PLOSAR图像分类

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

nginx编译安装详细说明(CentOS)

前言 在 CentOS 7 上编译安装 Nginx 1.24.0 &#xff0c;您可以按照以下步骤进行操作。 一、编译前准备 1.1、在开始编译之前&#xff0c;确保您的系统已安装必要的编译工具和依赖项。在 CentOS 7 上&#xff0c;您可以使用以下命令安装这些工具&#xff1a; [roottd66 loc…

mybatis实践篇(二)

自定义类型处理器&#xff08;TypeHandler&#xff09; 实体 package com.wyl.mybatis.entity;import java.util.Date;/*** Description 省市区-字典* Author wuyilong* Date 2024-02-26*/public class FullCity {private static final long serialVersionUID 1L;/*** 主键I…

第十三届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 裁纸刀试题 B: 寻找整数试题 C : \mathrm{C}: C: 求和试题 D: GCD试题 E: 蜂巢试题 F : \mathrm{F}: F: 全排列的价值试题 G: 青蛙过河试题 H \mathrm{H} H : 因数平方和试题 I: 最优清零方案试题 J : \mathrm{J}: J: 推导部分和 发现…

Unity Mesh简化为Cube mesh

Mesh简化为Cube mesh &#x1f373;食用&#x1f959;子物体独立生成CubeMesh&#x1f96a;合并成一个CubeMesh&#x1f32d;Demo &#x1f373;食用 下载并导入插件&#x1f448;即可在代码中调用。 &#x1f959;子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…

我的Linux命令学习之旅

探索Linux操作系统的世界&#xff0c;就像开启了一段全新的旅程。这个系统以其无与伦比的功能和灵活性著称&#xff0c;在服务器和开发领域发挥着不可或缺的作用。通过亲身实践&#xff0c;我逐渐掌握了一些基础而强大的Linux命令&#xff0c;这些命令成为了我日常工作中不可或…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11&#xff0c;发现了一个小麻烦事&#xff0c;如下图&#xff1a; 当我想使用svn或git的时候必须要多点一下&#xff0c;这忍不了&#xff0c;无形之中加大了工作量&#xff01; 于是&#xff0c;菜单全显示教程如下&#xff1a; 第一步&#xff1a;管…

vue2在调用子组件方法时,出现undefined如何解决

当父组件调用子组件queryAsnPreDeliverSku()方法时 代码报错 “Uncaught (in promise) TypeError: Cannot read properties of undefined (reading queryAsnPreDeliverSku)” 1、原因 在调用子组件queryAsnPreDeliverSku()方法时&#xff0c;this.$refs.preSkuInfoRef 是 unde…