2014-09-29 44 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