Доступ к хосту докера из докерского контейнера (jenkins)
Мне нужно запустить команды Docker от Jenkins, который установлен в качестве контейнера на Docker. Моя локальная установка на OSX, и я использую boot2docker для виртуализации докера.
Я установил Дженкинс на докер просто docker run -d -p 8080:8080 --name jenkins jenkins
и работает нормально.
На jenkins я установил "Плагин Docker" https://wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin которому нужен URL-адрес DOCKER для доступа к API-интерфейсу докера.
Когда запускается boot2docker, я получаю следующее: DOCKER_HOST=tcp://192.168.59.103:2376
, так что я предполагаю, что на этом хосте / порте работает docker api?
На Дженкинс я установил поле URL DOCKER как http://192.168.59.103:2376
но я получаю следующую ошибку "shaded.org.apache.http.client.ClientProtocolException".
Кажется, что контейнер не может получить доступ к Docker-серверу boot2docker. Может быть, я что-то упускаю, но я не могу понять, какой правильный IP / порт я должен использовать.
Обновление: Подробнее
This is what I get when I start boot2docker:
bash-3.2$ unset DYLD_LIBRARY_PATH ; unset LD_LIBRARY_PATH
bash-3.2$ mkdir -p ~/.boot2docker
bash-3.2$ if [ ! -f ~/.boot2docker/boot2docker.iso ]; then cp /usr/local/share/boot2docker/boot2docker.iso ~/.boot2docker/ ; fi
bash-3.2$ /usr/local/bin/boot2docker init
WARNING: The 'boot2docker' command line interface is officially deprecated.
Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.
Docker Toolbox (https://docker.com/toolbox) is the recommended install method.
Virtual machine boot2docker-vm already exists
bash-3.2$ /usr/local/bin/boot2docker up
WARNING: The 'boot2docker' command line interface is officially deprecated.
Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.
Docker Toolbox (https://docker.com/toolbox) is the recommended install method.
Waiting for VM and Docker daemon to start...
...............oooooooo
Started.
Writing /Users/local/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/local/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/local/.boot2docker/certs/boot2docker-vm/key.pem
To connect the Docker client to the Docker daemon, please set:
export DOCKER_TLS_VERIFY=1
export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=/Users/local/.boot2docker/certs/boot2docker-vm
Or run: `eval "$(boot2docker shellinit)"`
bash-3.2$ $(/usr/local/bin/boot2docker shellinit)
Writing /Users/local/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/local/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/local/.boot2docker/certs/boot2docker-vm/key.pem
bash-3.2$ docker version
Client:
Version: 1.8.0
API version: 1.20
Go version: go1.4.2
Git commit: 0d03096
Built: Tue Aug 11 17:17:40 UTC 2015
OS/Arch: darwin/amd64
Server:
Version: 1.8.0
API version: 1.20
Go version: go1.4.2
Git commit: 0d03096
Built: Tue Aug 11 17:17:40 UTC 2015
OS/Arch: linux/amd64
Вот конфигурация jenkins для Облака:
3 ответа
Как @ISanych предлагает, вы можете просто сделать -v /var/run/docker.sock:/var/run/docker.sock
и он также будет волшебным образом работать на boot2docker. Нет необходимости определять DOCKER_URL
,
Вы также можете найти --net=host
полезно, если необходимо получить доступ к портам запущенных контейнеров.
Я столкнулся с точно такой же проблемой с моим плагином док-станции Jenkins. Docker по умолчанию использует tls, но подключаемый модуль docker поддерживает только http. Я отключил проверку TLS на док-машине. Моя докерская машина - Ubuntu, поэтому файл конфигурации докера находится под /etc/default/docker
, Внутри файла conf вы можете отключить TLS, добавив
--tls=false
в DOCKER_OPTS. Что-то вроде:
DOCKER_OPTS='-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --tls=false'
Вероятно, это должен быть комментарий к предыдущему ответу, но это не представляется возможным. Это всего лишь примечание, чтобы напомнить людям, что прослушивание 0.0.0.0 означает прослушивание любых публично маршрутизируемых интерфейсов, которые могут быть подключены к любому физическому или виртуальному сетевому интерфейсу, настроенному в вашей системе. Пруденс предлагает ограничить ваше воздействие только внутренней сетью, с меньшей вероятностью столкнуться с враждебными силами с злым умыслом.