2014-09-29 45 views
3

我知道在码头集装箱中使用多个终端是很奇怪的。Ahow在Docker容器中使用多个终端?

我的目的是测试一些命令并最终用这些命令建立一个dockerfile。 所以我需要使用多个终端,比如两个。一个是运行一些命令,另一个是用来测试命令。

如果我使用真机,我可以ssh使用多个终端,但是在docker中,我该怎么做?

也许解决的办法是将run码头与CMD /bin/bash,并在该bash中,使用screen

编辑 In my situation, one shell run a server program, the other run a client program to test the server program. Because the server program and client program are compiled together. So, the default link method in docker is not suitable.

+0

不知道我明白。你需要多一个shell?像一个运行命令,第二个运行尾部日志? – michaelbn 2014-09-29 09:56:27

+0

类似的东西,一个shell运行一个服务器程序,另一个运行一个客户端程序来测试服务器程序。 – HaveF 2014-09-29 10:23:28

回答

2

如果我理解正确的问题,那么你可以使用nsenter。 假设你有一个运行的泊坞窗命名nginx的(nginx的开始),从主机运行以下命令:

nsenter -m -u -i -n -p -t `docker inspect --format {{.State.Pid}} nginx` 

这将在PID(默认$ SHELL)的给定的名称空间启动程序。 您可以通过多次(从主机)发出多次然后运行一个shell。然后,您可以运行给定docker或tail,rm等文件中存在的任何二进制文件。例如,尾部nginx的日志文件。

更多信息可在nsenter man中找到。

+1

感谢您的回答。根据你的回答,我还找到另外一个名为'nsinit'的工具。 [它说](http://jpetazzo.github.io/2014/03/23/lxc-attach-nsinit-nsenter-docker-0-9/),“根据迈克尔克罗斯比,它甚至更好地使用nsinit他是Docker的核心维护者,也是libcontainer的主要作者;所以你打赌他知道他在说什么“ – HaveF 2014-09-29 11:34:18

+0

等待其他人的建议。再次感谢! – HaveF 2014-09-29 11:35:08

+0

这个nsinit是一个有趣的解决方案。我仍然想知道为什么它更好,然后nsenter。将尽快检查。 thx – michaelbn 2014-09-29 11:55:43

3

码头的方式是在一个容器中运行服务器,在另一个容器中运行客户端。您可以使用链接使服务器在客户端可见,并且可以使用卷使服务器上的文件可从客户端获得。如果你真的想要两个终端到同一个容器,没有什么能阻止你使用ssh。我测试了这个搬运工服务器:

来自:https://docs.docker.com/examples/running_ssh_service/

# sshd 
# 
# VERSION    0.0.1 

FROM  ubuntu:14.04 
MAINTAINER Thatcher R. Peskens "[email protected]" 

RUN apt-get update && apt-get install -y openssh-server 
RUN mkdir /var/run/sshd 
RUN echo 'root:screencast' | chpasswd 
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config 

EXPOSE 22 
CMD ["/usr/sbin/sshd", "-D"] 

您需要立足图像或周围的otherway把所有的功能组合在一起的这一形象。你已经建立并开始你的容器后,你可以得到它的IP使用

docker inspect <id or name of container> 

从泊坞窗主机,你现在可以用root,并从泊坞窗文件的密码ssh登录英寸现在你可以根据需要产生尽可能多的ssh客户端。我测试:

while true; do echo "test" >> tmpfile; sleep 1; done 

从一个客户端和

tail -f tmpfile 

从另一个

1

如果你只想玩,你可以运行在你的形象sshd并探索它,你现在的样子用于:

docker run -d -p 22 your_image /usr/sbin/sshd -D 

当您完成探索之后,您可以继续创建Dock erfile照常。

+0

合理的解决方案,我的情况。尽管我必须先安装sshd。谢谢! – HaveF 2014-09-29 12:37:23

+0

@HaveF所以,你可以运行'/ bin/bash',快速安装'sshd'并用'-D'在bash中运行它,你就完成了!另外,您可以将docker提交给您正在运行的sshd-installed容器,以便更容易地进行实验。 – Jiri 2014-09-29 15:33:18