首先,要保證你釋出端口的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>