我正在編寫兩個容器,其中一個使用Web服務,另一個使用數據庫。
這裏是我撰寫的文件:無法與羣集內的Docker容器和主機連接
version: '3.3'
services:
web:
image: microsoft/aspnetcore:1.1
container_name: web
ports:
- 5555:80
links:
- db
db:
image: microsoft/mssql-server-linux:rc1
container_name: db
ports:
- 1533:1433
environment:
- "ACCEPT_EULA=Y"
- "MSSQL_SA_PASSWORD=MyAdminPwd2017"
- "MSSQL_PID=Developer"
所以,從我的asp.net應用程序的核心在web
服務運行,我可以在db
只是用db
作爲主機訪問數據庫。但db
是不可見的從主機(我有一個默認橋網絡)。如果我檢查運行的db容器並找到它的ip地址,我可以從主機訪問我的數據庫,然後我可以連接到<ip>,1533
。
問題是,web
容器和主機都使用存儲訪問數據庫憑據的文件。所以我需要一種方法來命名db
,所以我可以從兩個世界訪問(在羣體內外,從我的主機)
有沒有辦法實現這一點?我嘗試在我的docker-compose
文件中定義一個主機網絡,並使兩個服務都使用該網絡,但我收到一條消息,說只有一個主機網絡可以定義。
編輯:試圖改善問題的標題,但我還是不相信,改進歡迎
從您的主機,您可以使用Access數據庫「本地主機:<暴露端口>」。您可以在主機中創建一個別名,從「localhost:」到「db」。這會幫助你嗎?通過建立主機網絡,您不會受益於容器網絡隔離。 –
Sreeni
謝謝,通過在我的主機(Windows)中創建別名,您的意思是在'C:\ Windows \ System32 \ drivers \ etc \ hosts'中創建一個條目,對吧?我真的不喜歡這樣做。如果我不關心容器網絡隔離並且希望容器和主機位於同一網絡中,該怎麼辦?我可以做到嗎? – sebagomez
在Docker內部,dns解析發生在Docker引擎的容器中,併爲未解析的名稱使用外部dns服務器。主機不知道Docker引擎的DNS數據庫。在你的情況下,你希望容器和主機具有相同的數據庫的DNS數據庫。最簡單的方法是主機別名,這似乎不適合你。我能想到的一種方式是使用外部DNS服務器(如consul)並將容器中的服務發佈到外部服務器,並使容器和主機都使用該DNS服務器。 – Sreeni