1概要

この記事では、もう1つ確立されたプラットフォーム固有のAPI –



Jocker for Docker



を見てみましょう。

この記事を通して、実行中のDockerデーモンと接続する方法、およびAPIがJava開発者に提供する重要な機能の種類について説明します。


2 Mavenの依存関係

まず、

pom.xml

ファイルに主な依存関係を追加する必要があります。

<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java</artifactId>
    <version>3.0.14</version>
</dependency>

この記事を書いている時点での** APIの最新バージョンは3.0.14です。各リリースはhttps://github.com/docker-java/docker-java/releases[GitHubリリースページ]またはhttps://search.maven.org/classic/#search%7Cgav%7C1から表示できます。 %7Cg%3A%22com.github.docker-java%22%20AND 20a%3A%22docker-java%22[Mavenリポジトリ]。


3 Dockerクライアントを使用する


DockerClient

は、Dockerエンジン/デーモンとアプリケーションとの間の接続を確立する場所です。

デフォルトでは、Dockerデーモンは

unix:///var/run/docker.sock

ファイルでのみアクセス可能です。他に設定されていない限り、私たちはUnixソケットをリッスンしているDockerエンジンとローカルに通信することができます。

ここでは、

DockerClientBuilder

クラスに適用して、デフォルト設定を受け入れて接続を作成します。

DockerClient dockerClient = DockerClientBuilder.getInstance().build();

同様に、2つのステップで接続を開くことができます。

DefaultDockerClientConfig.Builder config
  = DefaultDockerClientConfig.createDefaultConfigBuilder();
DockerClient dockerClient = DockerClientBuilder
  .getInstance(config)
  .build();

エンジンは他の特性に依存する可能性があるため、クライアントはさまざまな条件で構成することもできます。

例えば、BuilderはサーバーURLを受け入れます。つまり、エンジンがポート2375で使用可能であれば

接続値を更新できます

DockerClient dockerClient
  = DockerClientBuilder.getInstance("tcp://docker.baeldung.com:2375").build();

接続の種類に応じて、接続文字列の先頭に

unix://

または

tcp://

を付ける必要があることに注意してください。

さらに一歩進めば、

DefaultDockerClientConfig

クラスを使用して、より高度な設定を行うことができます。

DefaultDockerClientConfig config
  = DefaultDockerClientConfig.createDefaultConfigBuilder()
    .withRegistryEmail("[email protected]")
    .withRegistryPassword("baeldung")
    .withRegistryUsername("baeldung")
    .withDockerCertPath("/home/baeldung/.docker/certs")
    .withDockerConfig("/home/baeldung/.docker/")
    .withDockerTlsVerify("1")
    .withDockerHost("tcp://docker.baeldung.com:2376").build();

DockerClient dockerClient = DockerClientBuilder.getInstance(config).build();

同様に、

Properties

を使用して同じアプローチを実行できます。

Properties properties = new Properties();
properties.setProperty("registry.email", "[email protected]");
properties.setProperty("registry.password", "baeldung");
properties.setProperty("registry.username", "baaldung");
properties.setProperty("DOCKER__CERT__PATH", "/home/baeldung/.docker/certs");
properties.setProperty("DOCKER__CONFIG", "/home/baeldung/.docker/");
properties.setProperty("DOCKER__TLS__VERIFY", "1");
properties.setProperty("DOCKER__HOST", "tcp://docker.baeldung.com:2376");

DefaultDockerClientConfig config
  = DefaultDockerClientConfig.createDefaultConfigBuilder()
    .withProperties(properties).build();

DockerClient dockerClient = DockerClientBuilder.getInstance(config).build();

ソースコードでエンジンの設定を構成しない限り、もう1つの選択肢は、プロジェクト内の

DockerClient

のデフォルトのインスタンス化のみを考慮できるように、対応する環境変数を設定することです。

export DOCKER__CERT__PATH=/home/baeldung/.docker/certs
export DOCKER__CONFIG=/home/baeldung/.docker/export DOCKER__TLS__VERIFY=1
export DOCKER__HOST=tcp://docker.baeldung.com:2376


4コンテナ管理

APIにより、コンテナ管理についてさまざまな選択肢があります。それぞれを見てみましょう。


4.1. リストコンテナ

接続が確立されたので、Dockerホストにある実行中のすべてのコンテナを一覧表示できます。

