【Docker】compose工具&&Docker run reference

  • 官方文档传送门
  • Docker run reference
  • Detached vs foreground
  • detached (-d)
  • Foreground
  • Container identification
  • Name (--name)
  • PID equivalent
  • Image[:tag]
  • Image[@digest]
  • PID settings (--pid)
  • 示例:在容器内运行 htop
  • 例子


官方文档传送门

Docker 运行参考

Docker run reference

Detached vs foreground

启动 Docker 容器时,首先要决定是要在后台以“分离”模式还是默认前台模式运行容器:

-d=false: Detached mode: Run container in the background, print new container id

detached (-d)

要以分离模式启动容器,您可以使用-d=true或只是-d选项。按照设计,当用于运行容器的根进程退出时,容器以分离模式启动,除非您还指定了该--rm选项。如果使用 -d with --rm,则在容器退出或守护程序退出时(以先发生者为准)将移除容器。

不要将service x start命令传递给分离的容器。例如,此命令尝试启动nginx服务。

$ docker run -d -p 80:80 my_image service nginx start

成功地启动nginx了容器内的服务。然而,它在分离容器范式中失败了,根进程 ( service nginx start) 返回,分离容器按设计停止。结果,该 nginx服务已启动但无法使用。相反,要启动诸如nginx Web 服务器之类的进程,请执行以下操作:

$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'

要使用分离的容器进行输入/输出,请使用网络连接或共享卷。这些是必需的,因为容器不再侦听docker run运行的命令行。

重新附加到分离的容器,请使用docker attach命令。

Foreground

在前台模式下(-d未指定时的默认值),docker run可以在容器中启动进程并将控制台附加到进程的标准输入、输出和标准错误。它甚至可以伪装成 TTY(这是大多数命令行可执行文件所期望的)并传递信号。所有这些都是可配置的:

在计算中,tty是Unix和类Unix操作系统中的命令,用于打印连接到标准输入的终端的文件名。tty代表TeleTYpewriter。

-a=[]           : Attach to `STDIN`, `STDOUT` and/or `STDERR`
-t              : Allocate a pseudo-tty
--sig-proxy=true: Proxy all received signals to the process (non-TTY mode only)
-i              : Keep STDIN open even if not attached

如果您未指定,-a则 Docker 将附加到 stdoutstderr 。您可以指定要连接到三个标准流 ( STDIN, STDOUT, STDERR) 中的哪一个,如下所示:

$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash

对于交互式进程(如 shell),您必须-i -t一起使用才能为容器进程分配一个 tty-i -t通常-it 如您将在后面的示例中看到的那样编写。-t当客户端从管道接收其标准输入时,禁止指定,如下所示:

$ echo test | docker run -i busybox cat

在容器内作为 PID 1 运行的进程被 Linux 特殊对待:它忽略任何具有默认操作的信号。 因此,进程不会在 SIGINTSIGTERM 上终止,除非它被编码为这样做。

Container identification

Name (–name)

The operator can identify a container in three ways:

Identifier type

Example value

UUID long identifier

“f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778”

UUID short identifier

“f78375b1c487”

Name

“evil_ptolemy”

UUID 标识符来自 Docker daemon。 如果您没有使用 --name 选项分配容器名称,那么守护程序会为您生成一个随机字符串名称。 定义名称是一种为容器添加含义的便捷方式。 如果指定名称,则可以在 Docker 网络中引用容器时使用它。 这适用于后台和前台 Docker 容器。

  • Note

默认桥接网络上的容器必须链接以通过名称进行通信。

PID equivalent

最后,为了帮助实现自动化,您可以让 Docker 将容器 ID 写入您选择的文件中。 这类似于某些程序可能会将其进程 ID 写入文件的方式(您已经将它们视为 PID 文件):

--cidfile="": Write the container ID to the file

Image[:tag]

虽然严格来说这不是一种识别容器的方法,但您可以通过在命令中添加 image[:tag] 来指定要用于运行容器的镜像版本。 例如,docker 运行 ubuntu:14.04。

Image[@digest]

使用 v2 或更高版本图像格式的图像具有称为摘要的内容可寻址标识符。 只要用于生成图像的输入不变,摘要值就是可预测和可参考的。

以下示例使用

sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0

digest:

$ docker run alpine@sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0 date

PID settings (–pid)

--pid=""  : Set the PID (Process) Namespace mode for the container,
             'container:<name|id>': joins another container's PID namespace
             'host': use the host's PID namespace inside the container

默认情况下,所有容器都启用了 PID 命名空间。

PID 命名空间提供进程分离。PID 命名空间移除了系统进程的视图,并允许重用进程 ID,包括 pid 1

在某些情况下,您希望容器共享主机的进程命名空间,基本上允许容器内的进程查看系统上的所有进程。例如,您可以使用 stracegdb 等调试工具构建容器,但希望在调试容器内的进程时使用这些工具

示例:在容器内运行 htop

创建此 Dockerfile:

FROM alpine:latest
RUN apk add --update htop && rm -rf /var/cache/apk/*
CMD ["htop"]

构建 Dockerfile 并将图像标记为 myhtop:

$ docker build -t myhtop .

使用以下命令在容器内运行 htop:

$ docker run -it --rm --pid=host myhtop
加入另一个容器的 pid 命名空间可用于调试该容器。

例子

启动一个运行 redis 服务器的容器:

$ docker run --name my-redis -d redis

通过运行另一个包含 strace 的容器来调试 redis 容器:

$ docker run -it --pid=container:my-redis my_strace_docker_image bash
$ strace -p 1