【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 将附加到 stdout
和 stderr
。您可以指定要连接到三个标准流 ( 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 特殊对待:它忽略任何具有默认操作的信号。 因此,进程不会在
SIGINT
或SIGTERM
上终止,除非它被编码为这样做。
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
。
在某些情况下,您希望容器共享主机的进程命名空间,基本上允许容器内的进程查看系统上的所有进程。例如,您可以使用 strace
或 gdb
等调试工具构建容器,但希望在调试容器内的进程时使用这些工具。
示例:在容器内运行 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