List<Container> containers = dockerClient.listContainersCmd().exec();

実行中のコンテナーを表示しても必要性が訴えられない場合は、提供されているオプションを使用してコンテナーを照会できます。

この場合、コンテナは「終了」ステータスで表示されます。

List<Container> containers = dockerClient.listContainersCmd()
  .withShowSize(true)
  .withShowAll(true)
  .withStatusFilter("exited").exec()

これは、

$ docker ps -a -s -f status=exited
# or
$ docker container ls -a -s -f status=exited


4.2. コンテナを作成する

コンテナの作成は

createContainerCmd

メソッドで提供されています。

__

接頭辞** で始まる利用可能なメソッドを使用して、より複雑な宣言を宣言することができます。

ポート27017で内部的に待機しているホスト依存のMongoDBコンテナーを定義する

docker


create

コマンドがあるとします。

$ docker create --name mongo \
  --hostname=baeldung \
  -e MONGO__LATEST__VERSION=3.6 \
  -p 9999:27017 \
  -v/Users/baeldung/mongo/data/db:/data/db \
  mongo:3.6 --bind__ip__all

プログラムで同じコンテナをその設定と一緒にブートストラップすることができます。

CreateContainerResponse container
  = dockerClient.createContainerCmd("mongo:3.6")
    .withCmd("--bind__ip__all")
    .withName("mongo")
    .withHostName("baeldung")
    .withEnv("MONGO__LATEST__VERSION=3.6")
    .withPortBindings(PortBinding.parse("9999:27017"))
    .withBinds(Bind.parse("/Users/baeldung/mongo/data/db:/data/db")).exec();


4.3. コンテナの起動、停止、および強制終了

コンテナを作成したら、それをそれぞれ名前またはIDで起動、停止、および削除できます。

dockerClient.startContainerCmd(container.getId()).exec();

dockerClient.stopContainerCmd(container.getId()).exec();

dockerClient.killContainerCmd(container.getId()).exec();


4.4. コンテナを調べる


inspectContainerCmd

メソッドは、コンテナの名前またはIDを示す

String

引数を取ります。このメソッドを使うと、コンテナのメタデータを直接観察できます。

InspectContainerResponse container
  = dockerClient.inspectContainerCmd(container.getId()).exec();


4.5. コンテナのスナップショット


docker commit

コマンドと同様に、

commitCmd

メソッドを使用して新しいイメージを作成できます。

この例では、シナリオは


です。以前はalpine:3.6コンテナを実行していましたが、idは

“ 3464bb547f88”

で、その上に

git

をインストールしていました。

それでは、コンテナから新しいイメージスナップショットを作成します。

String snapshotId = dockerClient.commitCmd("3464bb547f88")
  .withAuthor("Baeldung <[email protected]>")
  .withEnv("SNAPSHOT__YEAR=2018")
  .withMessage("add git support")
  .withCmd("git", "version")
  .withRepository("alpine")
  .withTag("3.6.git").exec();


git

がバンドルされた新しいイメージはホストに残っているので、Dockerホストで検索できます。

$ docker image ls alpine --format "table {{.Repository}} {{.Tag}}"
REPOSITORY TAG
alpine     3.6.git


5画像管理

画像操作を管理するために与えられるいくつかの適切なコマンドがあります。


5.1. リスト画像

Dockerホスト上のダングリングイメージを含むすべての利用可能なイメージを一覧表示するには、

listImagesCmd

メソッドに適用する必要があります。

List<Image> images = dockerClient.listImagesCmd().exec();

Dockerホストに2つの画像がある場合は、実行時にそれらの

Image

オブジェクトを取得する必要があります。探している画像は次のとおりです。

$ docker image ls --format "table {{.Repository}} {{.Tag}}"
REPOSITORY TAG
alpine     3.6
mongo      3.6

これに隣接して、中間画像を見るためには、それを明示的に要求する必要があります。

List<Image> images = dockerClient.listImagesCmd()
  .withShowAll(true).exec();

ダングリング画像のみを表示する場合は、

withDanglingFilter

メソッドを考慮する必要があります。

List<Image> images = dockerClient.listImagesCmd()
  .withDanglingFilter(true).exec();


5.2. 画像を作成する

APIを使用して画像を作成する方法に焦点を絞りましょう。


buildImageCmd

メソッドは、DockerfileからDockerイメージを構築します

