[Container-based deployment, expansion and management] 3.2 Container-based application deployment and upgrade

Past review:

Chapter 1: [Cloud Native Concepts and Technologies]

Chapter 2: [Containerized Application Design and Development]

Chapter 3: [3.1 Construction of Container Orchestration System and Kubernetes Cluster]

3.2 Container-based application deployment and upgrades

3.2 Container-based application deployment and upgrades

Container-based application deployment and upgrades typically involve the following steps:

  1. Create a container image : First, you need to create a container image that will contain all the dependencies and configuration of the application. This can be achieved with a Dockerfile or other image building tools.
  2. Deploy the application : Deploy the application in a container image. This can be achieved through Docker Compose files or Docker Swarm mode.
  3. Configure the container : Configuring the container for the application usually requires setting some parameters of the application as default values ​​or environment variables.
  4. Start Application : Start the application and run it in the container.
  5. Monitor the application : Monitor the health of the application in the container, such as the health of the container, resource usage, performance of the application, etc.

The following is a simple Java code example for container-based application deployment and upgrade, assuming we have a Java application called "myapp", which is built using the Spring Boot framework and packaged as a Docker image:

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

@SpringBootApplication  
@RestController  
public class MyApplication {
    
    

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

    @GetMapping("/hello")  
    public String hello(@PathVariable("name") String name) {
    
      
        return "Hello, " + name + "!";  
    }  
}

In the code above, we define a Spring Boot application called "MyApplication" that uses @RestControllerannotations to handle HTTP requests and uses @SpringBootApplicationannotations to enable Spring Boot's auto-configuration.

Now we want to deploy this application to a Kubernetes cluster. We can use a Docker Compose file to define how the application will be deployed as follows:

version: '3'  
services:  
#定义一个名为 "myapp" 的服务
  myapp:  
	# 版本
    image: myapp:latest  
    container_name: myapp  
    environment:  
      JAVA_OPTS: -Dspring.profiles.active=prod  
    ports:  
      - "8080:8080"  
     volumes:  
      - ./src/main/docker/myapp/data:/data  
     networks:  
      - myappnet  
  myapp-web:  
    image: myapp-web:latest  
    container_name: myapp-web  
    environment:  
      JAVA_OPTS: -Dspring.profiles.active=web  
    ports:  
      - "8080:8080"  
     volumes:  
      - ./src/main/docker/myapp/data:/data  
     networks:  
      - myappnet  
  myapp-db:  
    image: myapp-db:latest  
    container_name: myapp-db  
    environment:  
      JAVA_OPTS: -Dspring.profiles.active=db  
    ports:  
      - "3306:3306"  
     volumes:  
      - ./src/main/docker/myapp/data:/data  
     networks:  
      - myappnet  
myappnet:  
    name: myappnet  
    priority: highest  
    driver: bridge  
    links:  
      - myapp:myapp  
      - myapp-web:myapp-web  
      - myapp-db:myapp-db  

In the above yml file, we defined a service called "myapp" which uses the latest version of the container image and uses port 8080 to expose the application's HTTP service.

We also define a service called "myapp-web" that uses the latest version of the container image and uses port 8080 to expose the web application's HTTP service. We also define a service called "myapp-db" that uses the latest version of the container image and uses port 3306 to expose the database service.

We can now use the Docker Compose file to start the application as follows:

docker-compose up -d

This command will start all defined services and deploy them to the Kubernetes cluster. We can use the kubectl command to view the health of the application as follows:

kubectl get services

This command will list all defined services, we can use the kubectl command to monitor the performance of the application as follows:

kubectl get svc -o wide

This command will list all defined services and display their performance metrics.
Finally, we can use Java code to achieve it, as follows:

import com.fasterxml.jackson.databind.ObjectMapper;  
import java.io.IOException;  
import java.io.InputStream;  
import java.net.URI;  
import java.net.URISyntaxException;  
import java.util.HashMap;  
import java.util.Map;

public class DockerDeployment {
    
    

    public static void main(String[] args) throws IOException, URISyntaxException {
    
      
        // 创建应用程序的 Dockerfile  
        Dockerfile dockerfile = new Dockerfile();  
        dockerfile.add("FROM", "openjdk:8-jdk-alpine");  
        dockerfile.add("COPY", "app.jar", "/app.jar");  
        dockerfile.add("ENTRYPOINT", "java -jar /app.jar");  
        dockerfile.add("CMD", "/bin/bash");  
        dockerfile.build();

        // 创建应用程序的容器镜像  
        Map<String, String> args = new HashMap<>();  
        args.put("APP_JAR", "/app.jar");  
        args.put("APP_NAME", "my-app");  
        args.put("JAVA_OPTS", "-Dapp.name=my-app -Dapp.version=1.0");  
        DockerImage dockerImage = new DockerImage(URI.create("dockerhub://my-app/my-app:latest"), args);

        // 部署应用程序到容器  
        InputStream inputStream = DockerDeployment.class.getResourceAsStream("docker-image.yml");  
        Map<String, Object> environment = new HashMap<>();  
        environment.put("APP_JAR", "/app.jar");  
        environment.put("APP_NAME", "my-app");  
        environment.put("APP_VERSION", "1.0");  
        Map<String, Object> argsEnvironment = new HashMap<>();  
        argsEnvironment.put("JAVA_OPTS", "-Dapp.name=my-app -Dapp.version=1.0");  
        DockerDeployment deployment = new DockerDeployment(dockerImage, environment, argsEnvironment);  
        deployment.start();

        // 升级应用程序  
        String newVersion = "1.1";  
        InputStream inputStream2 = DockerDeployment.class.getResourceAsStream("docker-image.yml");  
        Map<String, Object> environment2 = new HashMap<>();  
        environment2.put("APP_JAR", "/app.jar");  
        environment2.put("APP_NAME", "my-app");  
        environment2.put("APP_VERSION", newVersion);  
        Map<String, Object> argsEnvironment2 = new HashMap<>();  
        argsEnvironment2.put("JAVA_OPTS", "-Dapp.name=my-app -Dapp.version=" + newVersion);  
        DockerDeployment deployment2 = new DockerDeployment(dockerImage, environment2, argsEnvironment2);  
        deployment2.start();  
    }  
}

Guess you like

Origin blog.csdn.net/weixin_44427181/article/details/131114204