Docker - 容器与 Shell
Docker - 与容器交互
Section titled “Docker - 与容器交互”容器是 Docker 镜像的活实例。一旦运行一个镜像,您通常需要与正在运行的容器进行交互,也许是为了在其中执行命令或管理其生命周期。
交互式地运行容器
Section titled “交互式地运行容器”您可以使用 docker run 命令并配合 -it 标志来启动一个容器并立即获得一个交互式 shell。
# 示例:启动一个 Ubuntu 容器并获取 bash shelldocker run -it ubuntu bash-i(interactive,交互式):即使未附加,也保持 STDIN 打开。-t(tty):分配一个伪终端 (pseudo-TTY)。
以这种方式启动的交互式容器会话中,您可以在其中运行命令,就像登录到那个系统一样。要不停止容器而退出 shell,请使用分离序列:Ctrl+P 后跟 Ctrl+Q。
如果您只是输入 exit 或按下 Ctrl+D,主进程(此处为 bash)将终止,容器也会停止。
在运行中的容器中执行命令 (docker exec)
Section titled “在运行中的容器中执行命令 (docker exec)”在已经运行的容器中运行命令的标准且最灵活的方式是使用 docker exec。这对于调试、检查日志或执行管理任务非常有用,而无需停止和重新启动容器。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]-i,--interactive:保持 STDIN 打开。-t,--tty:分配一个伪终端 (pseudo-TTY)。-d,--detach:在后台运行命令。-w,--workdir:指定容器内的工作目录。
首先,在后台启动一个容器(使用 -d 进入分离模式):
# 在后台启动一个名为 'my-webserver' 的 nginx 容器docker run -d --name my-webserver nginx:stable-alpine现在,使用 docker exec 与其交互:
# 在 'my-webserver' 容器内部获取交互式 bash shelldocker exec -it my-webserver sh # Alpine 镜像默认使用 'sh'
# 运行单个命令(列出 /usr/share/nginx/html 中的文件)docker exec my-webserver ls /usr/share/nginx/html
# 非交互式地检查 nginx 版本docker exec my-webserver nginx -v对于通用交互,docker exec 比 nsenter 或直接附加到容器主进程等旧方法更受欢迎,因为它更简单且专为此任务构建。
附加到运行中的容器 (docker attach)
Section titled “附加到运行中的容器 (docker attach)”docker attach 命令将您终端的标准输入、输出和错误流连接到正在运行的容器的主进程(Dockerfile 中由 CMD 或 ENTRYPOINT 指定的进程)。这与 docker exec 不同。
docker attach CONTAINER主要在需要直接与容器主运行应用程序交互时使用 docker attach,特别是当它设计为交互式使用或您想查看其直接输出时。请谨慎:退出附加会话通常会使容器停止,如果主进程终止的话。
对于获取 shell 或运行任意命令,docker exec 几乎总是更好的选择。