avatar

Java-Docker操作

Java-Docker操作

由于项目的需求,需要设计一个Java操控Docker的方案

第一步,首先需要创建一个dockerClient对象

1
public static DockerClient dockerClient = DockerClientBuilder.getInstance().build();

接下来就是一些使用这个对象的代码,主要展示为主

以特权模式创建Container

1
2
3
4
5
6
7
8
9
10
public static String createContainerExposePort(String image_id,int port){
HostConfig hostConfig = new HostConfig();
hostConfig.withPrivileged(true);
CreateContainerResponse createContainerResponse = dockerClient.createContainerCmd(image_id)
.withExposedPorts(new ExposedPort(port))
.withTty(true)
.withHostConfig(hostConfig)
.exec();
return createContainerResponse.getId();//注意这里容器只是被created,还需要通过下面的函数来启动容器
}

得到Docker的镜像列表

1
2
3
4
public static List<Image> getDockerImageList(){
List<Image> images = dockerClient.listImagesCmd().exec();
return images;
}

得到Docker的容器列表

1
2
3
4
public static List<Container> getDockerContainerList(){
List<Container> containers = dockerClient.listContainersCmd().exec();
return containers;
}

获取容器的IP

1
2
3
4
public static String getContainerIP(String container_id){
Container container = getContainerByContainerId(container_id);
return container != null ? container.getNetworkSettings().getNetworks().get("bridge").getIpAddress() : "";
}

继续已经被暂停的容器

1
2
3
public static void unpauseContainer(String container_id){
dockerClient.unpauseContainerCmd(container_id).exec();
}

重启容器

1
2
3
public static void restartContainer(String container_id){
dockerClient.restartContainerCmd(container_id).exec();
}

停止容器

1
2
3
public static void stopContainer(String container_id){
dockerClient.stopContainerCmd(container_id).exec();
}

删除容器

1
2
3
public static void removeContainer(String container_id){
dockerClient.removeContainerCmd(container_id).exec();
}

在某容器执行一条命令,如果没有交互的话,直接采用下面的函数

1
2
3
4
public static void execCommand(String containerId,String command,ResultCallback callback){
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(containerId).withAttachStdout(true).withAttachStderr(true).withCmd("bash", "-c", command).exec();
dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(callback);
}

开放端口的方式,创建容器

1
2
3
4
5
6
7
8
9
10
11
public static String createContainerExposePort(String image_id,int port){
HostConfig hostConfig = new HostConfig();
hostConfig.withPrivileged(true);
CreateContainerResponse createContainerResponse = dockerClient
.createContainerCmd(image_id)
.withExposedPorts(new ExposedPort(port))
.withTty(true)
.withHostConfig(hostConfig)
.exec();
return createContainerResponse.getId();
}

如果需要得到执行之后的数据,可以采用下面的函数

但是要注意withTty必须开启可以,不然会得到乱码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 public static void execCommand(String containerId,String command){
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(containerId).withAttachStdout(true).withAttachStderr(true).withCmd("bash", "-c", command).exec();
dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(new ResultCallback<Frame>() {
@Override
public void onStart(Closeable closeable) {

}

@Override
public void onNext(Frame frame) {
//如果这里输出了frame.toString(),就可以得到命令输出结果
}

@Override
public void onError(Throwable throwable) {

}

@Override
public void onComplete() {

}

@Override
public void close() throws IOException {

}
});
}

上述只是阐述了简单的方法利用,另外还有很多配置存放在HostConfig对象中,如果有兴趣可以深入的去研究

文章作者: 咲夜南梦
文章链接: http://yoursite.com/2020/04/05/Java-Docker%E6%93%8D%E4%BD%9C/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 咲夜南梦's 博客
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论