docker attach vs lxc-attach

时间:2014-03-10 20:44:51

标签: linux virtualization docker lxc

更新: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有什么问题吗?

NB。 dockerfile/elasticsearch以:

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

3 个答案:

答案 0 :(得分:7)

您附加到运行elasticsearch的容器,该容器不是交互式命令。你没有得到一个shell来输入,因为容器没有运行shell。 lxc-attach工作的原因是因为它为您提供了一个默认shell。每man lxc-attach

  

如果未指定命令,则为用户的当前默认shell   运行lxc-attach将在容器内查找   执行。如果容器内不存在此类用户,则会失败   或者容器没有可用的nsswitch机制。

docker attach的行为符合预期。

答案 1 :(得分:4)

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

  • 以正面流程开始bash:例如当你附上时,$ES_DIR/bin/elasticsearch && /bin/bash会给你你的外壳。在开发过程中主要有用。不太干净:)。
  • 安装ssh服务器。虽然我自己从未这样做过,但这是一个不错的选择。缺点当然是开销,也许是一个安全角度。你真的想在所有容器上使用ssh吗?就个人而言,我喜欢尽可能地保持它们的单一过程作为最终的胜利。
  • 使用日志文件!您可以使用docker cp在本地获取日志,或者更好地使用docker logs $CONTAINER_ID命令。后者每次都会为容器的entre生命周期提供累积的stdin / stderr输出。
  • 挂载日志目录。只需在主机上挂载一个目录,并将elasticsearch写入该目录中的日志文件即可。您可以在主机上使用系统日志,使用Logstash或其他任何内容;)。当然,这里的缺点是你现在使用的主机比你想要的多。我还使用logstash in this blog找到了一个不错的实验。

答案 2 :(得分:4)

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/