小白入门:Docker与Kubernetes自动化部署实践

334 阅读6分钟

小白入门:Docker与Kubernetes自动化部署实践

1. 引言

在现代软件开发中,Docker和Kubernetes已成为实现应用程序自动化部署和管理的重要工具。本文将探讨Docker和Kubernetes的核心概念,并通过一个简单的Java Web应用示例,展示如何将其容器化并部署到Kubernetes集群中,同时集成CI/CD流程。

2. 核心概念

2.1 Docker

Docker是一个开源平台,允许开发者打包应用及其依赖项到一个轻量级的容器中。容器是独立的、可移植的运行环境,确保应用在不同环境中一致运行。

image.png

  • 镜像:Docker镜像是一个只读的模板,用于创建容器。镜像包含了应用程序及其所有依赖项。
  • 容器:容器是镜像的可运行实例,具有隔离性和可移植性。
  • Dockerfile:用于定义如何构建Docker镜像的文本文件。 在Windows上安装Docker的步骤如下:

2.1.1. 检查系统要求

确保你的Windows版本符合Docker的要求:

  • Windows 10 64-bit: Pro, Enterprise, or Education (Build 15063 or later)
  • Windows 11
  • 启用Hyper-V和容器功能

2.1.2. 下载Docker Desktop

  1. 访问Docker官方网站:Docker Desktop
  2. 点击“Download for Windows”按钮,下载Docker Desktop安装程序。

2.1.3. 安装Docker Desktop

  1. 双击下载的安装程序(Docker Desktop Installer.exe)。
  2. 在安装向导中,选择“Install”以开始安装。
  3. 安装过程中,确保勾选“Enable WSL 2 features”选项(如果你使用的是Windows 10)。
  4. 安装完成后,点击“Close”以退出安装向导。

2.1.4. 启用WSL 2(如果需要)

如果你在安装过程中没有启用WSL 2,可以手动启用:

  1. 打开PowerShell(以管理员身份运行)。

  2. 运行以下命令启用WSL和虚拟机平台:

    dism.exe /Online /Enable-Feature /FeatureName:Microsoft-Windows-Subsystem-Linux /All /LimitAccess /Source:C:\Windows\winsxs
    dism.exe /Online /Enable-Feature /FeatureName:VirtualMachinePlatform /All /LimitAccess /Source:C:\Windows\winsxs
    
  3. 重启计算机。

2.1.5. 启动Docker Desktop

  1. 安装完成后,搜索并启动“Docker Desktop”。
  2. Docker会在后台运行,并在系统托盘中显示Docker图标。

2.1.6. 验证安装

打开命令提示符或PowerShell,输入以下命令以验证Docker是否安装成功:

docker --version

如果显示Docker的版本信息,则表示安装成功。

2.1.7. 配置Docker(可选)

你可以通过Docker Desktop的设置界面进行一些配置,例如调整资源限制(CPU、内存等)。

2.1.8. 运行示例容器

你可以运行一个简单的Docker容器来测试:

docker run hello-world

如果看到“Hello from Docker!”的消息,说明Docker已成功安装并运行。

完成以上步骤后,你就可以在Windows上使用Docker了!

2.2 Kubernetes

Kubernetes是一个开源的容器编排平台,旨在自动化容器化应用的部署、扩展和管理。

企业微信截图_20241121144749.png

  • Pod:Kubernetes中的基本调度单位,一个Pod可以包含一个或多个容器。
  • Service:定义了一组Pod的访问策略,提供负载均衡和服务发现。
  • Deployment:用于声明应用的期望状态,Kubernetes会自动管理Pod的创建、更新和扩展。

在Windows上安装Kubernetes的常用方法是通过Docker Desktop,它内置了Kubernetes支持。以下是详细的步骤:

2.2.1. 确保Docker Desktop已安装

首先,确保你已经按照前面的步骤安装了Docker Desktop,并且Docker正在运行。

2.2.2. 启用Kubernetes

  1. 打开Docker Desktop

    • 在系统托盘中找到Docker图标,右键点击并选择“Dashboard”或直接打开Docker Desktop应用。
  2. 进入设置

    • 在Docker Desktop界面,点击右上角的齿轮图标(Settings)。
  3. 启用Kubernetes

    • 在设置窗口中,选择“Kubernetes”选项卡。
    • 勾选“Enable Kubernetes”选项。
    • 点击“Apply & Restart”按钮,Docker Desktop将会重启并启用Kubernetes。

2.2.3. 验证Kubernetes安装

重启后,你可以通过以下步骤验证Kubernetes是否安装成功:

  1. 打开命令提示符或PowerShell

  2. 输入以下命令以检查kubectl(Kubernetes命令行工具)是否可用:

    kubectl version --client
    

    如果显示kubectl的版本信息,则表示安装成功。

  3. 检查Kubernetes集群状态:

    kubectl cluster-info
    

    如果返回集群信息,则表示Kubernetes已成功运行。

2.2.4. 运行示例应用

你可以运行一个简单的Kubernetes示例应用来测试集群是否正常工作:

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

然后,使用以下命令获取服务的URL:

kubectl get services

2.2.5. 访问应用

在浏览器中访问http://localhost:XXXX,其中XXXX是你在上一步中获取的NodePort端口号。

3. Web应用开发

3.1 创建简单的Java Web应用

我们将使用Spring Boot框架创建一个简单的Web应用。以下是基本的项目结构:

my-web-app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── demo/
│   │   │               └── DemoApplication.java
│   │   └── resources/
│   │       └── application.properties
└── pom.xml

image.png

DemoApplication.java

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping("/")
    public String hello() {
        return "Hello, Docker and Kubernetes!";
    }
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <spring-boot.version>2.5.4</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4. Docker容器化

4.1 创建Dockerfile

在项目根目录下创建一个名为Dockerfile的文件,内容如下:

image.png

# 使用官方的OpenJDK作为基础镜像
FROM openjdk:11-jre-slim
# 将jar包复制到容器中
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

4.2 构建Docker镜像

在项目根目录下执行以下命令构建Docker镜像:

mvn clean package
docker build -t my-web-app .

5. Kubernetes部署

5.1 创建Kubernetes配置文件

创建一个名为deployment.yaml的文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-web-app
  template:
    metadata:
      labels:
        app: my-web-app
    spec:
      containers:
      - name: my-web-app
        image: my-web-app:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-web-app
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: my-web-app

5.2 部署到Kubernetes

使用以下命令将应用部署到Kubernetes集群中:

kubectl apply -f deployment.yaml

6. CI/CD集成

为了实现CI/CD集成,可以使用Jenkins、GitLab CI或GitHub Actions等工具。以下是一个简单的GitHub Actions示例:

name: CI/CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: '11'

      - name: Build with Maven
        run: mvn clean package

      - name: Build Docker image
        run: docker build -t my-web-app .

      - name: Push Docker image
        run: |
          echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
          docker push my-web-app

7. 结论

通过以上步骤,我们成功创建了一个简单的Java Web应用,并将其容器化后部署到Kubernetes集群中。结合CI/CD流程,可以实现自动化构建和部署,提高开发效率和应用的可靠性。Docker与Kubernetes的结合为现代应用的开发和运维提供了强大的支持。