JAVA | 自己动手写一个Docker Client


一、 Docker Client
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker Client是Docker的客户端,负责发送命令。Docker服务器接受并处理命令。
JAVA | 自己动手写一个Docker Client_第1张图片
DockerClient在Linux中的使用:

 [root@localhost ~]# docker version
Client:
 Version:      1.13.1
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   092cba3
 Built:        Wed Feb  8 06:38:28 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.13.1
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   092cba3
 Built:        Wed Feb  8 06:38:28 2017
 OS/Arch:      linux/amd64
 Experimental: false

半月前学习了Docker Registry API,并的搭建了简单的私有仓库服务。 这次分享基于Docker API和JAVA语言开发一个docker-client。Docker API是一种远程命令行REST API。官网上对Go和Python开发docker-client介绍的比较详细。由于自己目前只学过JAVA。所以在官网上找到非官方类库的网址,进行学习。
二、 Portainer
Portainer是Docker的图形化管理工具。提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
可以通过官方文档进行学习。
Portainer的使用:
1.启动(在docker环境下)

[root@localhost ~]# docker pull docker.io/portainer/portainer
Using default tag: latest
Trying to pull repository docker.io/portainer/portainer ... 
latest: Pulling from docker.io/portainer/portainer
d1e017099d17: Pull complete 
a27de812d373: Pull complete 
Digest: sha256:ab096b92ed177b47adfa8a9a99e304d36596efa557b9627c066cee164cc39910
Status: Downloaded newer image for docker.io/portainer/portainer:latest

[root@localhost ~]#docker run -d -p 9000:9000\
                   --restart=always\
                   -v /var/run/docker.sock:/var/run/docker.sock \
                   --name portainer  docker.io/portainer/portainer\
                   
eb693abc912f22110eb7a990bbe8d9174469a2382b783968d3d1fc1c7d4ddd3d

2.访问
http://宿主机IP:9000(首次登陆需要注册用户名密码)
JAVA | 自己动手写一个Docker Client_第2张图片
创建本地连接
JAVA | 自己动手写一个Docker Client_第3张图片
3.登陆到Portainer,可以操作自己的docker机器。
JAVA | 自己动手写一个Docker Client_第4张图片
三、Java实现Portainer功能
主要是通过Docker API来实现Portainer中的功能。
开发之前的注意事项:

  1. 开启Docker daemon服务远程访问(暴露端口可以上外部机器访问自己的docker机器)
    不同系统有不同的方式。我使用的是CentOS7。三种方式都可以实现暴露端口。
    (1)vi /etc/docker/daemon.json (没有可以新建)
    添加:“hosts”: [“unix:///var/run/docker.sock”, “0.0.0.0:4789”]
    重启docker服务
    (2) vi /etc/sysconfig/docker
    添加:DOCKER_OPTS=’-H tcp://0.0.0.0:端口号 -H unix:///var/run/docker.sock’
    然后:vi /usr/lib/systemd/system/docker.service
    添加:ExecStart=$DOCKER_OPTS
    重启docker服务
    (3)vi /usr/lib/systemd/system/docker.service
    添加: ExecStart=/usr/lib/dockerd-current -H tcp://0.0.0.0:端口号-H unix:///var/run/docker.sock
    重启docker服务
    添加配置后,要远程访问还需要关闭
    方法一:关闭防火墙
        [root@localhost ~]#systemctl stop firewalld.service
        [root@localhost ~]#systemctl disable firewalld.service

方法二 :清空规则

         [root@localhost ~]#iptables -F
  1. Eclipse中创建maven项目
    创建一个maven项目,导入依赖包。在pom.xml里导入
<dependency>
    <groupId>com.spotifygroupId>
    <artifactId>docker-clientartifactId>
    <version>8.11.7version>
dependency>

在这个网上可以找到docker-client最新的版本http://mvnrepository.com/artifact/com.spotify/docker-client。
3. 实现部分功能
获取容器详情代码实现

//ip是在自己虚拟机的ip
Final DockerClient docker =DefaultDockerClient.builder().uri(URI.create("http://192.168.223.4:4789")).build();

try {
    		//获取容器详情,输入参数是容器ID
    		final ContainerInfo info = docker.inspectContainer("96ef849f3108");
               System.out.println(info.toString());
		} catch (DockerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

容器的总数以及正在运行的容器,停止的容器。
如图:
这里写图片描述

final List<Container> containers = docker.listContainers(ListContainersParam.allContainers());
final List<Container> containersRuning  = docker.listContainers();
int containersStop=0;
for(int i=0;i<containers.size();i++) {			
          if(containers.get(i).state().equals("exited")) {
    	       containersStop++;
    			}
    		}
System.out.println("容器总数:"+containers.size());
System.out.println("正在运行的容器数量:"+containersRuning.size());
System.out.println("停止的容器:"+containersStop);

JAVA | 自己动手写一个Docker Client_第5张图片

你可能感兴趣的:(docker)