Я пытаюсь установить удаленную библиотеку API Docker-client (https://github.com/spotify/docker-client), чтобы выполнить некоторые поиски изображений и просмотреть данные изображений (все в публичных хранилищах). У меня загружена, установлена и запущена загрузочная VM boot2docker. Такие команды, как "Docker pull ubuntu", работают нормально, но я хотел бы сделать это с помощью программы Java сейчас. Я использовал плагин Eclipse IDE Egit для импорта проекта github и создал проект Maven/Java из существующей ветки мастера. Исходный код полностью импортирован и ошибок не сообщается. Затем я попробовал написать простой тест:
final DockerClient docker = DefaultDockerClient.fromEnv().build();
//docker.pull("busybox");
List<ImageSearchResult> results = docker.searchImages("ubuntu");
for (ImageSearchResult res : results) {
System.out.println(res.getName());
}
Однако при запуске кода в Eclipse я получаю следующую ошибку:
Exception in thread "main" com.spotify.docker.client.DockerException: java.util.concurrent.ExecutionException: javax.ws.rs.ProcessingException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect
at com.spotify.docker.client.DefaultDockerClient.propagate(DefaultDockerClient.java:1109)
at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:1028)
at com.spotify.docker.client.DefaultDockerClient.searchImages(DefaultDockerClient.java:653)
at com.spotify.docker.client.main.Test.main(Test.java:28)
Я попытался настроить сервер Apache на этом порту, но затем я получаю:
Exception in thread "main" com.spotify.docker.client.DockerRequestException: Request error: GET http://localhost:2375/v1.12/images/search?term=ubuntu: 404
at com.spotify.docker.client.DefaultDockerClient.propagate(DefaultDockerClient.java:1100)
at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:1028)
at com.spotify.docker.client.DefaultDockerClient.searchImages(DefaultDockerClient.java:653)
at com.spotify.docker.client.main.Test.main(Test.java:28)
Может ли кто-нибудь сказать мне, что я должен делать здесь, чтобы заставить мой поиск/вытащить вызов? Это моя первая попытка с Docker, и я просмотрел документацию и искал проблему, но не могу найти никого с аналогичной проблемой.
Спасибо!
EDIT: я запускаю докер в Windows 7 с помощью встроенного VM Boot2Docker. Может быть, демон Docker работает внутри, который недоступен из программ вне VM, таких как Eclipse?
РЕДАКТИРОВАТЬ: разрешил его, обновив v1.6 вместо v1.5, что делает демон доступным на хосте Windows. Текущая проблема заключается в том, что все мои вызовы API возвращаются "Сервер не смог ответить с допустимым ответом HTTP"
Я столкнулся с подобной проблемой, и мне удалось решить эту проблему, используя следующий способ создания DockerClient:
final DockerClient docker = DefaultDockerClient.builder()
.uri(URI.create("unix:///var/run/docker.sock"))
.build();
Я получал такое же исключение, но добавление вышеописанной части URI помогло мне решить проблему. Лучшее объяснение проблемы, аналогичной вышеизложенному и ее устранению, было предоставлено в следующем трекеру проблем.
Программа Java по существу представляет собой docker search
: она может работать только в среде, в которой присутствует механизм докеров.
Либо в виртуальной машине boot2docker.
Или на полном хосте Linux.
Я столкнулся с одной и той же проблемой на Mac с eclipse и Docker версии 1.10.3, я искал решение, прежде чем решился на обходной путь. Использование docker CLI docker-manager для создания нового виртуального бокса и получения DOCKER_HOST
и DOCKER_CERT_PATH
значения этого виртуального бокса и создать новый строитель.
В моем случае: я создал виртуальный блок по умолчанию2 с помощью команды CLI докере docker-machine create -d virtualbox default2
Docker CLI
$ docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.103:2376"
export DOCKER_CERT_PATH="/Users/XXXX/.docker/machine/machines/default2"
export DOCKER_MACHINE_NAME="default2"
Докер-клиент JAVA
DockerCertificates defaultCertificates = new DockerCertificates(Paths.get("/Users/XXXX/.docker/machine/machines/default2"));
DockerClient docker = DefaultDockerClient.builder()
.uri("https://192.168.99.103:2376")
.dockerCertificates(defaultCertificates)
.build();