docker-java使用

github网址:https://github.com/docker-java/docker-java

1、修改/usr/lib/systemd/system/docker.service文件

1.1、修改文件

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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值