通过docker-java与docker进行通信交互

前提需要docker开启通信功能,有多种开启方式,我使用的是修改注册服务时的配置文件docker.service:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target

1、依赖

		<dependency>
			<groupId>com.github.docker-java</groupId>
			<artifactId>docker-java</artifactId>
			<version>3.3.4</version>
		</dependency>
		<dependency>
			<groupId>com.github.docker-java</groupId>
			<artifactId>docker-java-transport-httpclient5</artifactId>
			<version>3.3.4</version>
		</dependency>

2、DockerManager.class

package com.ctrip.crawler.container;

import com.ctrip.fx.octopus.client.constant.Constants;
import com.ctrip.fx.octopus.client.dto.EnvironmentSettingDTO;
import com.ctrip.hotel.octopus.commons.base.utils.JsonUtils;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.BuildImageResultCallback;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.model.Bind;
import com.github.dockerjava.api.model.BuildResponseItem;
import com.github.dockerjava.api.model.Container;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Image;
import com.github.dockerjava.api.model.PruneType;
import com.github.dockerjava.api.model.RestartPolicy;
import com.github.dockerjava.api.model.Ulimit;
import com.github.dockerjava.api.model.Volume;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.lang3.ObjectUtils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author ZhaoXu
 * @date 2024/1/12 17:47
 */
@Slf4j
public class Doc
### 解决方案 当尝试通过 Docker Java API 连接到位于 `http://localhost:2376` 的 Docker 守护进程时,可能会遇到配置或网络相关的问题。以下是详细的分析和解决方案。 #### 1. 配置守护进程监听端口 默认情况下,Docker 守护进程可能不会监听指定的 TCP 端口(如 2376)。为了使它能够接受远程连接,需要修改其配置文件并重新加载服务: - 编辑 `/etc/docker/daemon.json` 文件,添加以下内容以启用特定 IP 地址和端口的监听: ```json { "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"] } ``` - 执行以下命令以应用更改并重启 Docker 服务[^1]: ```bash sudo systemctl daemon-reload sudo systemctl restart docker ``` 确认 Docker 是否成功绑定到指定端口: ```bash sudo netstat -tuln | grep 2376 ``` 如果没有看到任何输出,则说明配置未生效,需进一步排查。 #### 2. 卸载旧版本冲突组件 如果之前安装过其他版本的 Docker 或者存在残留文件,可能导致当前版本无法正常工作。可以通过以下命令清理环境后再重新安装最新版 Docker[^2]: ```bash sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine ``` 之后按照官方文档指导完成全新部署流程即可。 #### 3. DNS 设置问题引发错误 某些场景下由于本地DNS解析异常也会造成类似的访问障碍现象。比如当你试图pull某个远端镜像却收到类似下面这样的反馈信息时: > Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: dial tcp: lookup www.ik8s.ip on 183.60.83.19:53: no such host 此时建议调整系统的DNS服务器指向更稳定的服务提供商例如Google Public DNS (8.8.8.8)[^3]. 修改方法如下所示: 编辑 `/etc/resolv.conf`, 添加或者替换现有条目为: ``` nameserver 8.8.8.8 nameserver 8.8.4.4 ``` 保存退出后再次测试联网状况看是否有改善. #### 4. 特定防火墙规则阻止通信 还需注意的是企业内部网络安全策略往往会对进出流量加以限制从而影响外部资源获取能力。因此有必要核查iptables设定是否存在针对目标端口号(此处即指代2376)所施加的封锁措施。可临时关闭firewalld来验证假设成立否: ```bash sudo systemctl stop firewalld ``` 当然生产环境中不推荐完全禁用防护机制而是应该精确放行所需请求路径。 最后附上一段简单的Java代码片段用于演示如何借助[Docker-java](https://github.com/docker-java/docker-java)库实现基本交互功能: ```java import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DockerClientBuilder; public class Main { public static void main(String[] args){ DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() .withDockerHost("tcp://localhost:2376") // Set remote endpoint here. .build(); DockerClient client = DockerClientBuilder.getInstance(config).build(); System.out.println(client.infoCmd().exec()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值