2014-10-09 57 views
2

我試圖向外界揭示碼頭集裝箱,而不僅僅是主機。當我從一個基礎的CentOS圖像創建的圖像,它看起來是這樣的:連接到暴露的碼頭集裝箱

# install openssh server and ssh client 
RUN yum install -y openssh-server 
RUN yum install -y openssh-clients 

RUN echo 'root:password' | chpasswd 

RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config 
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config 

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

我運行這個形象,像這樣:

sudo docker run -d -P crystal/ssh 

當我嘗試一下容器sudo docker ps,我看到端口:

0.0.0.0:49154->22tcp 

如果我ifconfig主機(Ubuntu的),我看到docker0 INET地址:172.17.42.1。我可以從我的主機ping這個,但不能從任何其他機器。我在設置容器看外部世界時做錯了什麼?謝謝。

編輯:

我已經試過檢查容器的ip地址,我看到ip地址:172.17.0.28,但我不能平,要麼...

如果我嘗試NMAP,這似乎返回港口。那麼這是否意味着它是開放的,如果我有ssh設置,我應該能夠ssh進入它?謝謝。

nmap -p 49154 10.211.55.1顯示端口未知服務打開。

我試圖通過SSH -l -p根49154 10.211.55.1以SSH方式,我得到

Read from socket failed: Connection reset by peer. 
+0

您是否嘗試連接到端口49154上的主機的公共IP地址?我的意思是eth0接口的IP地址? – Jiri 2014-10-09 20:36:58

+0

@Jiri我嘗試過'nmap -p 49154 '並且返回:'49155/tcp,open,service unknown' – Crystal 2014-10-09 21:01:10

回答

1

UPDATE

你Dockerfile是錯誤的。你的sshd配置不正確,啓動不正確,這就是容器沒有正確響應端口22的原因。請參閱錯誤:

Could not load host key: /etc/ssh/ssh_host_rsa_key 
Could not load host key: /etc/ssh/ssh_host_dsa_key 

您需要生成主機密鑰。這條線路將做魔術:

RUN ssh-keygen -P "" -t dsa -f /etc/ssh/ssh_host_dsa_key 

以前的答案

你可能需要查看eth0接口的IP地址(即從網絡訪問),你需要通過此連接到您的容器IP地址。來自/去往docker0網橋的流量應該默認轉發到您的eth接口。

此外,你最好檢查是否啓用了IP轉發:

cat /proc/sys/net/ipv4/ip_forward 

這個命令應該返回1,否則你應該執行:

sudo echo 1 > /proc/sys/net/ipv4/ip_forward 

問:爲什麼你可以這種方式連接到容器?

如果啓用了IP轉發,則從eth0接口接收的數據包將轉發到虛擬docker0接口。魔術發生並且包在正確的容器中被接收。請參閱Docker Advanced Networking瞭解更多詳情:

但是docker0不是普通接口。它是一個虛擬以太網橋,它可以在連接到它的任何其他網絡接口之間自動轉發分組。這允許容器與主機通信並且彼此通信 。每次Docker創建一個容器時,它都會創建一對「對等」接口,如管道的相對兩端,即 - 在另一個上發送的數據包將收到 。它使容器中的一個對等體成爲它的eth0接口,並將另一個對等體與唯一的名稱(如 vethAQI2QT)保持在主機的命名空間中。通過將每個 veth *接口綁定到docker0橋接器,Docker創建一個在主機和每個Docker容器之間共享的虛擬子網 。

+0

我將如何連接到eth0地址的容器的IP地址?假設碼頭的IP爲172.17.42.5,eth0爲10.211.55.1,那麼我如何從外部連接?順便說一下,我試圖從碼頭文檔中進行掃描。 (http://docs.docker.io.s3-website-us-west-2.amazonaws.com/examples/running_ssh_service/)。 ip_forward確實返回1. – Crystal 2014-10-09 20:56:04

+0

@Crystal您無法從外部連接到「容器IP地址」,但(僅)到eth0的特定主機端口的數據包將被轉發到容器特定的端口。我已經更新了我的答案。 – Jiri 2014-10-09 23:19:17

0

您不能ping從主機之外172.17.42.1,因爲它是一個專用IP,因此只能在專用網絡中訪問,因爲它是由運行碼頭集裝箱的主機創建的,虛擬交換機docker0和附加虛擬接口的橋接碼頭0的碼頭集裝箱...

此外,172.17.42.1是網橋docker0的ip,而不是您的docker實例的ip。如果你想知道docker實例的ip,你必須在裏面運行ifconfig,或者你可以使用docker inspect

我不是端口映射方面的專家,但在我看來,這意味着要訪問Docker容器端口22必須連接到主機的端口49154,並且所有通信都將被轉發。

+0

我更新了我的問題,但我試圖從'inspect'命令ping ip,然後繼續請求超時。 – Crystal 2014-10-09 20:27:14

+0

從外面你總是會得到請求超時的ping,因爲它是一個私人地址。如果您運行另一個碼頭集裝箱,則每個碼頭工都可以ping另一個碼頭集裝箱,但是沒有主機可以從外面ping它們。至於'ssh'命令,我認爲Jiri的答案可能是解決方案。 – mgaido 2014-10-10 11:57:21