簡體   English   中英

如何從其他主機訪問在MacOSX上運行的docker容器?

[英]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來訪問容器,但沒有解釋如何從其他主機訪問。 也許我需要提高我的谷歌搜索技巧。

這對我有用

  • 停止的VM添加第3個“橋”網絡
  • 使用docker-machine start machine-name啟動VM
  • 使用docker-machine regenerate-certs machine-name重新生成證書

檢查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計算機)。

制備

  1. 如果機器正在運行則停止:

    docker-machine stop default

VirtualBox設置

  1. 打開VirtualBox,選擇default機器,打開設置( Cmd-S ),轉到網絡,然后選擇“適配器3”。

  2. 選中“啟用網絡適配器”(將其打開)。

  3. 將“附加到”設置為“橋接適配器”。
  4. 將名稱設置為“en0:Ethernet”(或任何主要網絡接口或Mac)。
  5. 披露“高級”,並確保選中“已連接電纜”。
  6. 注意“適配器3”的“MAC地址”(稍后我們將使用它)。
  7. 按“確定”保存設置。

Docker設置

  1. 現在,回到終端,啟動機器:

    docker-machine start default

  2. 以防萬一,重新生成證書:

    docker-machine regenerate-certs default

  3. 更新環境:

    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路由器,但應該可以輕松調整到其他品牌和型號。

  1. 打開路由器設置,首先使用上面步驟7中的MAC地址檢查路由器的DHCP客戶端列表中的default

  2. 在路由器設置中打開“DHCP”>“地址預留”,並添加“適配器3”MAC地址(您可能必須插入缺失的短划線),並在那里添加所需的IP(例如192.168.0.201)。

  3. 現在我的路由器要求我重新啟動它。 重新啟動后,運行docker-machine restart default以使Docker VM獲取其新IP地址。

  4. 最終驗證: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM