2016-11-24 43 views
0

從我的碼頭集裝箱我想訪問我的主機上運行的MySQL服務器127.0.0.1。我想從主機訪問在我的容器容器上運行的Web服務器。我嘗試這樣做:碼頭:容器和主機端口的相互訪問

docker run -it --expose 8000 --expose 8001 --net='host' -P f29963c3b74f 

但沒有端口顯示爲暴露:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
093695f9bc58  f29963c3b74f  "/bin/sh -c '/root/br" 4 minutes ago  Up 4 minutes       elated_volhard 
$ 
$ docker port 093695f9bc58 

如果我沒有做--net='host',端口都暴露出來,我可以在訪問Web服務器容器。

主機和容器如何互相訪問其他端口?

回答

0

--expose定義:

容器內的端口號碼(其中服務偵聽)不 不需要匹配(暴露在 容器的外部端口號,其中客戶端連接)。例如,在容器 內,HTTP服務正在端口80上偵聽(因此圖像開發人員 在Dockerfile中指定了EXPOSE 80)。在運行時,端口可能是 綁定到主機上的42800。要查找主機端口 與外露端口之間的映射,請使用docker端口。

隨着--net=host

--network =「宿主」給出了容器完全訪問本地系統服務,如d-總線,因此被認爲是不安全的。

在這裏你沒有任何「端口」,因爲你有所有的端口爲主機打開。

如果你不想使用host網絡,你可以從碼頭工人容器訪問主機端口與搬運工人接口
- How to access host port from docker container
- From inside of a Docker container, how do I connect to the localhost of the machine?

當您想從主機訪問容器時,您需要將端口發佈到主機接口。

-P選項將所有端口發佈到主機接口。 Docker 將每個暴露端口的綁定到主機上的隨機端口。 端口的範圍在 /proc/sys/net/ipv4/ip_local_port_range定義的臨時端口範圍內。使用-p標誌明確地 映射單個端口或端口範圍

總之,當你定義的只是--expose 8000端口不暴露給8000,而是暴露給一些隨機端口。當你想讓端口8000對主機可見時,你需要映射發佈的端口-p 8000:8000

+0

我正在測試的東西,所以我很確定docker使用主機上的一個隨機端口。從程序員的帖子看來,當使用''--net = host'''時,你不能公開/映射端口。 – user2233706

+0

@ user2233706當然,使用'--net = host'時不能暴露端口(這沒有意義 - 這就是爲什麼你在「端口」列沒有任何內容)。當你不'發佈'端口你的主機如何知道暴露端口例如。 '8000-> XXXX'?主機上的端口應該用'docker0'接口(分別爲'IP')訪問。 – VladoDemcak

0

Docker的網絡模型是爲您的容器創建一個新的網絡名稱空間。這意味着容器獲得自己的127.0.0.1。如果您希望容器到達僅在主機上的127.0.0.1上偵聽的mysql服務,您將無法訪問它。

--net=host會將您的容器放入與主機相同的網絡名稱空間中,但這並不可取,因爲它實際上關閉了docker所具有的所有其他網絡功能 - 您無法隔離, t獲取端口公開/發佈等。

最好的解決方案可能是讓你的mysql服務器監聽一個可以從docker容器路由的接口。

如果你不想讓MySQL監聽你的公共接口,你可以創建一個網橋接口,給它一個隨機IP(確保你沒有任何衝突),將它連接到什麼也沒有,並配置mysql只能監聽那個ip和127.0.0.1。例如:

sudo brctl addbr myownbridge 
sudo ifconfig myownbridge 10.255.255.255 
sudo docker run --rm -it alpine ping -c 1 10.255.255.255 

該IP地址可以從您的主機和在該主機上運行的任何容器進行路由。

另一種方法是容器化你的mysql服務器。您可以將它放在與其他容器相同的網絡上並以此方式實現。您甚至可以將其端口3306發佈到主機的127.0.0.1接口。

+1

根據[this](http://serverfault.com/questions/139323/mysql-bind-to-more-than-one-ip-address),您不能讓MySQL偵聽多個IP地址。我的腳本工作正常,但是當我在''my.cnf'''中設置'''bind-address = 10.255.255.255''時,我仍然無法連接到MySQL服務器。 – user2233706

+0

我將在一個容器中運行MySQL。 – user2233706

+0

你還需要配置mysql來監聽該ip。 – programmerq

相關問題