docker-java使用docker 2375或者2376端口

一、docker 使用TLS开启2376

1.1  使用Openssl 生成CA、服务器和客户端密钥

#cd 到证书生成目录

cd /etc/.docker/certs

$HOST为服务器ip

$ openssl genrsa -aes256 -out ca-key.pem 4096

Generating RSA private key, 4096 bit long modulus

............................................................................................................................................................................................++

........++

e is 65537 (0x10001)

Enter pass phrase for ca-key.pem:

Verifying - Enter pass phrase for ca-key.pem:

$ openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem

Enter pass phrase for ca-key.pem:

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:CN

State or Province Name (full name) [Some-State]:Henan

Locality Name (eg, city) []:Zhengzhou

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Inspur

Organizational Unit Name (eg, section) []:Inspur

Common Name (e.g. server FQDN or YOUR name) []:$HOST

Email Address []:wjy@inspur.co

1.2  生成服务器密钥和证书签名请求

$ openssl genrsa -out server-key.pem 4096

Generating RSA private key, 4096 bit long modulus

.....................................................................++

.................................................................................................++

e is 65537 (0x10001)

$ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

1.3  指定IP地址和DNS名称

echo subjectAltName = DNS:$HOST,IP:10.151.11.52,IP:127.0.0.1,IP:0.0.0.0 >> extfile.cnf

#将docker守护进程密钥的扩展使用属性设置为仅使用于服务器的身份验证

echo extendedKeyUsage = serverAuth >> extfile.cnf

1.4  生成签名证书

$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \

  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

Signature ok

subject=/CN=your.host.com

Getting CA Private Key

Enter pass phrase for ca-key.pem:

1.5  生成客户端密钥和证书签名请求

$ openssl genrsa -out key.pem 4096

Generating RSA private key, 4096 bit long modulus

.........................................................++

................++

e is 65537 (0x10001)

$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr

$ echo extendedKeyUsage = clientAuth > extfile-client.cnf

#生成签名证书

$ openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \

  -CAcreateserial -out cert.pem -extfile extfile-client.cnf

Signature ok

subject=/CN=client

Getting CA Private Key

Enter pass phrase for ca-key.pem:

#删除证书签名请求和扩展配置文件

$ rm -v client.csr server.csr extfile.cnf extfile-client.cnf

#删除密钥的写权限,保护密钥不受意外损坏

$ chmod -v 0400 ca-key.pem key.pem server-key.pem

$ chmod -v 0444 ca.pem server-cert.pem cert.pem

#生成证书结果:

 

1.6  开启docker 2376端口

#打开docker service文件

vim /etc/systemd/system/docker.service

在ExecStart=/usr/bin/dockerd-current 后面增加

 --tlsverify --tlscacert=/etc/.docker/certs/ca.pem --tlscert=/etc/.docker/certs/server-cert.pem \--tlskey=/etc/.docker/certs/server-key.pem -H tcp://0.0.0.0:2376  -H unix:///var/run/docker.sock

#重启docker

systemctl daemon-reload

systemctl restart docker

1.7  配置客户端

1. 创建证书目录

mkdir -pv ~/.docker/certs/cd ~/.docker/certs/

2. 将服务端/etc/.docker/certs中ca.pem、cert.pem、key.pem这3个文件拷贝到当前目录

scp ca.pem cert.pem key.pem ~/.docker/certs

文件为ca.pem、cert.pem、key.pem,IDEA工具连接直接选择客户端证书文件夹就行

1.8  IDEA连接docker配置(可选)

1、打开IDEA,点击File->Settings, 在搜索栏输入docker

2、在API URL中端口可以输入自己开启的2375或者2376

 

二、docker 开启2375端口

#打开docker service文件

vim /etc/systemd/system/docker.service

在ExecStart=/usr/bin/dockerd-current 后面增加 -H tcp://0.0.0.0:2375

#重启docker

systemctl daemon-reload

systemctl restart docker

三、docker-java配置使用2375或者2376端口

3.1 pom.xml中引入依赖的maven包

<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java</artifactId>
    <version>3.2.5</version>
</dependency>

<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java-core</artifactId>
    <version>3.2.5</version>
</dependency>

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

3.2连接2376端口

DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
        .withDockerHost("tcp://10.151.11.51:2376")
        .withDockerTlsVerify(true)
        .withDockerCertPath("~/.docker/certs")
        .withRegistryUsername("admin")
        .withRegistryPassword("123456a?")
        .withRegistryUrl("http://10.151.11.51:5000")
        .build();

DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
        .dockerHost(config.getDockerHost())
        .sslConfig(config.getSSLConfig())
        .build();

DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient);

3.3 连接2375端口

DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost("tcp://10.151.11.51:2375")
                .withDockerTlsVerify(false)
//                .withDockerCertPath("~/.docker/certs")
                .withRegistryUsername("admin")
                .withRegistryPassword("123456a?")
                .withRegistryUrl("http://10.151.11.51:5000")
                .build();

DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
                .dockerHost(config.getDockerHost())
                .sslConfig(config.getSSLConfig())
                .build();

DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient);

配置完成,可以使用docker-java对docker服务器的镜像和镜像仓库中的镜像进行操作。

参考链接:

https://docs.docker.com/engine/security/https/

https://github.com/docker-java/docker-java/blob/3.2.5/docs/getting_started.md

### 解决方案 当尝试通过 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()); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莹火233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值