Java 操作 DockerApi 常见启动,停止,加载端口,加载文件夹等操作实例

初始化 docker client (简易)

DockerClient dockerClient = DefaultDockerClientConfig.getInstance("tcp://localhost:2375").build();

初始化 docker client (高级)

DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()

  .withDockerHost("tcp://docker.somewhere.tld:2376")
  .withDockerTlsVerify(true)
  .withDockerCertPath("/home/user/.docker")
  .withRegistryUsername(registryUser)
  .withRegistryPassword(registryPass)
  .withRegistryEmail(registryMail)
  .withRegistryUrl(registryUrl)
  .build();

使用 jaxrs/jersey (netty 同样可以)

docker 命令工厂

DockerCmdExecFactory dockerCmdExecFactory = new JerseyDockerCmdExecFactory()

  .withReadTimeout(1000)
  .withConnectTimeout(1000)
  .withMaxTotalConnections(100)
  .withMaxPerRouteConnections(10);

初始化 Client

DockerClient dockerClient = DockerClientBuilder.getInstance(config)

  .withDockerCmdExecFactory(dockerCmdExecFactory)
  .build();

获取 docker 信息

Info info = dockerClient.infoCmd().exec();
System.out.print(info);

搜索 Docker 仓库:

List<SearchItem> dockerSearch = dockerClient.searchImagesCmd("busybox").exec();
System.out.println("Search returned" + dockerSearch.toString());

运行或停止新的 Docker 容器:

CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
   .withCmd("touch", "/test")
   .exec();

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

启动行的容器并给容器加载文件夹等设备:

Volume volume1 = new Volume("/opt/webapp1");

Volume volume2 = new Volume("/opt/webapp2");

CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
   .withVolumes(volume1, volume2)
   .withBinds(new Bind("/src/webapp1", volume1, true), new Bind("/src/webapp2", volume2))
   .withCmd("true")
   .exec();

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

创建新容器并绑定端口号:

ExposedPort tcp22 = ExposedPort.tcp(22);

ExposedPort tcp23 = ExposedPort.tcp(23);

Ports portBindings = new Ports();
portBindings.bind(tcp22, Ports.Binding(11022));
portBindings.bind(tcp23, Ports.Binding(11023));

CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
   .withCmd("true")
   .withExposedPorts(tcp22, tcp23)
   .withPortBindings(portBindings)
   .exec();

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

创建新的 Docker 容器并用自动公开的端口启动它

ExposedPort tcp22 = ExposedPort.tcp(22);

ExposedPort tcp23 = ExposedPort.tcp(23);

CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
   .withCmd("sleep", "9999")
   .withExposedPorts(tcp22, tcp23)
   .exec();

Ports portBindings = new Ports();
portBindings.bind(tcp22, Ports.Binding(null));
portBindings.bind(tcp23, Ports.Binding(null));

CreateContainerResponse container = dockerClient
   .createContainerCmd("busybox")
   .withCmd("sleep", "9999")
   .withExposedPorts(tcp22, tcp23)
   .withPortBindings(portBindings)
   .withPublishAllPorts(true).exec();

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

创建两个 Docker 容器并链接

CreateContainerResponse container1 = dockerClient.createContainerCmd("busybox")

   .withCmd("sleep", "9999")
   .withName("container1")
   .exec();

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

CreateContainerResponse container2 = dockerClient.createContainerCmd("busybox")
   .withCmd("true")
   .withName("container2")
   .withLinks(new Link("container1", "container1Link"))
   .exec();

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

使用装入绑定卷创建两个容器,并在第三个容器中继承其卷

CreateContainerResponse container1 = dockerClient

   .createContainerCmd("busybox")
   .withCmd("sleep", "9999")
   .withName("container1")
   .withBinds(new Bind("/src/webapp1", new Volume("/opt/webapp1")))
   .exec();
		
dockerClient.startContainerCmd(container1.getId()).exec();

CreateContainerResponse container2 = dockerClient
   .createContainerCmd("busybox")
   .withCmd("sleep", "9999")
   .withName("container2")
   .withBinds(new Bind("/src/webapp2", new Volume("/opt/webapp2")))
   .exec();
		
dockerClient.startContainerCmd(container2.getId()).exec();

// create a third container with all volumes from container1 and container2
CreateContainerResponse container3 = dockerClient
   .createContainerCmd("busybox")
   .withCmd("sleep", "9999")
   .withName("container3")
   .withVolumesFrom(new VolumesFrom("container1"), new VolumesFrom("container2"))
   .exec();

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

处理事件

EventsResultCallback callback = new EventsResultCallback() {
    @Override
    public void onNext(Event event) {
       System.out.println("Event: " + event);
       super.onNext(event);
    }
};

dockerClient.eventsCmd().exec(callback).awaitCompletion().close();
Build image from Dockerfile
File baseDir = new File("~/kpelykh/docker/netcat");

BuildImageResultCallback callback = new BuildImageResultCallback() {
    @Override
    public void onNext(BuildResponseItem item) {
       System.out.println("" + item);
       super.onNext(item);
    }
};

dockerClient.buildImageCmd(baseDir).exec(callback).awaitImageId();

  
    展开阅读全文