docker容器的标准输入输出全过程

 更新时间:2026年02月03日 10:47:21   作者:岳来  
文章主要介绍了Docker容器的参数设置,包括AttachStdin、AttachStdout、AttachStderr、OpenStdin、StdinOnce和Tty等字段的含义和作用,并通过命令排列组合和输入输出对应关系详细说明了这些参数的使用场景
  • AttachStdin
  • AttachStdout
  • AttachStderr
  • OpenStdin
  • StdinOnce
  • Tty

一、参数介绍

1.1. “AttachStdin”

  • 含义:容器启动时是否将标准输入(stdin)附加到 Docker 客户端(即当前终端)。
  • 值类型:布尔值(true/false)。

作用:

  • true:允许用户通过终端向容器发送输入(如键盘输入)。
  • false:容器的标准输入不附加到终端。

典型场景:交互式容器(如 docker run -it)。

1.2. “AttachStdout”

  • 含义:容器启动时是否将标准输出(stdout)附加到 Docker 客户端。
  • 值类型:布尔值(true/false)。

作用:

  • true:容器的标准输出会实时显示在终端。
  • false:标准输出不会显示在终端,但可能写入日志文件。

典型场景:查看容器的输出日志(如 docker run 时默认启用)。

1.3. “AttachStderr”

  • 含义:容器启动时是否将标准错误(stderr)附加到 Docker 客户端。
  • 值类型:布尔值(true/false)。

作用:

  • true:容器的标准错误会实时显示在终端。
  • false:标准错误不会显示在终端,但可能写入日志文件。

典型场景:调试容器错误信息(如 docker run 时默认启用)。

1.4. “OpenStdin”

  • 含义:是否保持标准输入(stdin)打开。
  • 值类型:布尔值(true/false)。

作用:

  • true:即使容器未运行交互式命令,也保持 stdin 打开(允许后续输入)。
  • false:stdin 关闭(无法通过终端发送输入)。

典型场景:需要持续输入的容器(如 docker run -i)。

1.5. “StdinOnce”

  • 含义:标准输入(stdin)是否在第一次关闭后不再接受输入。
  • 值类型:布尔值(true/false)。

作用:

  • true:容器在读取完 stdin 后关闭输入流(适用于一次性命令)。
  • false:stdin 持续保持打开(适用于交互式命令)。

典型场景:一次性命令(如 docker run -i --rm)。

1.6. “Tty”

  • 含义:是否为容器分配伪终端(Pseudo TTY)。
  • 值类型:布尔值(true/false)。

作用:

  • true:分配伪终端,支持交互式操作(如运行 shell)。
  • false:不分配终端,适合后台服务。

典型场景:交互式调试(docker run -it)或后台服务(docker run -d)。

1.7. 总结

字段作用典型命令参数
AttachStdin是否附加 stdin 到终端-i
AttachStdout是否附加 stdout 到终端默认启用
AttachStderr是否附加 stderr 到终端默认启用
OpenStdin是否保持 stdin 打开-i
StdinOncestdin 是否在第一次关闭后终止–rm 或一次性命令
Tty是否分配伪终端-t

二、命令排列组合和输入输出对应关系

2.1. 参数组合与命令行映射

Docker 命令参数对应字段说明
-i“OpenStdin”: true保持 stdin 打开,允许输入。
-t“Tty”: true分配伪终端(PTY),通常与 -i 联用(如 docker run -it)。
无 -i“OpenStdin”: falsestdin 关闭,无法输入。
无 -t“Tty”: false不分配伪终端。

2.2. 交互式容器

docker run -it ubuntu bash

对应字段值:

  • “AttachStdin”: true
  • “OpenStdin”: true
  • “Tty”: true
  • “StdinOnce”: false

2.3. 后台服务容器

docker run -d nginx

对应字段值:

  • “AttachStdin”: false
  • “OpenStdin”: false
  • “Tty”: false
  • “StdinOnce”: false

2.4. 一次性命令容器

docker run --rm alpine echo "Hello World"

对应字段值:

  • “AttachStdin”: false
  • “OpenStdin”: false
  • “Tty”: false
  • “StdinOnce”: true

三、-d 的作用

字段作用与 -d 的关系
“AttachStdout”是否将 stdout 附加到终端使用 -d 时通常为 false
“AttachStderr”是否将 stderr 附加到终端使用 -d 时通常为 false
“Tty”是否分配伪终端(PTY)使用 -d 时通常为 false(除非同时使用 -t)
“OpenStdin”是否保持 stdin 打开使用 -d 时通常为 false

3.1、默认 docker run

  • 不加-d
docker run centos:1.0 /bin/bash
字段
“AttachStdin”false
“AttachStdout”true
“AttachStderr”true
“Tty”false
“OpenStdin”false
“StdinOnce”false
  • -d
docker run -d centos:1.0 /bin/bash
字段
“AttachStdin”false
“AttachStdout”false
“AttachStderr”false
“Tty”false
“OpenStdin”false
“StdinOnce”false

