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的主要内容,如果未能解决你的问题,请参考以下文章