[英]How to access a docker container running on MacOSX from another host?
我正在嘗試開始使用docker並想要運行Ubiquiti視頻控制器 。 我已經安裝了Docker Toolbox並設法讓容器在我的Yosemite主機上運行,並且可以通過訪問docker-machine ip default
返回的IP在同一台mac上訪問它。 但我想在網絡上的其他機器上訪問它,並最終在我的家用路由器上設置端口轉發,以便我可以在我的家庭網絡之外訪問它。
正如boot2docker問題160中所建議的那樣 ,使用Virtualbox GUI我能夠添加橋接網絡適配器,但在重新啟動VM之后, docker-machine
無法再與VM連接。 docker env default
掛起很長時間但最終會返回一些環境變量以及消息Maximum number of retries (60) exceeded
。 當我使用這些變量設置shell並嘗試運行docker ps
我收到錯誤: An error occurred trying to connect: Get https://10.0.2.15:2376/v1.20/containers/json: dial tcp 10.0.2.15:2376: network is unreachable
。
我懷疑docker-machine對VM中的網絡配置有一些假設,我正在弄亂他們。
docker-machine ssh ifconfig -a
返回以下內容:
docker0 Link encap:Ethernet HWaddr 02:42:86:44:17:1E
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
dummy0 Link encap:Ethernet HWaddr 96:9F:AA:B8:BB:46
BROADCAST NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth0 Link encap:Ethernet HWaddr 08:00:27:37:2C:75
inet addr:192.168.1.142 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe37:2c75/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2996 errors:0 dropped:0 overruns:0 frame:0
TX packets:76 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:278781 (272.2 KiB) TX bytes:6824 (6.6 KiB)
Interrupt:17 Base address:0xd060
eth1 Link encap:Ethernet HWaddr 08:00:27:E8:38:7C
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fee8:387c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:767 errors:0 dropped:0 overruns:0 frame:0
TX packets:495 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:122291 (119.4 KiB) TX bytes:116118 (113.3 KiB)
eth2 Link encap:Ethernet HWaddr 08:00:27:A4:CF:12
inet addr:192.168.99.100 Bcast:192.168.99.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fea4:cf12/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:430 errors:0 dropped:0 overruns:0 frame:0
TX packets:322 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:53351 (52.1 KiB) TX bytes:24000 (23.4 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth0
似乎從我的路由器獲得一個合理的DHCP地址。
我不確定這是否是正確的方法,或者我是否正在咆哮錯誤的樹。 如果我可以在虛擬機上運行橋接網絡適配器,我不知道如何說服我的docker容器使用它。 我試過在互聯網上搜索高低。 我找到了幾十個網站,解釋了如何使用docker-machine ip default
而不是localhost
來訪問容器,但沒有解釋如何從其他主機訪問。 也許我需要提高我的谷歌搜索技巧。
這對我有用
檢查docker-machine ls是否正常
好的,所以我找到了比嘗試使用橋接網絡適配器更好的方法。 我在boot2docker文檔中發現了端口轉發 。
只需使用VBoxManage modifyvm default --natpf1 "my_web,tcp,,8080,,80"
或使用VirtualBox GUI指定NAT適配器的端口轉發。
然后,從--net=host
run命令中刪除-p
選項並使用--net=host
。 那不是
docker run -d -p 8080:80 --name=web nginx
使用
docker run -d --net=host --name=web nginx
瞧! 您的Web服務器位於主機上的localhost:8080或您的LAN上其他位置的YOURHOSTIP:8080。
請注意,使用--net=host
可能會--net=host
VM上容器之間的通信,但由於這是我計划運行的唯一容器,因此對我來說非常--net=host
。
在使用Docker Toolbox for Mac的計算機上,我解決了以下問題(使用default
計算機)。
制備
如果機器正在運行則停止:
docker-machine stop default
VirtualBox設置
打開VirtualBox,選擇default
機器,打開設置( Cmd-S
),轉到網絡,然后選擇“適配器3”。
選中“啟用網絡適配器”(將其打開)。
Docker設置
現在,回到終端,啟動機器:
docker-machine start default
以防萬一,重新生成證書:
docker-machine regenerate-certs default
更新環境:
eval $(docker-machine env default)
此時,計算機應該正在運行(默認IP地址為192.168.99.100,只能從托管Mac訪問)。 但是,如果您進入docker VM( docker-machine ssh default
)並運行ifconfig -a
,您將看到其中一個VM的接口(在我的情況下為eth0
)在與Mac相同的網絡中具有IP(例如192.168.0.102),可從LAN上的其他設備訪問。
路由器設置
現在,最后一步是確保此地址已修復,並且路由器的DHCP不會隨時更改。 這可能因路由器而異,以下內容適用於我的簡潔TP-LINK路由器,但應該可以輕松調整到其他品牌和型號。
打開路由器設置,首先使用上面步驟7中的MAC地址檢查路由器的DHCP客戶端列表中的default
。
在路由器設置中打開“DHCP”>“地址預留”,並添加“適配器3”MAC地址(您可能必須插入缺失的短划線),並在那里添加所需的IP(例如192.168.0.201)。
現在我的路由器要求我重新啟動它。 重新啟動后,運行docker-machine restart default
以使Docker VM獲取其新IP地址。
最終驗證: docker-machine ssh default
,然后是ifconfig -a
,並在輸出中找到你的新IP地址(這次接口是eth1
)。
結果
從托管Mac可以通過兩個地址(192.168.99.100和192.168.0.201)訪問該機器; 從LAN中的其他設備可以訪問192.168.0.201。
這個問題的主要用例是從主機(Mac)機器或主機(Mac)網絡中的其他機器訪問容器中運行的應用程序
一旦容器應用程序啟動並暴露如下
docker run -d -p 8080 <<image-name>>
然后找到主機(Mac)端口與容器端口之間的映射,如下所示
docker port <<container-name>>
sample output : 8080/tcp -> 0.0.0.0:32771
現在從主機(Mac)網絡中的任何計算機訪問容器應用程序作為主機(Mac IP):32771
如果我將第一個網卡從NAT
更改為網橋,我也無法連接到它。
我發現工作的是添加第三張網卡,將其設置為橋接模式並將適配器類型更改為Intel PRO/1000 MT Desktop (82540EM)
。 boot2docker
發行版可能不支持默認值。
在github上查看我的評論 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.