3.2、默认 docker run -i

  • -i
docker run -i centos:1.0 /bin/bash
字段
“AttachStdin”true
“AttachStdout”true
“AttachStderr”true
“Tty”false
“OpenStdin”true
“StdinOnce”true
  • -d -i
docker run -i -d centos:1.0 /bin/bash
字段
“AttachStdin”false
“AttachStdout”false
“AttachStderr”false
“Tty”false
“OpenStdin”true
“StdinOnce”false

3.3、默认 docker run -t

  • -t
docker run -t centos:1.0 /bin/bash
字段
“AttachStdin”false
“AttachStdout”true
“AttachStderr”true
“Tty”true
“OpenStdin”false
“StdinOnce”false
  • -t -d
docker run -t -d centos:1.0 /bin/bash
字段
“AttachStdin”false
“AttachStdout”false
“AttachStderr”false
“Tty”true
“OpenStdin”false
“StdinOnce”false

3.4、默认 docker run -it

  • -it
docker run -it  centos:1.0 /bin/bash
字段
“AttachStdin”true
“AttachStdout”true
“AttachStderr”true
“Tty”true
“OpenStdin”true
“StdinOnce”true
  • -itd
docker run -itd centos:1.0 /bin/bash
字段
“AttachStdin”false
“AttachStdout”false
“AttachStderr”false
“Tty”true
“OpenStdin”true
“StdinOnce”false

四、常见问题

4.1. 为什么 “OpenStdin” 为 true 但无法输入?

  • 需同时启用 “AttachStdin”: true(通过 docker run -i)。
  • 示例:docker run -i ubuntu 会启用 “OpenStdin”: true,但需配合 -t 才能交互。

4.2. “StdinOnce”: true 的作用是什么?

  • 容器在读取完 stdin 后关闭输入流,适合一次性命令(如 echo、cat)。
  • 示例:docker run --rm alpine cat 输入后按 Ctrl+D 退出。

4.3. 如何让容器后台运行但仍能查看日志?

  • 使用 -d(后台运行),并依赖 “AttachStdout” 和 “AttachStderr” 的默认值(true)。
  • 示例:docker run -d nginx 会输出日志到终端(除非重定向)。

五、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker自建GitLab仓库的实现

    docker自建GitLab仓库的实现

    Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,本文主要介绍了docker自建GitLab仓库的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • docker网络端口映射的实现步骤

    docker网络端口映射的实现步骤

    本文主要介绍了docker网络端口映射的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Gitlab-runner+Docker实现自动部署SpringBoot项目

    Gitlab-runner+Docker实现自动部署SpringBoot项目

    这篇文章主要介绍了Gitlab-runner+Docker自动部署SpringBoot项目,我们的主要流程就是通过Gitlab管理代码,然后利用Gitlab自带的Gitlab CI/CD功能与GitlabRunner进行注册绑定,需要的朋友可以参考下
    2022-04-04
  • Docker网络原理及自定义网络详细解析

    Docker网络原理及自定义网络详细解析

    一般使用自定义网络,自定义网络使用network创建,创建时可以指定子网网段及网关等信息,在创建并启动容器时指定使用的网络,今天通过本文给大家介绍Docker网络原理及自定义网络的相关知识,感兴趣的朋友一起看看吧
    2021-05-05
  • Docker查看容器IP地址的方法实现

    Docker查看容器IP地址的方法实现

    本文主要介绍了Docker查看容器IP地址的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Docker镜像的commit操作示例及作用

    Docker镜像的commit操作示例及作用

    这篇文章主要为大家介绍了Docker镜像的commit操作示例及作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Docker管理面板SimpleDocker的具体使用

    Docker管理面板SimpleDocker的具体使用

    SimpleDocker 是一个简单的Docker控制面板,本文主要介绍了Docker管理面板SimpleDocker的具体使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • docker中运行PostgreSQL容器的简单步骤

    docker中运行PostgreSQL容器的简单步骤

    这篇文章主要给大家介绍了关于docker中运行PostgreSQL容器的简单步骤,随着docker的广泛应用,为了提供便利的管理,PostgreSQL数据库也支持docker的安装方式,需要的朋友可以参考下
    2023-08-08
  • Docker容器启动报错“permission denied”原因分析及解决方案

    Docker容器启动报错“permission denied”原因分析及解决方案

    Docker容器已经成为云计算后又一个很火的技术,很多人已经开始学习docker了,这篇文章主要介绍了Docker容器启动报错“permission denied”原因分析及解决方案的相关资料,需要的朋友可以参考下
    2025-07-07
  • IntelliJ IDEA中Docker使用方式

    IntelliJ IDEA中Docker使用方式

    本文介绍了如何在IntelliJ IDEA中使用Docker插件进行Docker的配置和使用,包括下载插件、启动Docker守护进程、配置Docker注册表、构建Docker镜像以及发布镜像加载容器配置
    2024-11-11

最新评论