Java用Dockerガイド

Java用Dockerガイド

1. 概要

この記事では、もう1つの定評のあるプラットフォーム固有のAPIであるJava API Client for Dockerを見ていきます。

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

2. メーベン依存

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


    com.github.docker-java
    docker-java
    3.0.14

記事を書いている時点では、the latest version of the API is 3.0.14です。 各リリースは、the GitHub release pageまたはthe Maven repositoryから表示できます。

3. Dockerクライアントの使用

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

デフォルトでは、Dockerデーモンはunix:///var/run/docker.sockファイルでのみアクセスできます。 the Docker engine listening on the Unix socket unless otherwise configuredとローカルで通信できます。

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

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

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

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

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

たとえば、ビルダーはサーバーURL、つまりwe can update the connection value if the engine is available on port 2375を受け入れます。

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

the connection string with unix:// or tcp:// depending on the connection type.を先頭に追加する必要があることに注意してください

さらに一歩進むと、DefaultDockerClientConfigクラスを使用したより高度な構成になります。

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

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

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

Properties properties = new Properties();
properties.setProperty("registry.email", "[email protected]");
properties.setProperty("registry.password", "example");
properties.setProperty("registry.username", "baaldung");
properties.setProperty("DOCKER_CERT_PATH", "/home/example/.docker/certs");
properties.setProperty("DOCKER_CONFIG", "/home/example/.docker/");
properties.setProperty("DOCKER_TLS_VERIFY", "1");
properties.setProperty("DOCKER_HOST", "tcp://docker.example.com:2376");

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

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

ソースコードでエンジンの設定を構成しない限り、別の選択肢は、対応する環境変数を設定して、プロジェクト内のDockerClientのデフォルトのインスタンス化のみを考慮できるようにすることです。

export DOCKER_CERT_PATH=/home/example/.docker/certs
export DOCKER_CONFIG=/home/example/.docker/
export DOCKER_TLS_VERIFY=1
export DOCKER_HOST=tcp://docker.example.com:2376

4. コンテナ管理

APIにより、コンテナ管理に関するさまざまな選択が可能になります。 それぞれを見てみましょう。

4.1. コンテナの一覧表示

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

List containers = dockerClient.listContainersCmd().exec();

実行中のコンテナを表示してもニーズに対応できない場合は、提供されているオプションを使用してコンテナをクエリできます。

この場合、「終了」ステータスのコンテナを表示します。

List 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メソッドで提供されます。 より複雑な宣言usingthe available methods starting with the “with” prefixを宣言できます。

ポート27017で内部的にリッスンしているホスト依存のMongoDBコンテナーを定義するdockercreateコマンドがあると仮定します。