。私たちのプロジェクトでは、gitがインストールされたAlpineイメージを与える1つのDockerfileがすでにあります。

FROM alpine:3.6

RUN apk --update add git openssh && \
  rm -rf/var/lib/apt/lists/**  && \
  rm/var/cache/apk/**

ENTRYPOINT["git"]CMD["--help"]----

新しいイメージはキャッシュを使わずにビルドされ、ビルドプロセスを開始する前に、Dockerエンジンは新しいバージョンの__alpine:3.6__をプルしようとします。 ** すべてうまくいけば、**  **  alpine:git:** という名前の画像が最終的に表示されるはずです。

[source,java,gutter:,true]

String imageId = dockerClient.buildImageCmd()
.withDockerfile(new File(“path/to/Dockerfile”))
.withPull(true)
.withNoCache(true)
.withTag(“alpine:git”)
.exec(new BuildImageResultCallback())
.awaitImageId();

====  **  5.3. 画像を調べる**

__inspectImageCmd__メソッドのおかげで、画像に関する低レベルの情報を調べることができます。

[source,java,gutter:,true]

InspectImageResponse image
= dockerClient.inspectImageCmd(“161714540c41”).exec();

====  **  5.4. 画像にタグを付ける**

__docker__ __tag__コマンドを使用してイメージにタグを追加するのは非常に簡単なので、APIも例外ではありません。 __tagImageCmd__メソッドでも同じことを実行できます。 **  idが__161714540c41__のDockerイメージをgitでbaeldung/alpineリポジトリにタグ付けするには:**

[source,java,gutter:,true]

String imageId = “161714540c41”;
String repository = “baeldung/alpine”;
String tag = “git”;

dockerClient.tagImageCmd(imageId, repository, tag).exec();

新しく作成された画像を一覧表示します。

[source,bash,gutter:,true]

$ docker image ls –format “table {{.Repository}} {{.Tag}}”
REPOSITORY TAG
baeldung/alpine git

====  **  5.5. 画像をプッシュする**

レジストリサービスにイメージを送信する前に、dockerクライアントはサービスと連携するように設定されている必要があります。これは、レジストリの操作を事前に認証する必要があるためです。

クライアントはDocker Hubで設定されていると想定しているので、__baeldung/alpine__イメージをbaeldung DockerHubアカウントにプッシュできます。

[source,java,gutter:,true]

dockerClient.pushImageCmd(“baeldung/alpine”)
.withTag(“git”)
.exec(new PushImageResultCallback())
.awaitCompletion(90, TimeUnit.SECONDS);

** 私達はプロセスの期間を遵守しなければなりません** 。例では、**  90秒間待機しています** 。

====  **  5.6. 画像を引き出す**

レジストリサービスから画像をダウンロードするために、__pullImageCmd__メソッドを使用します。さらに、イメージがプライベートレジストリから取得されている場合、クライアントは自分の資格情報を知っている必要があり、そうでなければプロセスは失敗して終了します。 ** 画像を引っ張るのと同じように、我々は画像を引っ張るために固定期間と共にコールバックを指定します:**

[source,java,gutter:,true]

dockerClient.pullImageCmd(“baeldung/alpine”)
.withTag(“git”)
.exec(new PullImageResultCallback())
.awaitCompletion(30, TimeUnit.SECONDS);

それを引っ張った後にDockerホストに言及されたイメージが存在するかどうかチェックするために:

[source,bash,gutter:,true]

$ docker images baeldung/alpine –format “table {{.Repository}} {{.Tag}}”
REPOSITORY TAG
baeldung/alpine git

====  **  5.7. 画像を削除する**

その他の単純な関数は__removeImageCmd__メソッドです。

短いIDまたは長いIDの画像を削除できます。

[source,java,gutter:,true]

dockerClient.removeImageCmd(“beaccc8687ae”).exec();

====  **  5.8. レジストリを検索**

Docker Hubから画像を検索するために、クライアントは、用語を示すString値を取る__searchImagesCmd__メソッドが付属しています。

ここでは、Docker Hubで「**  Java」** を含む名前に関連する画像を調べます。

[source,java,gutter:,true]

List<SearchItem> items = dockerClient.searchImagesCmd(“Java”).exec();

出力は、__SearchItem__オブジェクトのリスト内の最初の25の関連イメージを返します。

===  **  6. ボリューム管理**

JavaプロジェクトがDockerとボリュームをやり取りする必要がある場合は、このセクションも考慮する必要があります。簡単に言えば、Docker Java APIによって提供されるボリュームの基本的なテクニックを調べます。

====  **  6.1. ボリューム一覧**

名前付きおよび名前なしを含む、使用可能なすべてのボリュームは、以下のとおりです。

[source,java,gutter:,true]

ListVolumesResponse volumesResponse = dockerClient.listVolumesCmd().exec();
List<InspectVolumeResponse> volumes = volumesResponse.getVolumes();

====  **  6.2. ボリュームを調べる**

__inspectVolumeCmd__メソッドは、ボリュームの詳細情報を表示するためのフォームです。短いIDを指定してボリュームを調べます。

[source,java,gutter:,true]

InspectVolumeResponse volume
= dockerClient.inspectVolumeCmd(“0220b87330af5”).exec();

====  **  6.3. ボリュームを作成する**

APIは、ボリュームを作成するための2つの異なるオプションを提供します。非引数__createVolumeCmd__メソッドは、Dockerによって名前が与えられるボリュームを作成します。

[source,java,gutter:,true]

CreateVolumeResponse unnamedVolume = dockerClient.createVolumeCmd().exec();

デフォルトの動作を使用するのではなく、__withName__という名前のヘルパーメソッドを使用すると、名前をボリュームに設定できます。

[source,java,gutter:,true]

CreateVolumeResponse namedVolume
= dockerClient.createVolumeCmd().withName(“myNamedVolume”).exec();

====  **  6.4. ボリュームを削除する**

__removeVolumeCmd__メソッドを使って直感的にDockerホストからボリュームを削除できます。 ** ボリュームがコンテナから使用中の場合、そのボリュームを削除することはできないことに注意することが重要です。

[source,java,gutter:,true]

dockerClient.removeVolumeCmd(“myNamedVolume”).exec();

===  **  7. ネットワーク管理**

最後のセクションは、APIを使ってネットワークタスクを管理することです。

====  **  7.1. リストネットワーク**

__list__で始まる従来のAPIメソッドの1つを使用して、ネットワークユニットのリストを表示できます。

[source,java,gutter:,true]

List<Network> networks = dockerClient.listNetworksCmd().exec();

====  **  7.2. ネットワークを作成する**

__docker network create__コマンドと同等のものは、__createNetworkCmd__メソッドを使用して実行されます。もし私たちが30のパーティーやカスタムネットワークドライバを持っているのなら、__withDriver__メソッドは組み込みドライバの他にそれらを受け入れることができます。ここでは、__baeldung__という名前のブリッジネットワークを作成しましょう。

[source,java,gutter:,true]

CreateNetworkResponse networkResponse
= dockerClient.createNetworkCmd()
.withName(“baeldung”)
.withDriver(“bridge”).exec();

さらに、デフォルト設定でネットワークユニットを作成しても問題は解決しません。高度なネットワークを構築するための他のヘルパー方法を適用できます。したがって、** デフォルトのサブネットワークをカスタム値でオーバーライドするには** :

[source,actionscript3,gutter:,true]

CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd()
.withName(“baeldung”)
.withIpam(new Ipam()
.withConfig(new Config()
.withSubnet(“172.36.0.0/16”)
.withIpRange(“172.36.5.0/24”)))
.withDriver(“bridge”).exec();

__docker__コマンドで実行できる同じコマンドは次のとおりです。

[source,bash,gutter:,true]

$ docker network create \
–subnet=172.36.0.0/16 \
–ip-range=172.36.5.0/24 \
baeldung

====  **  7.3. ネットワークを調べる**

ネットワークの低レベルの詳細を表示することもAPIでカバーされています。

[source,java,gutter:,true]

Network network
= dockerClient.inspectNetworkCmd().withNetworkId(“baeldung”).exec();

====  **  7.4. ネットワークを削除する**

__removeNetworkCmd__メソッドを使用して、ネットワークユニットをその名前またはIDで安全に削除できます。

[source,java,gutter:,true]

dockerClient.removeNetworkCmd(“baeldung”).exec();

===  **  8結論**

この広範なチュートリアルでは、__Java Docker API Client__のさまざまな機能と、展開および管理シナリオの実装方法をいくつか紹介しました。

この記事で説明されている例はすべてhttps://github.com/eugenp/tutorials/tree/master/libraries[over on GitHub]にあります。