2017-04-04 96 views
0

我已經學會了,用於使用docker run時,通過添加一些參數,在泊塢窗容器的外部環境下,運行一臺服務器,有可能端口轉發到主機。搬運工容器內部服務器應用

雖然我的問題不同,但我有一些應該在Docker容器中運行的應用程序,並且應該在使用網絡的自己之間通信,但它們都在容器上運行。

是否有可能在碼頭集裝箱上運行這些內部服務器並使用localhost:PORT進行通信,請參閱「容器的IP地址」localhost(或127.0.0.1)?

+0

每個應用程序在單獨的容器中運行,或者它們都在一個容器中運行? – shizhz

回答

2

localhost一個容器內將解決這個容器的網絡堆棧。因此,如果您的所有服務器都運行在同一個容器中,則它們將使用相同的網絡堆棧,並且可以通過localhost與對方通信。

docker run -it --rm alpine:3.5 sh 
/# apk add --no-cache py-pip 
/# pip install Flask 
/# cat > flask_server.py << EOS 
from flask import Flask 
app = Flask(__name__) 

@app.route("/") 
def hello(): 
    return "Hello World!" 

if __name__ == "__main__": 
    app.run() 
EOS 
/# python flask_server.py & 
/# * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) 
/# telnet localhost 5000 
GET/

127.0.0.1 - - [04/Apr/2017 12:26:04] "GET /" 200 - 
Hello World!Connection closed by foreign host 

也就是說,如果兩個容器不共享網絡協議棧 - 這通常是這種情況 - 他們將無法通過localhost彼此通信。

1

如果您計劃在一個碼頭集裝箱內運行所有應用程序,請不要這樣做。使用Docker的目的之一是將應用程序彼此隔離,將所有這些應用程序放入一個容器中將帶來更多麻煩而不是優點,例如,如果您只想升級其中一個應用程序,則會變得更加困難。

如果您確實需要/必須將它們放入一個容器中,然後使用localhost:port就可以讓它們相互通信,就像它們在一臺機器上運行一樣。

如果您決定在分開的容器中運行它們,甚至可能在多臺機器上運行它們,則此問題將發生在多容器通信上,這是一個很大的話題。你有這些選項包括:

  • 多克多主機的網絡,基本上你需要一些搬運工網絡驅動程序跨多臺主機連接的碼頭工人一起,然後容器可以通過容器或主機名相互連接例如

    有不少是資源講到這裏,你可以參考以下鏈接,瞭解更多信息:

  • 跳過碼頭多主機n網絡,將您的服務端口映射到隨機主機端口,然後使用一種service discovery服務來促進通信。實際上,在我們公司,我們使用Mesos來管理集羣,marathon來部署我們的服務,然後Bamboo作爲服務發現和LB,他們一起工作得非常好。

這是我的一些想法分享,希望能對您有所幫助。

+1

我會完全避免編織。對吞吐量的衝擊很小。如果您查看覆蓋網絡,則您的操作與法蘭絨(VPXLAN或第2層)處於同一級別,因此它們將是更好的選擇。好帖子,我不能同意更多。 – Dockstar