Активиране на отдалечен API в Docker на Mac OS X (boot2docker)

Изглежда не мога да разбера как да активирам отдалечения API, когато използвам boot2docker. Опитвам се да използвам dockerode, както следва:

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

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

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

Данните са нулеви, въпреки че има контейнер с id ''. Подозирам, че това е така, защото няма /var/run/docker.sock на хоста на OS X и че ще трябва да използвам нещо като:

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

... но не мога да разбера как да конфигурирам boot2docker или docker във VirtualBox VM, за да активирам достъп чрез http или tcp.


person akshayl    schedule 09.11.2014    source източник


Отговори (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.

Можете също да конфигурирате това в GUI на VirtualBox под boot2docker-vm/settings/network/advanced/port forwarding.

Вижте документи на VirtualBox.

Забележка, както е описано тук че това вече позволява на всеки с IP достъп до вашата машина да контролира вашата инсталация на Docker, което може да е проблем за сигурността.

person Bryan    schedule 09.11.2014
comment
Благодаря Браян. Друго нещо, което се мъча да разбера, е как да използвам curl, за да говоря с API на докера. Имате ли някои насоки? - person akshayl; 22.11.2014
comment
най-добре го задайте като отделен въпрос. - person Bryan; 22.11.2014

За всички, които се сблъскват с този проблем, през повечето време искате да деактивирате TLS, когато използвате нещо като boot2docker - което е създадено само за разработка и тестване (не защо 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 по подразбиране в бъдещи версии.

person omni    schedule 07.01.2015
comment
след два дни най-накрая накарах api да работи благодарение на публикацията ви! големи благодарности от мен! - person pregmatch; 19.01.2015
comment
това означава ли, че трябва да имам достъп до api от https за настройка по подразбиране на докер? - person pregmatch; 19.01.2015
comment
Простото използване на https няма да работи, тъй като докерът не използва основно удостоверяване, а клиентско удостоверяване, базирано на сертификат. - person omni; 20.01.2015
comment
Ще трябва да конфигурирате вашия https клиент - какъвто и да е той - да използва клиентско удостоверяване, базирано на сертификат, за да се случи TLS ръкостискането. Обикновено трябва да насочите своя https-клиент към клиентския сертификат, който сте създали в Docker. Предполагам, че повечето REST инструменти няма да имат поддръжка за такива неща. Може да опитате fiddler или нещо подобно - но не знам със сигурност дали предлагат удостоверяване, базирано на TLS клиентски сертификат. - person omni; 21.01.2015
comment
О, подробности за TLS, базиран на клиентски сертификат, можете да намерите тук technet.microsoft.com/en-us/library/cc783349(v=ws.10).aspx Ръководството за отдалечен API на Docker ви показва как да го направите с помощта на cURL и wget. Забавно: току-що намерих тази страница защо търся съвместими браузъри: browserauth.net/tls-client-authentication - person omni; 21.01.2015
comment
От последната версия вече можете да използвате удостоверяване само от страна на сървъра и по този начин да стартирате сървъра в ssl режим, без да е необходимо да удостоверявате вашите клиенти, вижте https://docs.docker.com/articles/https/ - Моля, имайте предвид, че това ще шифрова вашата http връзка чрез https (TLS), но няма да изисква удостоверяване. Така че всеки ще може да изпълнява докер команди. В момента Docker поддържа само удостоверяване с помощта на клиентски сертификати - което го прави доста трудно за прилагане, защото включва ръчни стъпки. - person omni; 14.02.2015

В текущата версия на boot2docker (1.3.1) можете да направите това, като просто монтирате том към контейнера, напр.

$ docker run -it -v /var/run/docker.sock:/home/docker.sock myimage bash
[ root@51c0518f4d42:~ ]$ ls /home
docker.sock

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

IMHO това е по-просто и по-чисто, отколкото да се забърквате с пренасочване на портове на VirtualBox

Това всъщност е същото като повечето примери за използване на Docker API клиент, т.е. „просто монтирайте докер сокета в контейнера като том“.

Може би като мен сте мислили, че поради начина, по който работи boot2docker, това няма да е възможно. В крайна сметка изглежда, че последните версии са настроени да споделят томове от вашия OS X хост, а не boot2docker vm, което бихте искали през повечето време. Но няма /var/run/docker.sock път на вашия OS X хост, така че какво става?

Това, което всъщност се случва е, че директорията /Users се монтира от вашия хост в boot2docker vm. Когато добавите том към контейнер под boot2docker, той все още споделя каквото и да е в този път във vm... просто се случва всички пътища под /Users във vm да се монтират от хоста. Но всички пътища извън /Users ще бъдат от самия boot2docker vm, а не от вашия хост.

i.e.

$ boot2docker ssh
docker@boot2docker:~$ 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
person Anentropic    schedule 04.12.2014