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
链接: Windows | Docker Docs
之后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-pippip 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.DefaultDockerClientConfigDockerClientConfig 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>() {@Overridepublic 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);// 搜索镜像 这里搜索的是wordpressList<SearchItem> dockerSearch = dockerClient.searchImagesCmd("wordpress").exec();System.out.println("Search returned" + dockerSearch.toString());// 拉取镜像文件dockerClient.pullImageCmd("wordpress:latest").exec(new ResultCallback.Adapter<PullResponseItem>() {@Overridepublic void onNext(PullResponseItem object) {System.out.println(object.getStatus());}}).awaitCompletion();// 创建container 并测试// createtry {
// 创建容器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();}}}
}