1、什么是Docker
Docker是一个开源的平台 [2],用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持Docker的环境中运行。容器彼此隔离,但可以通过特定的通道相互传递信息。
Docker提供了一个轻量级的虚拟化解决方案。由于运行在同一计算机上的所有容器共享同一个操作系统内核,避免了启动与维护虚拟机的开销。因此相比于传统的虚拟机,Docker容器更加轻便、快速、容易部署。使用Docker,开发者可以避免在两台计算机上运行效果不一致的问题,容器提供了一致的行为,进而使得应用程序在不同环境的计算机上有相同的运行效果。
其实也可以这样来理解 ,我们在部署使用一个java项目时,我们需要去配置运行环境。而docker容器就好似预制菜,当我们做好一个项目后,只需要我们将自己的项目打包成一个docker容器上传到docker平台中,就可以供别人直接下载使用,别人在部署的时候就不需要进行复杂的环境安装。
2、Docker有什么用
- 环境一致性:docker可以确保开发、测试和生产环境的一致性。通过使用容器,可以在不同的机器上运行相同的环境配置,避免了“在我的机器上可以运行”的问题。
- 隔离性:每个 Docker 容器都在自己的环境中运行,不会影响到其他容器或主机的环境,这提供了很好的隔离性。
- 可移植性:Docker 容器可以在任何支持 Docker 的操作系统上运行,这使得应用部署和迁移变得非常方便。
- 快速部署和扩展:Docker 容器可以快速启动,这意味着可以快速部署新的应用实例,也可以在需要时快速扩展服务。
- 资源高效:与传统的虚拟机相比,Docker 容器不需要为每个应用都运行一个完整的操作系统,因此它们占用的系统资源更少,可以更高效地利用硬件资源。
- 持续集成和持续部署(CI/CD):Docker 可以集成到 CI/CD 流程中,使得自动化测试和部署变得更加容易。
- 微服务架构:Docker 支持微服务架构的开发模式,允许将大型应用分解为多个小的、独立的服务,这些服务可以独立部署和扩展。
3、如何去安装与使用Docker
//centos7 直接使用yum安装
sudo yum install -y docker-ce docker-ce-cli containerd.io
//ubuntu 使用apt命令安装
sudo apt-get install docker-ce docker-ce-cli containerd.io
//windows
windows安装docker
去官网下载Docker Desktop on Windows
之后win11专业版或企业版可以去控制面板打开(这一步我看网上有人说不做也可以成功,先安装Docker Desktop on Windows 报错了再稿这一步把)
win + r 键入 control 打开控制面板 找到如下路径
控制面板\程序\程序和功能 找到 启动或关闭windows功能
之后找到Hyper-V 全部勾选重启即可。
也可以使用命令 打开power shell
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
//设置 Windows 操作系统中的 Hyper-V 启动类型
bcdedit /set hypervisorlaunchtype auto
如果是家庭版,可以创建一个txt文档 然后输入一下代码
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
之后后缀名改成.bat以管理员运行 一直键入Y 即可 完成后重启
重启没有报错的话 打开cmd 键入 查看一下docker版本以及是否安装成功
docker -v
出现版本号基本就算成功了
成功后登录
之后进入设置配置docker镜象源
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://docker.211678.top",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.m.daocloud.io",
"https://do.nark.eu.org",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://docker.awsl9527.cn"
]
配置完之后点击
之后打开power shell
运行
docker run hello-world
等待拉取 拉去成功后主页可以看到
之后我们进入页面 点击启动容器,发现启动不了
之后去命令行执行
wsl -l -v
发现只有docker-desktop,少了一个linux系统,我们还需要去下载一个内置ubuntu
进入微软商店,找到ubuntu LTS (任意版本)获取即可
之后进入docker desktop 找到设置开启ubuntu
之后进入ubuntu bash命令行页面(win + r 键入 bash 也可以通过开始菜单打开)
给ubuntu22.04安装docker ce
授予当前用户root权限运行dockerCLI
//如果显示没有docker用户组可以自行创建 sudo groupadd docker
sudo usermod -aG docker $USER
//安装dockercompose
sudo apt-get install -y python3 python3-pip
pip install --user docker-compose
之后再去运行hello-world你会发现仍然启动不了 这是因为当主进程完成时,docker 容器就会退出。hello-world
主进程只会打印一些文本然后退出,因此容器也会退出。(真XX)
我们这里换一个容器来执行
docker run --name nginx-demo -p 8080:80 -d nginx
加载完后你就会发现能正常访问了
4、使用java代码对docker容器进行基本操作
4.1 开启docker远程连接
打开docker desktop 找到设置
之后找到docker engine 配置hosts暴露端口
"hosts": [
"tcp://0.0.0.0:2375"
]
重启docker
配置防火墙
打开powershell 运行
netsh interface portproxy add v4tov4 listenport=2375 connectaddress=127.0.0.1 connectport=2375 listenaddress=<your-public-ip> protocol=tcp
之后测试
docker -H 127.0.0.1:2375 info
1.创建maven项目 导入相关依赖
创建一个maven项目
添加docker-java依赖
<!-- docker java -->
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-httpclient5</artifactId>
<version>3.2.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.docker-java/docker-java -->
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.4.0</version>
</dependency>
2.创建类 实例化DockerClientConfig
来配置docker-java
实例化DockerClientConfig 构建器配置客户端的每个属性 告诉java如何访问Docker
import com.github.dockerjava.core.DockerClientConfig
import com.github.dockerjava.core.DefaultDockerClientConfig
DockerClientConfig custom = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost("tcp://docker.somewhere.tld:2376")
.withDockerTlsVerify(true)
.withDockerCertPath("/home/user/.docker")
.withRegistryUsername(registryUser)
.withRegistryPassword(registryPass)
.withRegistryEmail(registryMail)
.withRegistryUrl(registryUrl)
.build();
DOCKER_HOST
Docker 主机 URL,例如 或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 版本,例如 .1.23
registry.url
您的注册表地址。registry.username
您的注册表用户名(推送容器时需要)。registry.password
您的注册表密码。registry.email
您的注册表电子邮件。
实例化DockerClient客户端
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
.dockerHost(custom.getDockerHost()) //传入主机信息
.sslConfig(custom.getSSLConfig()) //SSL配置,用于处理HTTPS连接时的安全套接层配置,确保与Docker守护进程的通信是加密的
.maxConnections(100) //设置了HTTP客户端可以维护的最大连接数
.connectionTimeout(Duration.ofSeconds(30)) //置了建立到Docker守护进程连接的超时时间,这里设置为30秒
.responseTimeout(Duration.ofSeconds(30)) //设置了等待Docker守护进程响应的超时时间,这里也设置为30秒
.build();
之后根据提供的配置信息(custom)和HTTP客户端(httpClient),创建一个能够与Docker守护进程进行通信的客户端实例
DockerClient dockerClient = DockerClientImpl.getInstance(custom,httpClient);
3 功能
获取用户信息
Info info = dockerClient.infoCmd().exec();
System.out.println(info);
搜索镜像
ist<SearchItem> dockerSearch = dockerClient.searchImagesCmd("wordpress").exec();
System.out.println("Search returned" + dockerSearch.toString());
拉取镜像
dockerClient.pullImageCmd("wordpress:latest").exec(new ResultCallback.Adapter<PullResponseItem>() {
@Override
public void onNext(PullResponseItem object) {
System.out.println(object.getStatus());
}
}).awaitCompletion();
创建运行容器
try {
// 创建容器
CreateContainerResponse containerResponse = dockerClient.createContainerCmd("wordpress")
.withName("my-wordpress") //设置容器名称
.withPortBindings(PortBinding.parse("8082:80")) //将容器80端口映射到主机8082端口
.exec();
// 启动容器
dockerClient.startContainerCmd(containerResponse.getId()).exec();
System.out.println("容器id为:" + containerResponse.getId() + "创建成功");
} catch (Exception e){
e.printStackTrace();
}finally {
try {
// 关闭docker客户端连接
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
整体代码
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.model.*;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.core.command.EventsResultCallback;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import com.github.dockerjava.transport.DockerHttpClient;
import java.io.Closeable;
import java.io.IOException;
import java.time.Duration;
import java.util.List;
/**
* @Author: Insight
* @Description: TODO
* @Date: 2024/11/25 21:00
* @Version: 1.0
*/
public class main {
public static void main(String[] args) throws InterruptedException {
// 配置Docker连接
DockerClientConfig custom = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost("tcp://127.0.0.1:2375")
.withDockerTlsVerify(true)
.withDockerCertPath("C:\\Users\\ASUS\\.docker")
.withRegistryUsername("maisan00")
.withRegistryPassword("ms04023519.")
.withRegistryEmail("1684468484@qq.com")
.withRegistryUrl("https://index.docker.io/v1/")
.build();
// 实例化DockerHttpClient http客户端
DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
.dockerHost(custom.getDockerHost())
.sslConfig(custom.getSSLConfig())
.maxConnections(100)
.connectionTimeout(Duration.ofSeconds(30))
.responseTimeout(Duration.ofSeconds(30))
.build();
// 根据提供的配置信息(custom)和HTTP客户端(httpClient),创建一个能够与Docker守护进程进行通信的客户端实例。
// 这个客户端实例可以用来执行各种Docker操作,比如创建、启动、停止容器,拉取和推送镜像等
DockerClient dockerClient = DockerClientImpl.getInstance(custom,httpClient);
// 获取用户镜像组信息 用于测试是否连接成功
Info info = dockerClient.infoCmd().exec();
System.out.println(info);
// 搜索镜像 这里搜索的是wordpress
List<SearchItem> dockerSearch = dockerClient.searchImagesCmd("wordpress").exec();
System.out.println("Search returned" + dockerSearch.toString());
// 拉取镜像文件
dockerClient.pullImageCmd("wordpress:latest").exec(new ResultCallback.Adapter<PullResponseItem>() {
@Override
public void onNext(PullResponseItem object) {
System.out.println(object.getStatus());
}
}).awaitCompletion();
// 创建container 并测试
// create
try {
// 创建容器
CreateContainerResponse containerResponse = dockerClient.createContainerCmd("wordpress")
.withName("my-wordpress") //设置容器名称
.withPortBindings(PortBinding.parse("8082:80")) //将容器80端口映射到主机8082端口
.exec();
// 启动容器
dockerClient.startContainerCmd(containerResponse.getId()).exec();
System.out.println("容器id为:" + containerResponse.getId() + "创建成功");
} catch (Exception e){
e.printStackTrace();
}finally {
try {
// 关闭docker客户端连接
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}