我有一个与docker建立连接的函数。你真的不需要了解太多,但我想要的是确保IP和端口始终与我的应用程序相同(Settings.getSettings())
public static DockerClient dockerClient() {
try {
Settings settings = Settings.getSettings();
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost("tcp://" + settings.getDockerIP() + ":" + settings.getDockerPort())
.withDockerConfig("/home/user/.docker/config.json")
.build();
DockerCmdExecFactory dockerCmdExecFactory = new JerseyDockerCmdExecFactory()
.withMaxTotalConnections(200)
.withMaxPerRouteConnections(200);
DockerClient dockerClient = DockerClientBuilder.getInstance(config)
.withDockerCmdExecFactory(dockerCmdExecFactory)
.build();
return dockerClient;
} catch (Exception e) {
System.out.println("Error: " + e);
}
return null;
}
每次我想做某事我都会调用这个功能。例如:
public static void startContainer(String containerName) {
DockerClient dockerClient = dockerClient();
....
public static List<Image> getImages() {
List<Image> images = new ArrayList<>(dockerClient().listImagesCmd().withShowAll(true).exec());
....
有没有更有效的方法来处理这个问题?我只是想确保当我执行某个命令时,会建立与正确的ip和端口的连接。
答案 0 :(得分:0)
每次可能不需要构建config
和dockerCmdExecFactory
。作为解决方案,您可以创建两个字段而不是局部变量。但要小心:你必须考虑多线程,可以有多少个实例,并确保在调用dockerClient()
之前始终初始化字段。可能这不是你的问题,但你必须检查它。
如果您使用Spring或类似的东西,您可能想要创建封装所有这些内容的bean。
您应用程序中的某些框架也可能已经实现了连接逻辑。由于内部框架中有很多优化的东西你无法实现,因此更为可取。以连接/套接字池和异常处理为例。尝试google'泊坞客户端你的框架名称'
答案 1 :(得分:0)
根据我的评论,您可以创建一个包含docker客户端状态的服务,并检查它是否发生更改以便重新加载:
class DockerClientService {
private DockerClient dockerClient;
private String ip;
private int port;
DockerClient getClient() {
Settings settings = Settings.getSettings();
if (settings.getDockerPort() != port || !settings.getDockerIP().equals(ip)) {
port = settings.getDockerPort();
ip = settings.getDockerIP();
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost("tcp://" + ip + ":" + port)
.withDockerConfig("/home/user/.docker/config.json")
.build();
DockerCmdExecFactory dockerCmdExecFactory = new JerseyDockerCmdExecFactory()
.withMaxTotalConnections(200)
.withMaxPerRouteConnections(200);
dockerClient = DockerClientBuilder.getInstance(config)
.withDockerCmdExecFactory(dockerCmdExecFactory)
.build();
}
return dockerClient;
}
}