Если вы используете Docker , вы должны знать, что он имеет архитектуру клиент-сервер. Существует инструмент командной строки docker , который отправляет все команды ( build , pull , run т. Д.) В API Docker Host; инструмент командной строки — просто элегантная оболочка, поэтому вам не нужно делать необработанные HTTP-вызовы самостоятельно.
Эта архитектура дает очень удобную развязку. Например, вы можете docker клиенту Docker отправлять команды удаленному Docker-демону, а не команде localhost. Более того, благодаря этой архитектуре все виды программного обеспечения могут интегрироваться с Docker, что и делает Comdor , один из моих проектов. Тем не менее, я остановился на шоу-шопе, и его разработка в настоящее время приостановлена, ожидая выхода первой версии docker-java-api .
Уже есть две реализации Java клиента docker : docker-java / docker-java и spotify / docker-client , так почему еще одна?
Первая причина в том, что ни один из них не является объектно-ориентированным. На самом деле они не API, а SDK. С моей точки зрения, разница между SDK и API заключается в следующем: SDK — это набор классов / инструментов, которые пользователь должен собрать для создания чего-либо; API, с другой стороны, должен представлять собой набор интерфейсов для уже построенной системы, который должен быть быстрым и интуитивно понятным — в идеале, я должен быть в состоянии изучить Docker, используя оболочку Java, так же легко, как и Docker. играя с клиентом командной строки.
Две вышеупомянутые библиотеки являются SDK, потому что они имеют практически нулевую инкапсуляцию, и пользователь должен знать, как соединить эти инструменты для реализации docker в Java. Например, в этих библиотеках я понятия не имею, куда должны идти объекты типа Port или ExposedPort или в чем разница между ними. Есть также классы, такие как HostConfig и PortBinding .
Позвольте мне задать вам вопрос: когда вы впервые начали использовать Docker (или какое-либо другое приложение), попросил ли он предоставить какие-либо порты, привязки или сервисные контексты? Нет, вы просто нажали кнопку или выполнили команду, вы использовали интерфейс . Конечно, в зависимости от сложности системы, у вас может быть возможность настроить ее, изменить некоторые настройки и т. Д., Но это должны быть расширенные опции, а не вещи, которые вы должны делать в большинстве случаев использования.
Суть в том, что они не очень удобны в использовании. Я хочу получить доступ к Docker из Java, а не собирать / собирать Docker в Java — надеюсь, вы почувствуете разницу.
Вторая причина (и на самом деле это была заторможенность шоу), из-за которой я решил написать новую, заключается в том, что оба они кажутся очень «толстыми». Они даже предупреждают вас о том, что могут вызвать проблемы с classpath (обе они содержат реализацию Jersey 2.x, которая, очевидно, несовместима с Jersey 1.x) — это вызвало проблемы в моем проекте, поскольку это Java EE, я даже не смог развернуть Приложение на Glassfish, оно вызвало некоторые очень странные исключения. Я перепробовал все виды обходных путей, включая затенение зависимостей , но ничего не получалось.
Итак, я решил создать свою собственную оболочку Java, которая должна быть:
- настолько свободно и интуитивно, насколько это возможно
- инкапсулирован — в идеале, только два открытых класса, все остальное скрыто за интерфейсами Java
- как можно меньше строителей
- чисто, его зависимости должны быть ясными и не вызывать конфликтов с другими платформами или платформами Java
Он все еще находится на ранней стадии, поэтому я могу лишь дать несколько советов о том, как это должно работать:
|
1
2
3
4
5
6
7
8
|
final Docker docker = new LocalDocker("unix:///var/run/docker.sock"); docker.containers().create( Json.createObjectBuilder()//JSON payload for creating a Container. .add(..., ...) .build() ); final Container container = docker.containers().get("containerId"); //... |
Выше описано, как вы будете общаться с местным Docker-демоном. Что интересно, мы должны реализовать HTTP-вызовы через сокет Unix. Для сокетов Unix в Java используется этот проект, и созданный Socket передается в Apache HttpClient.
Вот как вы могли бы сделать это с удаленным Docker Host:
|
01
02
03
04
05
06
07
08
09
10
11
|
final Docker docker = new RemoteDocker( "tcp://123.34.65.232:1234", "/path/to/ssl/certs" ); final Container created = docker.containers().create( Json.createObjectBuilder() .add(..., ...) .build() ); final Container existing = docker.containers().get("containerId"); //... |
За этим стоит простой HttpClient, нет Unix-сокетов, однако мы должны убедиться, что он использует эти сертификаты правильно, чтобы полностью зашифровать связь.
Видите ли, пользователь работает только с интерфейсами. Это свободно и не требует сомнительных объектов конфигурации или портов — по крайней мере, не для первого использования, может быть, мы могли бы как-то украсить эти реализации, чтобы дать больше возможностей для настройки пользователю.
Кроме того, он должен быть максимально интегрирован с языком. Например, вот как я хотел бы перебрать все контейнеры:
|
1
2
3
4
5
6
7
8
9
|
final Docker docker = new RemoteDocker( "tcp://123.34.65.232:1234", "/path/to/ssl/certs" ); final Containers containers = docker.containers(); for(final Container container : containers) { //Containers is the entry point of the Containers API //and also implements Iterable<Container> } |
Что вы думаете? Кажется ли это лучшей альтернативой? Если да, не стесняйтесь вносить свой вклад. Проект также управляется через Zerocracy, так что это хороший способ заработать очки репутации на платформе.
| Опубликовано на Java Code Geeks с разрешения MIhai Andronache, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Java API для Docker
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |
