k8s和Docker关系简单说明

本文对比Docker与Kubernetes在虚拟化和部署上的优势,解析二者如何简化应用程序管理和集群自动化,适合初学者理解容器技术和集群管理的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目用到kubernetes(以下简称k8s,k和s之间有8个字母)。虽然之前也有简单使用过,但最近发现k8s概念较多,命令也有些不够用了,故想借此机会写点东西,更全面认识并使用k8s。本篇文章目的:让你更全面了解k8s概念,以及学到在工作中常用的操作。整体更偏向于原理和应用。在正式开始k8s之前,我们先看看k8s和Docker的关系,分别从虚拟化角度、部署方式角度叙述why use容器,话不多说,开干。

        目前发现并没有将kubernetes和Docker技术产生背景和需求进行比较的文章,本文从最纯正的官方定义角度出发并展开,阐述二者产生背景及与传统技术对比。

简要介绍:
    官方定义1:Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。

    官方定义2:k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

与传统技术对比:
    接下来我们看两张经典的图:

一、从虚拟化角度:

图1

        上图是Docker容器(可用k8s管理的玩意儿)与传统虚拟化方式的不同之处,传统的虚拟技术,在将物理硬件虚拟成多套硬件后,需要再每套硬件上都部署一个操作系统,接着在这些操作系统上运行相应的应用程序。而Docker容器内的应用程序进程直接运行在宿主机(真实物理机)的内核上,Docker引擎将一些各自独立的应用程序和它们各自的依赖打包,相互独立直接运行于未经虚拟化的宿主机硬件上,同时各个容器也没有自己的内核,显然比传统虚拟机更轻便。 每个集群有多个节点,每个节点可,我们的kuberbete就是管理这些应用程序所在的小运行环境(container)而生。
二、从部署角度

图2

        注意,大家别把这幅图与上面Docker的那张图混淆了,图1是从虚拟化角度,说明了为应用提供必要的运行环境所需要做的虚拟化操作(即:传统:虚拟出的虚拟机装操作系统、Docker:容器引擎管理下的容器)。

        而图2是在这些具体运行环境上进行真实应用部署时的情况,传统方式是将所有应用直接部署在同一个物理机器节点上,这样每个App的依赖都是完全相同的,无法做到App之间隔离,当然,为了隔离,我们也可以通过创建虚拟机的方式来将App部署到其中(就像图1上半部分那样),但这样太过繁重,故比虚拟机更轻便的Docker技术出现,现在我们通过部署Container容器的技术来部署应用,全部Container运行在容器引擎上即可。既然嫌弃虚拟机繁重,想用Docker,那好,你用吧,怎么用呢?手动一个一个创建?当然不,故kubernetes技术便出现了,以kubernetes为代表的容器集群管理系统,这时候就该上场表演了。

        说白了,我们用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。另外,kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。希望我这篇文章中简单的描述能让你对两者有所理解和认识。
 

### 使用 Kubernetes Docker 部署 Java 项目的教程 #### 准备工作 在开始之前,需要确保已经安装了必要的工具环境。这包括 JDK、Maven 或 Gradle 构建工具、Docker 客户端以及 kubectl 命令行工具[^1]。 #### 创建 Java 项目 假设我们有一个简单的 Spring Boot 应用程序作为目标项目。可以通过以下命令创建一个新的 Spring Boot 项目: ```bash spring init --dependencies=web my-java-app cd my-java-app ``` 此操作将生成一个基础的 Web 项目结构,并包含 `pom.xml` 文件用于 Maven 构建管理。 #### 添加 Docker 支持 为了使应用程序能够被封装为 Docker 映像,在构建过程中需引入插件支持。编辑 `pom.xml` 并加入如下配置片段来启用 Docker 插件功能: ```xml <build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>${project.artifactId}</repository> <tag>${project.version}</tag> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> </plugins> </build> ``` 上述 XML 片段定义了一个名为 `dockerfile-maven-plugin` 的插件实例化过程及其参数设置,它会在执行特定生命周期阶段时自动完成映像制作与推送动作。 #### 编写 Dockerfile 在同一目录下新建文件名叫做 `Dockerfile` 的纯文本文档,其内容大致如下所示: ```dockerfile FROM openjdk:17-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] ``` 这段脚本描述了一种基于官方 OpenJDK 镜像的基础层之上叠加当前应用二进制产物的方式形成最终可分发版本的方法论。 #### 测试本地镜像构建流程 通过运行下面这条指令验证整个自动化链条是否正常运作: ```bash mvn clean package dockerfile:build ``` 如果一切顺利的话,则应该能看到类似于这样的日志输出表明成功建立了新的容器镜像资源: ``` [INFO] Building image my-java-app:0.0.1-SNAPSHOT ... Successfully built abcdefghijklmnopqrstuvwxyz ``` #### 推送至远程仓库 继续利用 maven 生命周期进一步把刚造好的成果物提交给指定位置存储起来以便稍后引用加载之用: ```bash mvn dockerfile:push ``` 此时依据实际网络状况等待片刻之后即可确认上传完毕状态消息显示出来. #### 设定 K8S 资源清单 最后一步就是编写适合集群调度使用的 YAML 格式的资源配置说明书样例形式可能看起来像是这样子的样子: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-java-deployment spec: replicas: 2 selector: matchLabels: app: my-java-app template: metadata: labels: app: my-java-app spec: containers: - name: my-java-container image: your-dockerhub-account/my-java-app:latest ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: my-java-service spec: type: LoadBalancer selector: app: my-java-app ports: - protocol: TCP port: 80 targetPort: 8080 ``` 这里分别声明了一个副本数设定为两个节点规模的应用部署计划还有对外暴露服务地址端口转换关系等内容细节部分[^2]. #### 提交到云端平台 登录腾讯云控制台界面找到对应区域下的 K8S 实例选项卡页面点击导入现有 manifest 文档按钮上传刚才准备妥当后的 yaml 文件即刻生效启动全部环节运转机制直至完全就绪为止. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值