github
网址:https://github.com/docker-java/docker-java
1、修改/usr/lib/systemd/system/docker.service
文件
vim /usr/lib/systemd/system/docker.service
# 修改为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2380 -H fd:// --containerd=/run/containerd/containerd.sock
# 或
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock
注:
一般情况下都是用的2375端口。但是暴露了2375端口的Docker主机。因为没有任何加密和认证过程,知道了主机IP以后,任何人都可以管理这台主机上的容器和镜像,很容易遭到攻击挖矿等恶意行为。非测试开发环境的话,还是要开启需要安全认证的tcp端口。本人为了方便只是把端口号换成了2380。
修改了 docker 配置之后,接着执行以下两个命令重启 Docker:
systemctl daemon-reload
systemctl restart docker
1.2、开启防火墙(如果选择第一种开启端口的)
# 开放端口
firewall-cmd --zone=public --add-port=2380/tcp --permanent
# 重启防火墙
firewall-cmd --reload
2、引入springboot
项目。
2.1、添加依赖
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.2.11</version>
</dependency>
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-httpclient5</artifactId>
<version>3.2.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
2.2、添加config类
package com.example.dcdemo.config;
import com.alibaba.fastjson.JSONObject;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.model.Info;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import com.github.dockerjava.transport.DockerHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.Duration;
@Configuration
public class DockerConfig {
/**
* 连接docker服务器
* @return
*/
@Bean("dockerClient")
public DockerClient connectDocker(){
DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerTlsVerify(false)
// 这里填最上面填的ip端口号,ip换成服务器ip
.withDockerHost("tcp://114.00.00.00:2380")
// 这里也可以用另一种配置的
// .withDockerHost("unix://var/run/docker.sock")
// docker API版本号,可以用docker version查看
.withApiVersion("1.41")
// 默认
.withRegistryUrl("https://index.docker.io/v1/").build();
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
.dockerHost(config.getDockerHost())
.sslConfig(config.getSSLConfig())
.maxConnections(100)
.connectionTimeout(Duration.ofSeconds(30))
.responseTimeout(Duration.ofSeconds(45))
.build();
DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient);
Info info = dockerClient.infoCmd().exec();
String infoStr = JSONObject.toJSONString(info);
System.out.println("docker的环境信息如下:=================");
System.out.println(infoStr);
return dockerClient;
}
}
2.3、编写controller
这里也是从其他地方copy过来的,只使用了获取镜像列表的方法测试,有兴趣的可以测试其他的。
package com.example.dcdemo.controller;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.Image;
import com.github.dockerjava.api.model.Ports;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static com.github.dockerjava.api.model.HostConfig.newHostConfig;
@RestController
public class DockerController {
@Autowired
private DockerClient dockerClient;
@RequestMapping("hello")
public String hello() {
return "hello";
}
// 获取镜像列表
@RequestMapping("getImageList")
public List<Image> getImageList(){
List<Image> imageList = dockerClient.listImagesCmd().exec();
// System.out.println(imageList.size());
return imageList;
}
/**
* 创建容器
* @param client
* @return
*/
public CreateContainerResponse createContainers(DockerClient client, String containerName, String imageName){
//映射端口8088—>80
ExposedPort tcp80 = ExposedPort.tcp(80);
Ports portBindings = new Ports();
portBindings.bind(tcp80, Ports.Binding.bindPort(8088));
CreateContainerResponse container = client.createContainerCmd(imageName)
.withName(containerName)
.withHostConfig(newHostConfig().withPortBindings(portBindings))
.withExposedPorts(tcp80).exec();
return container;
}
/**
* 启动容器
* @param client
* @param containerId
*/
public void startContainer(DockerClient client,String containerId){
client.startContainerCmd(containerId).exec();
}
/**
* 停止容器
* @param client
* @param containerId
*/
public void stopContainer(DockerClient client,String containerId){
client.stopContainerCmd(containerId).exec();
}
/**
* 删除容器
* @param client
* @param containerId
*/
public void removeContainer(DockerClient client,String containerId){
client.removeContainerCmd(containerId).exec();
}
}
3、第一步中docker.service
两种修改使用上的区别
第一种,启动方式如上面的步骤所示。
第二种, docker in docker
的方式,需要将主机上的docker.sock
挂载至容器内,实现共享主机的docker.sock
。
docker run -d -p 8888:8888 -v /var/run/docker.sock:/var/run/docker.sock --name dcdemo01 dcdemo