2014-11-09 15 views
7

Non riesco a capire come abilitare l'API remota quando si utilizza boot2docker. Sto cercando di utilizzare dockerode come segue:Abilitazione dell'API remota nel Docker su Mac OS X (boot2docker)

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

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

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

I dati sono nulli, nonostante ci sia un contenitore con l'id ''. Ho il sospetto che questo è perché non v'è alcuna /var/run/docker.sock sull'host OS X, e che avrei bisogno di usare qualcosa come:

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

... ma non riesco a capire come configurare boot2docker o finestra mobile nella VM VirtualBox per abilitare l'accesso tramite http o tcp.

risposta

3

Docker, come configurato da Boot2Docker, supporta l'accesso remoto sulla porta 2375 dal computer OSX host per impostazione predefinita; questo è ciò che viene impostato quando ti dice di fare export DOCKER_HOST=tcp://192.168.59.103:2375

Se si desidera accedere alla porta da un'altra macchina, è necessario configurare la rete VirtualBox per instradare il traffico verso quella porta. Questo potrebbe essere fatto da port forwarding con questo comando:

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

Poi l'indirizzo da utilizzare nel codice new Docker è l'indirizzo IP del vostro Mac.

È inoltre possibile configurarlo nella GUI di VirtualBox in boot2docker-vm/settings/network/advanced/port forwarding.

Vedere VirtualBox docs.

Nota, come descritto in here che ora consente a chiunque abbia un accesso IP alla propria macchina di controllare l'installazione del Docker, il che può essere un problema di sicurezza.

+0

Grazie Bryan. Un'altra cosa che sto cercando di capire è come usare l'arricciatura per parlare con l'API docker. Avete alcuni suggerimenti? – akshayl

+0

meglio chiederlo come una domanda separata. – Bryan

3

Nella versione corrente di boot2docker (1.3.1) si può fare questo da solo il montaggio di un volume al contenitore, ad esempio:

$ 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! 

IMHO questo è più semplice e più pulito di fare in giro con il port forwarding VirtualBox

Questo è in realtà lo stesso del modo in cui vengono definiti la maggior parte degli esempi di utilizzo di un client API Docker, ad esempio "basta montare il socket docker nel contenitore come volume".

Forse come me hai pensato a causa del modo in cui funziona boot2docker questo non sarebbe possibile. Dopotutto, sembra che le versioni recenti siano configurate per condividere i volumi dal proprio host OS X anziché dal vm boot2docker, che è ciò che si vorrebbe la maggior parte del tempo. Ma non c'è il percorso /var/run/docker.sock sul tuo host OS X, quindi cosa sta succedendo?

Quello che effettivamente accade è che la dir /Users viene montata dall'host nel vm boot2docker. Quando aggiungi un volume a un contenitore sotto boot2docker, continua a condividere qualsiasi cosa si trovi su quel percorso nel vm ... succede solo che qualsiasi percorso sotto /Users nel VM sia montato dall'host. Ma qualsiasi percorso al di fuori di /Users sarà dal vm boot2docker stesso e non dal tuo host.

, ad es.

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

c'è il nostro file di socket finestra mobile, e dal momento che è al di fuori della directory /Users possiamo collegare questa strada nelle nostre contenitori come volume.

(per qualche motivo questo non funziona:

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

... il file di socket viene fuori come una directory /var/run/docker.sock/ nel nostro contenitore - sembra come un insetto finestra mobile.)

Abbiamo per utilizzare il modulo separata da due punti:

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

per tutti quelli che si imbatte in tale questione, la maggior parte del tempo che si desidera disabilitare TLS quando si utilizza qualcosa come boot2docker - che è Bui ld per dev e testing solo (donno perché boot2docker ha preso la decisione di abilitare TLS per impostazione predefinita) Impedisce l'accesso all'API remota utilizzando in modo semplice come ogni strumento REST a cui è possibile pensare perché nessuno di essi supporta l'autenticazione basata su TLS senza molta configurazione

Quindi, se si desidera solo per sviluppare all'interno boot2docker, eseguire questo nella console 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 

Sarà disabilitare TLS e riavviare il demone finestra mobile. Una volta fatto, dovresti essere in grado di aprire http://your-boot2docker-ip:2375/info e ottenere un po 'di output. Si noti che questo è il boot2docker 1.41. Il nome della variabile env sostituita dal comando sed sopra può cambiare in futuro. Forse disabiliteranno anche TLS di default nelle versioni future.

+0

dopo due giorni ho finalmente ottenuto l'API grazie al tuo post! grande grazie da parte mia! – pregmatch

+0

significa che devo accedere a API da https per l'impostazione predefinita della finestra mobile? – pregmatch

+0

L'uso di https non funzionerà in quanto la finestra mobile non utilizza l'autenticazione di base ma l'autenticazione del client basata su CERT. – masi