docker attach vs lxc-attach

Posted

技术标签:

【中文标题】docker attach vs lxc-attach【英文标题】: 【发布时间】:2014-04-14 04:35:25 【问题描述】:

更新:Docker 0.9.0 现在使用 libcontainer,从 LXC 转移,请参阅:Attaching process to Docker libcontainer container

我正在运行一个弹性搜索:

docker run -d -p 9200:9200 -p 9300:9300 dockerfile/elasticsearch

检查它显示的过程如下:

$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE                             COMMAND                                           CREATED             STATUS              PORTS                                            NAMES
49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22   dockerfile/elasticsearch:latest   /usr/share/elasticsearch/bin/elasticsearch java   About an hour ago   Up 8 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   pensive_morse   

现在,当我尝试附加正在运行的容器时,我被堆叠了:

$  sudo docker attach 49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22
[sudo] password for lsoave:

tty 未连接且提示未返回。用 lxc-attach 做同样的事情很好:

$ sudo lxc-attach -n 49fdccefe4c8c72750d8155bbddad3acd8f573bf13926dcaab53c38672a62f22
root@49fdccefe4c8:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0 49 20:37 ?        00:00:20 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMa
root        88     0  0 20:38 ?        00:00:00 /bin/bash
root        92    88  0 20:38 ?        00:00:00 ps -ef
root@49fdccefe4c8:/# 

有人知道 docker attach 有什么问题吗?

注意。 dockerfile/elasticsearch 结尾:

ENTRYPOINT ["/usr/share/elasticsearch/bin/elasticsearch"]

【问题讨论】:

【参考方案1】:

您正在附加到运行 elasticsearch 的容器,这不是交互式命令。由于容器没有运行 shell,因此您没有输入 shell。 lxc-attach 起作用的原因是它为您提供了一个默认外壳。每man lxc-attach:

如果没有指定命令,用户当前的默认shell 运行 lxc-attach 将在容器内查找并 执行。如果容器内不存在这样的用户,这将失败 或者容器没有工作的 nsswitch 机制。

docker attach 的行为符合预期。

【讨论】:

预期但不一致的恕我直言【参考方案2】:

正如 Ben Whaley 所说,这是预期的行为。 值得一提的是,如果您想监控流程,您可以做很多事情:

启动 bash 作为前端进程:例如$ES_DIR/bin/elasticsearch && /bin/bash 将在您附加时给您您的外壳。主要在开发过程中有用。不太干净:) 安装 ssh 服务器。虽然我自己从来没有这样做过,但这是一个不错的选择。缺点当然是开销,也许是安全角度。你真的想在你所有的容器上使用 ssh 吗?就我个人而言,我喜欢将它们尽可能地小,以单进程作为最终的胜利。 使用日志文件!您可以使用docker cp 在本地获取日志,或者更好地使用docker logs $CONTAINER_ID 命令。后者每次都会为您提供容器整个生命周期内累积的标准输入/标准错误输出。 挂载日志目录。只需在主机上挂载一个目录,然后让 elasticsearch 写入该目录中的日志文件。你可以在你的主机、Logstash 或任何让你打开的东西上拥有 syslog ;)。当然,这里的缺点是您现在使用主机的次数超出了您的预期。我还发现了一个使用 logstash in this blog 的不错的实验。

【讨论】:

当前尝试使用 /bin/bash 作为前端进程并在之后附加失败。容器会自动关闭(因此 /bin/bash 不会继续作为前端进程运行)。【参考方案3】:

FWIW,现在 Docker 1.3 发布了,您可以使用“docker exec”在正在运行的容器上打开 shell 或其他进程。这应该允许您在使用本机驱动程序时有效地替换 lxc-attach。

http://blog.docker.com/2014/10/docker-1-3-signed-images-process-injection-security-options-mac-shared-directories/

【讨论】:

以上是关于docker attach vs lxc-attach的主要内容,如果未能解决你的问题,请参考以下文章

docker exec 和 docker attach 的区别

docker 命令详解(十三):attach

mono和VS有时候Attach失败的解决办法

docker attach 正确用法

Docker attach

docker attach 和 exec 的区别