在网上找了很久,始终没有找到很好的博客。通过我的慢慢摸索,终于写出一点点的代码,一些使用的小例子。
我们可以在文档上面找到api的介绍和使用。https://www.javadoc.io/doc/com.spotify/docker-client/8.9.0/com/spotify/docker/client/DockerClient.html
首先我们需要将docker主机上面的端口暴露出来。
进入docker服务器,修改配置文件
vi /lib/systemd/system/docker.service
找到ExecStart 开头的配置,注释原配置 进行备份 插入的信息是-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
保存和重启docker服务
systemctl daemon-reload
service docker restart
当我们可以正常访问docker主机ip:你暴露的端口,说明你正常开放了这一个端口。
接下来我们引入一些依赖
<dependency>
<groupId>com.spotify</groupId>
<artifactId>docker-client</artifactId>
<version>8.9.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.22</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-jaxb</artifactId>
<version>2.22</version>
</dependency>
接下来就是一些使用的代码
下面的函数是创建一个dockerClient客户端
// CONTINUE_TIMEOUT_MILLIS 自己设置,我这里设置的是10000L
public static DefaultDockerClient getDockerClient(String hostPath,String port) throws Exception {
if(StringUtils.isBlank(port)){
port = DEAFUOLT_PORT;
}
DefaultDockerClient dockerClient;
try {
dockerClient = DefaultDockerClient.builder().connectTimeoutMillis(CONTINUE_TIMEOUT_MILLIS).uri(URI.create("http://"+hostPath+":"+port)).build();
}
catch (Exception e){
LOGGER.error("NE1001",e.getMessage());
throw new Exception("NE1001");
}
return dockerClient;
}
下面是一些使用的函数例子
final DockerClient docker = getDockerClient("218.0.52.69", "2375");
// 查询容器列表 无参是查询正在run的容器信息
final List<Container> containers = docker.listContainers(DockerClient.ListContainersParam.allContainers());
for (int i = 0; i <containers.size() ; i++) {
System.out.println(containers.get(i));
}
final List<Container> containers = docker.listContainers();
// 启动容器
docker.startContainer("nostalgic_ramanujan");
// 停止容器
docker.stopContainer("bi_system",10);
// 查看容器信息
final ContainerInfo info = docker.inspectContainer("fb71b7aa54da");
System.out.println(info.toString());
// 查询newtork列表信息
List<Network> networks = docker.listNetworks();
for (int i = 0; i < networks.size(); i++) {
System.out.println(networks.get(i));
}
创建指定network的容器
// 获取指定名称的网络
Network network = docker.listNetworks().stream()
.filter(n -> "myuser-0".equals(n.name()))
.findFirst()
.orElseThrow(() -> new RuntimeException("Network not found"));
// 配置容器
ContainerConfig containerConfig = ContainerConfig.builder()
.image("ubuntu:18.04").cmd("bash").tty(true)
.hostConfig(HostConfig.builder()
.networkMode(network.name())
.build())
.build();
// 创建容器,并将其加入到指定网络
ContainerCreation container = docker.createContainer(containerConfig,"test");
创建指定网段的network ,这个方法需要subnet,IpRange,Gatway,请正确的填写。
String subnet = Subnet ; // 子网地址
String networkName = NetworkName + "-" + index; // 网络名称
DockerClient docker = getDockerClient(hostPath, port);
final Iterable<Network> networks = docker.listNetworks();
// Iterate through the list of networks and check if the network with the given name exists
boolean networkExists = false;
for (Network network : networks) {
if (network.name().equals(networkName)) {
networkExists = true;
System.out.println("重新输入名称");
return;
}
}
List<IpamConfig> ipamConfigs = new LinkedList<>();
IpamConfig ss = IpamConfig.create(subnet,IpRange,Gatway);
System.out.println(ss);
ipamConfigs.add(ss);
try {
final NetworkConfig networkConfig = NetworkConfig.builder()
.name(networkName)
.driver("bridge")
.ipam(Ipam.create("default",ipamConfigs))
.build();
final NetworkCreation creation = docker.createNetwork(networkConfig);
final Network network = docker.inspectNetwork(creation.id());
System.out.println("Network created: " + network.id());
}
catch (Exception e){
System.out.println("fail,请输入正确的subnet,IpRange,Gatway");
}
复制本机文件到docker容器里面(注意不是docker主机) 不能复制文件,只能复制文件夹。复制到docker容器里面的是文件夹里面的文件。可以看docker-client文档来理解操作。
/**
*
* @param hostPath docker 主机ip
* @param port 端口
* @param localPath 文件夹地址
* @param continerId 容器id
* @param continerPath 容器内的路径
*/
public static void CopyDirectoryToContiner(String hostPath,String port,String continerId , String localPath , String continerPath) throws Exception {
DockerClient docker = getDockerClient(hostPath, port);
try {
docker.inspectContainer(continerId);
System.out.println("容器存在");
}
catch (Exception e){
System.out.println("容器不存在");
}
try {
docker.copyToContainer(Paths.get(localPath), continerId, continerPath);
System.out.println("success");
} catch (DockerException | InterruptedException e) {
e.printStackTrace();
}
}