2014-11-09 4 views
7

Я не могу понять, как включить удаленный API при использовании boot2docker. Я пытаюсь использовать dockerode следующим образом:Включение удаленного API в Docker в 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 

данных является пустым, несмотря на наличие контейнера с идентификатором «». Я подозреваю, что это потому, что нет /var/run/docker.sock на OS X хозяина, и что я должен был бы использовать что-то вроде:

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

... но не могу понять, как настроить boot2docker или docker в виртуальной виртуальной машине для включения доступа через http или tcp.

ответ

3

Docker, сконфигурированный Boot2Docker, поддерживает удаленный доступ к порту 2375 с главной машины OSX по умолчанию; это то, что настроено, когда он говорит вам делать export DOCKER_HOST=tcp://192.168.59.103:2375

Если вы хотите получить доступ к порту с другого компьютера, вам необходимо настроить виртуальную сеть VirtualBox для маршрутизации трафика на этот порт. Это может быть сделано путем перенаправления портов с помощью этой команды:

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

Тогда адрес для использования в new Docker коде является IP-адрес вашего Mac.

Вы также можете настроить это в графическом интерфейсе VirtualBox под загрузкой boot2docker-vm/settings/network/advanced/port.

См. VirtualBox docs.

Обратите внимание, что это означает, что теперь это позволяет любому пользователю, имеющему доступ к IP-адресу, управлять вашей установкой Docker, что может быть связано с безопасностью.

+0

Спасибо Брайан. Другое дело, что я изо всех сил пытаюсь понять, как использовать завиток, чтобы поговорить с API докеров. У вас есть несколько указателей? – akshayl

+0

лучший спросив это как отдельный вопрос. – Bryan

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 порт

Это на самом деле то же самое, что и большинство примеров использования клиента Docker API, то есть «просто подключите гнездо докера в контейнер в качестве тома».

Возможно, мне понравилось, что, по-моему, из-за работы boot2docker это было бы невозможно. В конце концов, похоже, что последние версии настроены для обмена томами с вашего хоста OS X, а не с boot2docker vm, чего вы хотели бы большую часть времени. Но на вашем хосте OS X нет пути /var/run/docker.sock, так что происходит?

На самом деле происходит то, что редуктор /Users установлен с вашего хоста в boot2docker vm. Когда вы добавляете том в контейнер под boot2docker, он по-прежнему делится тем, что находится на этом пути в vm ... просто случается, что любые пути под /Users в vm монтируются с хоста. Но любые пути вне /Users будут из самого boot2docker vm, а не вашего хоста.

i.e.

$ 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 ошибка.)

У нас есть использовать разделенные двоеточия формы:

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

для всех, что работает в этот вопрос, большая часть времени вы хотите отключить TLS при использовании что-то вроде boot2docker - что Буй ld для dev и тестирования (donno, почему boot2docker принял решение включить TLS по умолчанию) Это не позволит вам получить доступ к удаленному API, используя, как обычно, каждый инструмент REST, о котором вы можете думать, потому что ни один из них не поддерживает аутентификацию на основе 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 и перезапустить Docker Deamon. После этого вы сможете открыть http://your-boot2docker-ip:2375/info и получить некоторый результат. Обратите внимание, что это как boot2docker 1.41. Имя переменной env, отраженное командой sed выше, может измениться в будущем. Возможно, они даже отключат TLS по умолчанию в будущих выпусках.

+0

через два дня я наконец получил работу api благодаря вашему сообщению! Большое спасибо от меня! – pregmatch

+0

Это означает, что мне нужно получить доступ к api из https для настройки по умолчанию для докеров? – pregmatch

+0

Просто использование https не будет работать, поскольку докер не использует базовую аутентификацию auth, но аутентифицирует сертификат на основе сертификата. – masi

Смежные вопросы