天天看點

Mac使用Docker-machine通路docker publish port

首先,要保證你釋出端口的image已經run起來了。如果你是通過dockerfile build起來的image,注意在image裡面加上下面的一段話:

expose 80  

如果你需要釋出其他端口,隻需把80改變即可。

expose這個指令的意思是docker image釋出一個端口。

然後你需要将基于這個容器的image指定一個端口去綁定:

docker rum -p 80:80 -d your_image  

-p選項的含義是把80端口綁定在主機的80端口(這裡的“主機”指docker-machine或者boot2docker容器)

如果你不想在你的mac或者windows上通過http://localhost:80的方式去通路,到這就可以結束了。你可以通過你docker-machine或者boot2docker的ip去通路。

$docker-machine ip machine_name  

192.168.99.100  

這裡我就可以通過http://192.168.99.100:80去通路我釋出的image

step 2、configure virtualbox

大家都知道docker-machine和boot2docker本身是不能直接在mac或windows下運作的,它必須依附一個vm,這裡的vm就是virtualbox,如何讓我們在本機通路docker裡釋出的應用,這裡就需要打開virtualbox的port forwarding。

運作以下指令通過ssh去轉發osx/windows的80端口到boot2docker/docker-machine vm的80端口:

$ boot2docker ssh -vnntl *:80:localhost:80  

或者你可以設定virtualbox的參數來進行端口轉發:

$ vboxmanage modifyvm "boot2docker-vm" --natpf1 "tcp-port8000,tcp,,80,,80";  

如果你的vm還在running,你需要運作以下指令:

$ vboxmanage controlvm "boot2docker-vm" natpf1 "tcp-port8000,tcp,,80,,80";  

現在你可以通過localhost:80去通路了。

如果你有很多容器釋出同一個端口,你有必要使用docker的動态轉發

for example, running 3 nginx containers:

container-1 : 80 -> 49153 (i.e. docker run -p 49153:80 ...)  

container-2 : 80 -> 49154 (i.e. docker run -p 49154:80 ...)  

container-3 : 80 -> 49155 (i.e. docker run -p 49155:80 ...)  

使用vboxmanage modifyvm指令轉發49xxx端口。這種方法可以很容易做到同時轉發。

# vm must be powered off  

for i in {49000..49900}; do  

 vboxmanage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i";  

 vboxmanage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i";  

done  

如果需要删除釋出的端口,可以這麼做:

 vboxmanage modifyvm "boot2docker-vm" --natpf1 delete "tcp-port$i";  

 vboxmanage modifyvm "boot2docker-vm" --natpf1 delete "udp-port$i";  

另釋出jboss會發現外部無法通路,這是因為jboss應用隻對localhost有效,如果想讓外部通路,必須在啟動指令後面加上

<strong><span style="font-size:24px;">-b 0.0.0.0</span></strong>  

這樣就綁定了所有ip,不然隻有本機能夠進行通路。

本文參考:

<a target="_blank" href="https://github.com/boot2docker/boot2docker/blob/master/doc/workarounds.md">https://github.com/boot2docker/boot2docker/blob/master/doc/workarounds.md</a>

<a target="_blank" href="https://github.com/boot2docker/boot2docker/issues/976">https://github.com/boot2docker/boot2docker/issues/976</a>

<a target="_blank" href="https://fogstack.wordpress.com/2014/02/09/docker-on-osx-port-forwarding/">https://fogstack.wordpress.com/2014/02/09/docker-on-osx-port-forwarding/</a>