??開啟Docker遠程訪問
參考上一篇文章:Docker設(shè)置開啟遠程訪問
??創(chuàng)建項目并引入docker-java依賴
<!-- docker java -->
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.2.13</version>
</dependency>
<!-- docker java httpclient -->
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-httpclient5</artifactId>
<version>3.2.13</version>
</dependency>
Apache HttpClient 5介紹:
This transport is based on Apache HttpClient library version 5, which has a great flexibility and allows us to implement all Docker-specific features and protocols required, without having to use internal APIs or anything.
It has everything to become the default transport of docker-java in future releases.
Apache HttpClient 5基于Apache HttpClient庫實現(xiàn),具有很大的靈活性,我們無需使用docker內(nèi)部API,就可以實現(xiàn)所有Docker特定功能和協(xié)議。并且在未來的版本中,它將成為docker java的默認傳輸工具。
除Apache HttpClient 5以外,還可以使用Zerodep、OkHttp、Jersey和Netty實現(xiàn)docker的連接傳輸。
docker的一些配置選項
訪問docker的配置
docker:
host: tcp://192.168.1.17:2375
api-version: 1.41
??連接docker
import com.github.dockerjava.core.DockerClientConfig
import com.github.dockerjava.core.DefaultDockerClientConfig
/**
* 連接docker服務(wù)器
*
* @return
*/
public DockerClient connect() {
// 配置docker CLI的一些選項
DefaultDockerClientConfig config = DefaultDockerClientConfig
.createDefaultConfigBuilder()
.withDockerTlsVerify(DOCKER_TLS_VERIFY)
.withDockerHost(HOST)
// 與docker版本對應(yīng),參考https://docs.docker.com/engine/api/#api-version-matrix
// 或者通過docker version指令查看api version
.withApiVersion(API_VERSION)
.withRegistryUrl(REGISTRY_URL)
.build();
// 創(chuàng)建DockerHttpClient
DockerHttpClient httpClient = new ApacheDockerHttpClient
.Builder()
.dockerHost(config.getDockerHost())
.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環(huán)境信息");
System.out.println(infoStr);
return dockerClient;
}
額外的一些配置
-
DOCKER_HOST
Docker的地址,比如:tcp://localhost:2376
或者unix:///var/run/docker.sock
-
DOCKER_TLS_VERIFY
是否開啟 TLS 驗證 (http
和https
之間切換) -
DOCKER_CERT_PATH
TLS 驗證的證書路徑 -
DOCKER_CONFIG
其他docker配置文件的路徑 (比如.dockercfg
) -
api.version
API version版本 -
registry.url
下載源地址(docker鏡像存放的地址) -
registry.username
登陸用戶名 (推送鏡像到docker云倉庫時需要) -
registry.password
登陸用戶密碼(推送鏡像到docker云倉庫時需要) -
registry.email
登陸賬戶的郵箱(推送鏡像到docker云倉庫時需要)
??拉取鏡像
/**
* 拉取鏡像
*
* @param client
* @param imageName
* @return
* @throws InterruptedException
*/
public boolean pullImage(DockerClient client, String imageName) {
boolean isSuccess = false;
try {
isSuccess = client.pullImageCmd(imageName)
.start()
.awaitCompletion(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
return isSuccess;
}
}
??查看鏡像信息
/**
* 查看鏡像詳細信息
*
* @param client
* @param imageName
* @return
*/
public String inspectImage(DockerClient client, String imageName) {
InspectImageResponse response = client.inspectImageCmd(imageName).exec();
System.out.println(response.toString());
System.out.println(JSONObject.toJSONString(response));
return JSONObject.toJSONString(response);
}
??刪除鏡像
/**
* 刪除鏡像
*
* @param client
* @param imageName
*/
public void removeImage(DockerClient client, String imageName) {
client.removeImageCmd(imageName).exec();
}
??構(gòu)建鏡像
/**
* 構(gòu)建鏡像
*
* @param client
* @param dockerProp
* @return
*/
public String buildImage(DockerClient client, DockerProp dockerProp) {
ImmutableSet<String> tag = ImmutableSet.of(dockerProp.getImageName() + ":" + dockerProp.getImageTag());
String imageId = client.buildImageCmd(new File(dockerProp.getDockerfilePath()))
.withTags(tag)
.start()
.awaitImageId();
return imageId;
}
??給鏡像打tag
/**
* 給鏡像打tag
* @param client
* @param dockerProp
*/
public void tagImage(DockerClient client, DockerProp dockerProp) {
client.tagImageCmd(dockerProp.getImageName(), dockerProp.getRespository(), dockerProp.getTag()).exec();
}
??加載鏡像文件
/**
* 加載鏡像文件
*
* @param client
* @param inputStream
*/
public static void loadImage(DockerClient client, InputStream inputStream) {
client.loadImageCmd(inputStream).exec();
}
??獲取鏡像列表
/**
* 獲取鏡像列表
*
* @param client
* @return
*/
public List<Image> imageList(DockerClient client) {
List<Image> imageList = client.listImagesCmd().withShowAll(true).exec();
return imageList;
}
??創(chuàng)建容器
/**
* 創(chuàng)建容器
*
* @param client
* @return
*/
public CreateContainerResponse createContainers(DockerClient client, DockerProp dockerProp) {
// 端口綁定
Map<Integer, Integer> portMap = Optional.ofNullable(dockerProp).map(DockerProp::getPartMap).orElse(new HashMap<>());
Iterator<Map.Entry<Integer, Integer>> iterator = portMap.entrySet().iterator();
List<PortBinding> portBindingList = new ArrayList<>();
List<ExposedPort> exposedPortList = new ArrayList<>();
while (iterator.hasNext()) {
Map.Entry<Integer, Integer> entry = iterator.next();
ExposedPort tcp = ExposedPort.tcp(entry.getKey());
Ports.Binding binding = Ports.Binding.bindPort(entry.getValue());
PortBinding ports = new PortBinding(binding, tcp);
portBindingList.add(ports);
exposedPortList.add(tcp);
}
CreateContainerResponse container = client.createContainerCmd(dockerProp.getImageName())
.withName(dockerProp.getContainerName())
.withHostConfig(newHostConfig().withPortBindings(portBindingList))
.withExposedPorts(exposedPortList).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();
}
部分代碼未展示,全部代碼請點擊源碼查看源碼:https://github.com/BerBai/JavaExample/tree/master/dockerjavademo
參考
https://github.com/docker-java/docker-java/blob/master/docs/getting_started.md
https://docs.docker.com/
其他系列文章
docker 安裝 與 卸載 centos
Windows11 安裝Docker,安裝至D盤(其他非C盤皆可)
Windows11 Docker鏡像存儲路徑更改(非C盤路徑)
Dockerfile 文件結(jié)構(gòu)、docker鏡像構(gòu)建過程詳細介紹
Dockerfile文件中CMD指令與ENTRYPOINT指令的區(qū)別
構(gòu)建Docker鏡像指南,含實戰(zhàn)案例
Docker 制作自定義化的Tomcat鏡像
docker 安裝 mysql 并映射數(shù)據(jù)庫存放路徑及配置文件
docker安裝tomcat 映射配置文件、日志文件
docker安裝nginx,配置nginx,并成功訪問
docker安裝redis并將配置文件和數(shù)據(jù)文件映射到外部
Docker 容器互聯(lián) --link 和 自定義網(wǎng)絡(luò)
docker 完成 redis集群搭建
Docker Compose 簡介、安裝、初步體驗
Docker Compose學(xué)習(xí)之docker-compose.yml編寫規(guī)則 及 實戰(zhàn)案例
Docker Compose配置springboot微服務(wù)項目
Docker Swarm 初步認識 及 集群搭建
Docker設(shè)置開啟遠程訪問
docker-java 用Java操作docker創(chuàng)建容器并運行運行容器文章來源:http://www.zghlxwxcb.cn/news/detail-408992.html
VMware配置網(wǎng)絡(luò),主機互通,可上網(wǎng)文章來源地址http://www.zghlxwxcb.cn/news/detail-408992.html
到了這里,關(guān)于docker-java 用Java操作docker創(chuàng)建容器并運行運行容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!