$ docker create --name mongo \
  --hostname=example \
  -e MONGO_LATEST_VERSION=3.6 \
  -p 9999:27017 \
  -v /Users/example/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("example")
    .withEnv("MONGO_LATEST_VERSION=3.6")
    .withPortBindings(PortBinding.parse("9999:27017"))
    .withBinds(Bind.parse("/Users/example/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メソッドを使用して新しいイメージを作成できます。

この例では、シナリオは, we previously run an alpine:3.6 container whose id is “3464bb547f88” and installed git on top of it.です。

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

String snapshotId = dockerClient.commitCmd("3464bb547f88")
  .withAuthor("example <[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 images = dockerClient.listImagesCmd().exec();

Dockerホストに2つのイメージ、we should obtain the Image objects of them at run-timeがある場合。 探している画像は次のとおりです。

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

これの隣に、中間画像を見るために、明示的に要求する必要があります:

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

ぶら下がっている画像のみを表示する場合は、withDanglingFilterメソッドを検討する必要があります。

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

5.2. イメージを構築する

APIを使用してイメージを構築する方法に焦点を当てましょう。 The buildImageCmd method builds Docker images from a Dockerfile。 このプロジェクトでは、gitがインストールされたAlpineイメージを提供するDockerfileがすでに1つあります。

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をプルしようとします。 If everything goes well, we should eventually see the image with the given name,alpine:git:

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

5.3. 画像を検査する

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

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

5.4. 画像にタグを付ける

dockertagコマンドを使用すると、画像にタグを追加するのは非常に簡単なので、APIも例外ではありません。 tagImageCmdメソッドでも同じ意図を実行できます。 To tag a Docker image with id 161714540c41 into the example/alpine repository with git:

String imageId = "161714540c41";
String repository = "example/alpine";
String tag = "git";

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

新しく作成された画像をリストします。

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

5.5. 画像をプッシュ

レジストリサービスで画像を送信する前に、レジストリでの作業を事前に認証する必要があるため、Dockerクライアントをサービスと連携するように構成する必要があります。

クライアントがDockerHubで構成されていることを前提としているため、example/alpineイメージをサンプルのDockerHubアカウントにプッシュできます。

dockerClient.pushImageCmd("example/alpine")
  .withTag("git")
  .exec(new PushImageResultCallback())
  .awaitCompletion(90, TimeUnit.SECONDS);

We must abide by the duration of the process。 この例では、we are waiting 90 secondsです。

5.6. 画像をプルする

レジストリサービスから画像をダウンロードするには、pullImageCmdメソッドを使用します。 さらに、プライベートレジストリからイメージを取得する場合、クライアントは資格情報を知っている必要があります。そうでない場合、プロセスは失敗します。 Same as the pulling an image, we specify a callback along with a fixed period to pull an image:

dockerClient.pullImageCmd("example/alpine")
  .withTag("git")
  .exec(new PullImageResultCallback())
  .awaitCompletion(30, TimeUnit.SECONDS);

引っ張った後、言及したイメージがDockerホストに存在するかどうかを確認するには:

$ docker images example/alpine --format "table {{.Repository}} {{.Tag}}"
REPOSITORY      TAG
example/alpine git

5.7. 画像を削除する

残りの中でもう1つの単純な関数は、removeImageCmdメソッドです。 短いIDまたは長いIDの画像を削除できます。

dockerClient.removeImageCmd("beaccc8687ae").exec();

5.8. レジストリで検索

Docker Hubから画像を検索するために、クライアントには、用語を示す文字列値をとるsearchImagesCmdメソッドが付属しています。 ここでは、Docker Hubで ‘Java'を含む名前に関連する画像を調べます。

List items = dockerClient.searchImagesCmd("Java").exec();

出力は、SearchItemオブジェクトのリストの最初の25個の関連画像を返します。

6. ボリューム管理

JavaプロジェクトがボリュームのためにDockerと対話する必要がある場合、このセクションも考慮する必要があります。 Briefly, we look at the fundamental techniques of volumes provided by the Docker Java API.

6.1. ボリュームのリスト

名前付きおよび名前なしを含むすべての利用可能なボリュームが次のようにリストされます。

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

6.2. ボリュームを検査する

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

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

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

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

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

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

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

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

removeVolumeCmdメソッドを使用して、Dockerホストからボリュームを直感的に削除できます。 What is important to note that we cannot delete a volume if it is in use from a container.ボリュームリストからボリュームmyNamedVolumeを削除します。

dockerClient.removeVolumeCmd("myNamedVolume").exec();

7. ネットワーク管理

最後のセクションでは、APIを使用したネットワークタスクの管理について説明します。

7.1. ネットワークの一覧表示

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

List networks = dockerClient.listNetworksCmd().exec();

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

docker network createコマンドに相当するものは、createNetworkCmdメソッドで実行されます。 30パーティまたはカスタムネットワークドライバーがある場合、withDriverメソッドは組み込みドライバー以外にそれらを受け入れることができます。 この例では、名前がexampleのブリッジネットワークを作成しましょう。

CreateNetworkResponse networkResponse
  = dockerClient.createNetworkCmd()
    .withName("example")
    .withDriver("bridge").exec();

さらに、デフォルト設定でネットワークユニットを作成しても問題は解決しません。他のヘルパーメソッドを適用して、高度なネットワークを構築できます。 したがって、to override the default subnetwork with a custom value

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

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

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

7.3. ネットワークを検査する

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

Network network
  = dockerClient.inspectNetworkCmd().withNetworkId("example").exec();

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

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

dockerClient.removeNetworkCmd("example").exec();

8. 結論

この広範なチュートリアルでは、Java Docker API Clientのさまざまな機能と、展開および管理シナリオのいくつかの実装アプローチについて説明しました。

この記事に示されているすべての例は、over on GitHubにあります。