背景:
使用com.github.docker-java庫可以很方便地在Java中操作Docker。下面是一個詳細的教程,包括建立映象、建立容器、啟動容器、停止容器和刪除容器的步驟以及每一步的說明。
前提:
首先,在你的Java專案中新增com.github.docker-java庫的依賴。你可以在你的構建工具(如Maven或Gradle)的配置檔案中新增以下依賴項:
<dependency> <groupId>com.github.docker-java</groupId> <artifactId>docker-java</artifactId> <version>3.2.5</version> </dependency>
建立Docker客戶端
import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.DockerClientBuilder; DockerClient dockerClient = DockerClientBuilder.getInstance() .withDockerHost("tcp://localhost:2375") .withDockerCertPath("/path/to/cert") .withApiVersion("1.41") .build();
透過withDockerHost()
方法設定了Docker守護程式的連線地址,withDockerCertPath()
方法設定了TLS證照的路徑,withApiVersion()
方法設定了Docker API的版本。最後,透過呼叫build()
方法構建了一個DockerClient
物件。
-
DockerClientBuilder
類是用於構建和配置DockerClient
物件的構建器類。它提供了一組方法,用於設定與Docker守護程式通訊所需的引數和配置。 -
getInstance()
是DockerClientBuilder
類的靜態方法。透過呼叫該方法,可以獲取DockerClientBuilder
的單例例項。 -
DockerClientBuilder
使用單例模式的設計,主要是為了提供對Docker守護程式的訪問的全域性共享例項。這樣可以避免重複建立和銷燬DockerClientBuilder
例項,提高了效能和效率。 -
使用
DockerClientBuilder.getInstance()
方法獲取DockerClientBuilder
的例項後,可以透過該例項進行鏈式呼叫,設定各種與Docker守護程式通訊相關的引數和配置。 -
透過鏈式呼叫
DockerClientBuilder
的方法,可以設定例如Docker守護程式的連線地址、認證資訊、超時時間、TLS配置等。這些方法包括withDockerHost()
、withDockerCertPath()
、withDockerConfig()
、withApiVersion()
等。 -
最後,透過呼叫
build()
方法,可以構建出一個DockerClient
物件,用於與Docker守護程式進行互動。該物件可以執行各種Docker操作,如建立容器、啟動容器、構建映象等。
建立映象
import com.github.dockerjava.api.command.BuildImageResultCallback; String dockerfilePath = "/path/to/dockerfile"; String imageName = "my-image"; String imageTag = "latest"; dockerClient.buildImageCmd() .withDockerfile(new File(dockerfilePath)) .withTags(Collections.singleton(imageName + ":" + imageTag)) .exec(new BuildImageResultCallback()) .awaitCompletion();
withDockerfile(new File(dockerfilePath))
:指定Dockerfile的路徑,用於構建映象。withTags(Collections.singleton(imageName + ":" + imageTag))
:指定映象的標籤。可以透過withTags
方法傳遞一個包含映象標籤的集合,這裡使用Collections.singleton()
方法建立一個只包含一個元素的集合
withBaseDirectory(baseDirectory)
:設定基礎目錄,該目錄中包含了構建映象所需的所有檔案。與withDockerfile()
一起使用時,會自動將基礎目錄中的Dockerfile關聯到構建命令中。withNoCache()
:禁用快取,每次構建映象時都會重新執行所有命令,確保使用最新的檔案和依賴項。withPull(pull)
:指定是否應該在構建之前拉取最新的基礎映象,預設為false
,即不拉取。withQuiet()
:設定靜默模式,不輸出構建映象的日誌資訊。withBuildArg(buildArg)
:使用Map<String, String>
型別的引數設定構建引數。鍵值對錶示構建引數的名稱和值。withLabels(labels)
:使用Map<String, String>
型別的引數設定映象的標籤。鍵值對錶示標籤的鍵和值。withBuildArgs(buildArgs)
:使用Map<String, String>
型別的引數設定構建引數。與withBuildArg()
類似,但可以一次設定多個構建引數。withPull()
:設定是否應該在構建之前拉取最新的基礎映象。withProgressHandler(progressHandler)
:設定用於處理構建映象進度的ProgressHandler
。
建立容器
import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Volume; String imageName = "my-image"; String containerName = "my-container"; int hostPort = 8080; int containerPort = 80; String volumeHostPath = "/host/path"; String volumeContainerPath = "/container/path"; CreateContainerResponse container = dockerClient.createContainerCmd(imageName) .withName(containerName) .withPortBindings(new PortBinding( new Binding(null, null, hostPort), new ExposedPort(containerPort))) .withBinds(new Bind(volumeHostPath, new Volume(volumeContainerPath))) .exec();
在上述程式碼中,imageName
表示要使用的映象的名稱,containerName
表示要建立的容器的名稱。hostPort
和containerPort
分別表示主機埠和容器埠,用於進行埠對映。volumeHostPath
和volumeContainerPath
表示主機路徑和容器路徑,用於掛載卷。其中,CreateContainerResponse
物件,包含了有關新建立容器的資訊,比如容器的ID、名稱等。以便接下來的啟動停止容器等操作
withName(containerName)
:為容器指定一個名稱。withPortBindings(portBindings)
:指定容器的埠繫結。portBindings
是一個PortBinding
物件,用於將主機埠對映到容器內的埠。withBinds(bindings)
:指定容器的卷繫結。bindings
是一個Bind
物件,用於將主機的目錄或卷掛載到容器內的路徑。
啟動容器
dockerClient.startContainerCmd(container.getId()).exec();
停止和刪除容器
dockerClient.stopContainerCmd(container.getId()).exec(); dockerClient.removeContainerCmd(container.getId()).exec();
在上述程式碼中,container.getId()
獲取到的是容器的ID。