iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 14
1
DevOps

用30天來介紹和使用 Docker系列 第 14

Day14:使用 third party 的 Jar 呼叫 Docker Restful API

  • 分享至 

  • xImage
  •  

昨天有介紹如何使用 Docker Restful API 來操作 Docker,像是 Pull Image、Create Container、Start Container、Delete Container……等等,使用比較不方便的地方是 URL 或是要傳遞的參數太長記不太起來,所以每次透過 Restful API 操作 Docker 時都需要查看官方的文件才知道要使用哪些 URL 或是要傳遞哪些的參數。

在 GitHub 上有找到,有人把呼叫 Docker 的 Restful API,把它包在 Java 程式的 Class Method 裡,這樣我們就不用去找 Docker Restful API 的 URL 或需要傳遞的參數,只要把 third party 的 jar 檔 import 到 Project,然後就可以像是在撰寫一般 Java 程式的方式去操作 Docker 的 Restful API。

今天要介紹的專案名稱叫 docker-client,它的 GitHub 網址如下,有興趣的話可以去研究它的 Source Code:
https://github.com/spotify/docker-client

一. 使用 docker-client 的 third party 前準備

  1. 寫這個 Sample Code 我是使用 Gradle 的方式來建構專案,另外也可以使用 Maven、Sbt……等等的方式來建構專案。
    build.gradle 的設定如下
apply plugin: 'java'
apply plugin: 'eclipse'

eclipse {
  jdt {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
  }
}

repositories {
  mavenCentral()
  maven {
     url "http://central.maven.org/maven2"
  }
}

dependencies {
    compile 'com.spotify:docker-client:8.9.2'
}

最主要的部份是要把 docker-client:8.9.2 的 Jar檔下載和import 到 project,另外此專案需要使用 JDK8

  1. 整個專案的 sample code 我放在 GitHub 上,網址如下,有興趣的話可以 clone 下來研究看看:
    https://github.com/jackyoh/docker-client-example.git

簡單的列出使用步驟:
(1) $ git clone https://github.com/jackyoh/docker-client-example.git
(2) 在 command line 輸入 $ gradle eclipse (第一次使用 gradle 會花費一些時間下載相依的 Jar 檔)
(3) 到 eclipse 上按 File -> Import -> General -> Existing Project into workspace -> 選擇 docker-client-example 的資料夾路徑 -> OK

二. 程式說明

String dockerImageName = "nginx:latest";
		
//Part1
final DockerClient docker = DefaultDockerClient.fromEnv().build();
docker.pull(dockerImageName);
		
//Part2
final Map<String, List<PortBinding>> portBindings = new HashMap<>();
final HostConfig hostConfig = HostConfig.builder().portBindings(portBindings).build();
List<PortBinding> hostPorts = new ArrayList<>();
hostPorts.add(PortBinding.of("0.0.0.0", "8080"));
portBindings.put("80", hostPorts);
		
final ContainerConfig containerConfig = ContainerConfig.builder()
			    .hostConfig(hostConfig)
			    .image(dockerImageName)
			    .build();
			    
final ContainerCreation creation = docker.createContainer(containerConfig);
		
//Part3
final String id = creation.id();
docker.startContainer(id);

這一個程式的目的是要把 nginx:latest 的 Docker Image Pull 下來,然後建立 Container 之後,就把 Container 執行起來,主要分為三個部份說明如下:
Part1:把 nginx:latest 的 Docker Image 從 Docker Hub pull 到 client
Part2:建立Container 並把Container 內部的 80 port Mapping到 host的8080 port
Part3:啟動執行 Docker Container

三. 執行結果
可直接打開 Browser 輸入Host 的 IP,URL 為http://192.168.182.130:8080/,就可以看到以下的畫面:
https://ithelp.ithome.com.tw/upload/images/20171217/20103456NNZ1GkrLGv.png

使用了 docker-client 的 third party 之後對於我們在撰寫 Java 的 Unit Test測試程式有很大的幫助,可以在 BeforeClass 時建立 Docker Container 的環境(例如:mysql Data Base 的環境),然後在 AfterClass 執行完成之後把 Docker Container 刪除。

這樣在操作 Docker 時更加的直覺,不用去記憶很多的 URL 或者是傳遞的參數。


上一篇
Day13:如何使用 Docker Restful API
下一篇
Day15:實作簡單的 service 程式打包成 Docker Image(一)
系列文
用30天來介紹和使用 Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言