2014-11-09 51 views
7

我似乎無法弄清楚如何在使用boot2docker時啓用遠程API。我試圖使用dockerode如下:在Mac OS X上啓用Docker中的遠程API(boot2docker)

Docker = require('dockerode') 
docker = new Docker(socketPath: "/var/run/docker.sock") 

container = docker.getContainer('<my_container_id>') 

container.inspect (err, data) -> 
    debug data 

儘管存在一個id爲''的容器,但數據爲空。我懷疑這是因爲在OS X主機上沒有/var/run/docker.sock,而且我會需要使用類似:

var docker2 = new Docker({host: 'http://192.168.1.10', port: 3000}); 

...但無法弄清楚如何在VirtualBox VM中配置boot2docker或docker以啓用通過http或tcp訪問。

回答

3

默認情況下,由Boot2Docker配置的Docker支持從主機OSX機器的端口2375 遠程訪問;這是它告訴你要做的事export DOCKER_HOST=tcp://192.168.59.103:2375

如果你想從另一臺機器訪問端口,你需要配置VirtualBox網絡來將流量路由到該端口。這可以通過端口轉發來完成這個命令:

VBoxManage modifyvm "boot2docker-vm" --natpf1 "guestssh,tcp,,2375,,2375" 

然後地址在您new Docker代碼中使用的是Mac的IP地址。

您可以在VirtualBox的GUI下boot2docker-VM /設置/網絡/高級/端口轉發也對此進行配置。

參見VirtualBox docs

注意,所描述的here,這現在允許任何人以IP訪問您的計算機來控制你的碼頭工人的安裝,這可能是一個安全問題。

+0

謝謝布萊恩。我正在努力解決的另一件事是如何使用curl與docker API交談。你有沒有一些指針? – akshayl 2014-11-22 03:12:28

+0

最好問,作爲一個單獨的問題。 – Bryan 2014-11-22 08:04:28

3

在boot2docker(1.3.1)的最新版本,你可以只安裝一個體積容器,如做到這一點:

$ docker run -it -v /var/run/docker.sock:/home/docker.sock myimage bash 
[ [email protected]:~ ]$ ls /home 
docker.sock 

Docker = require('dockerode') 
docker = new Docker(socketPath: "/home/docker.sock") 
// should work! 

恕我直言,這是比VirtualBox的端口轉發

亂搞簡單和清晰

這實際上是如何使用泊塢窗API客戶端的大多數例子闡述,即「只是泊塢窗插座安裝到容器的體積」是一樣的。

也許你像我一樣認爲,由於boot2docker工作,這將是不可能的方式。畢竟,最近的版本似乎設置爲從您的OS X主機共享卷,而不是boot2docker虛擬機,這是您大多數時間想要的。但是OS X主機上沒有/var/run/docker.sock路徑,那麼發生了什麼?

實際上會發生什麼情況是,/Users DIR是從主機到boot2docker VM安裝。當你下boot2docker它仍然是共享無論是在虛擬機這條道路添加捲到容器......它只是發生在虛擬機/Users下的任何路徑從主機安裝。但/Users以外的任何路徑將來自boot2docker虛擬機本身,而不是您的主機。

$ boot2docker ssh 
[email protected]:~$ ls /var/run 
acpid.pid  acpid.socket  docker.pid  docker.sock  sshd.pid   udhcpc.eth0.pid udhcpc.eth1.pid utmp 

有我們的搬運工套接字文件,因爲它是/Users目錄外,我們可以在路徑鏈接到我們的容器爲卷。

(出於某種原因,這不起作用:

$ docker run -it -v /var/run/docker.sock 

...套接字文件出來在我們的容器/var/run/docker.sock/目錄 - 似乎是一個碼頭工人的錯誤。)

我們有使用冒號分隔形式:

$ docker run -it -v /var/run/docker.sock:/home/docker.sock 
5

對於大家,運行到這個問題,大部分的時間你想使用類似boot2docker時禁用TLS - 這是BUI ld僅用於開發和測試(不知道爲什麼boot2docker默認啓用TLS的決定) 它會阻止您像使用每個可以考慮的REST工具那樣基本訪問遠程API,因爲它們都不支持基於TLS的身份驗證很多配置。

所以,如果你只是想boot2docker內發展,在您的boot2docker控制檯運行此:

cp /etc/init.d/docker ~/docker.bak 
sudo sed -i 's/DOCKER_TLS:=auto/DOCKER_TLS:=no/1' /etc/init.d/docker 
sudo /etc/init.d/docker stop 
sudo /etc/init.d/docker start 

這將禁用TLS並重新啓動泊塢窗守護進程。一旦完成,你應該能夠打開http://your-boot2docker-ip:2375/info並獲得一些輸出。請注意,這是boot2docker 1.41的版本。以上sed命令重新提供的env變量的名稱可能會在未來發生變化。也許他們甚至會在未來版本中默認禁用TLS。

+0

兩天後我終於得到了API工作謝謝你的帖子!非常感謝我! – pregmatch 2015-01-18 23:29:02

+0

這是否意味着我必須從https訪問api以進行docker默認設置? – pregmatch 2015-01-18 23:38:16

+0

由於docker沒有使用基本身份驗證,而是使用基於證書的客戶端身份驗證,因此只使用https將不起作用。 – masi 2015-01-20 20:28:21