使用docker-java连接docker容器操作api遇到问题记录

1. docker客户端配置

需在docker.service文件中ExecStart 后面添加配置,开放2375接口

-H unix://var/run/docker.sock -H tcp://0.0.0.0:2375

这块有个坑,各个机器安装不同的路径,docker.service文件所在位置不同,需使用命令systemctl status docker.service查看docker.service配置文件所在

image.png

systemctl daemon-reload 重启 
systemctl restart docker 重启docker
ps -ef | grep docker 查看docker进程是否开放了2375接口

2. Java使用docker-java连接客户端

导包,网上可搜docker-java
说一下使用中遇到的问题:本地连接服务器测试调用docker-api查看和重启容器,没有问题,但是上了测试服务器之后,测试报错

image.png

说对应的host可能为空,在本地测试没问题,上了服务器之后出现了拿不到host值,网上找了各种帖子之后,没有对应的场景和解决方案,后面跟着报错日志点进源码里面查找,最后定位到ApacheConnector类中u.getHost()报出来的错

final Object proxyUri;
proxyUri = config.getProperty(ClientProperties.PROXY_URI);
if (proxyUri != null) {
           final URI u = getProxyUri(proxyUri);
           final HttpHost proxy = new HttpHost(u.getHost(), u.getPort(), u.getScheme());
           final String userName;
           userName = ClientProperties.getValue(config.getProperties(),ClientProperties.PROXY_USERNAME, String.class);

发现走了proxyUri这个字段,本地测试没有这个值,为null,所以没进去,然后再服务器上这个值不为null,就进了这个方法,然后get出错。为了弄清楚这个值取的是什么,本地连接测试服务器,调用debug方式查看,proxyUri这个值为proxy_host,最后又找到原来是DefaultDockerClientConfig这个类中的 createDefaultConfigBuilder方法中取的系统环境变量System.getenv(), (Properties) System.getProperties().clone(),打印了这个值后发现,原来是我们docker容器的环境变量(服务器上的服务是运行在对应的docker容器中)设置的JVM的参数,奇怪的是我查看了这个代理uri的key值是String PROXY_URI = "jersey.config.client.proxy.uri"跟我们设置的环境变量的key不一样,但是取得还是这个值,后来在创建dockerClient前设置环境变量参数删除了我们jvm的对应的代理设置参数的key和这个ClientProperties.PROXY_URI,最后发布服务器上测试,可以了。。。

        System.getProperties().remove("http.proxyHost");
        System.getProperties().remove("http.proxyPort");
        System.getProperties().remove("https.proxyHost");
        System.getProperties().remove("https.proxyPort");
        System.getProperties().remove(ClientProperties.PROXY_URI);
        // 创建client
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()

你可能感兴趣的:(使用docker-java连接docker容器操作api遇到问题记录)