1. 程式人生 > >Spring Boot入門教程(五十二): 在Docker上執行Spring Boot

Spring Boot入門教程(五十二): 在Docker上執行Spring Boot

一:基礎示例

1.1 安裝JDK和Maven

安裝openjdk: yum -y install java-1.8.0-openjdk*

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64
export MAVEN_HOME =/usr/local/maven3

export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

source /etc/profile

$ java -version
$ mvn -version

1.2 建立Spring Boot工程

在這裡插入圖片描述

1.2.1 controller

@RestController
public class DockerController {

    @RequestMapping("/")
    public String index() {
        return "Hello Docker!";
    }
}

1.2.2 pom.xml

  • 修改版本號為1.0
  • 新增屬性配置docker.image.prefix
  • 增加外掛docker-maven-plugin
<?xml version="1.0" encoding="UTF-8"?>
<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
>
springboot-docker</artifactId> <!--版本號--> <version>1.0</version> <packaging>jar</packaging> <name>springboot-docker</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <!--docker映象字首--> <docker.image.prefix>springboot</docker.image.prefix> </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> <!-- Docker maven plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> <!-- Docker maven plugin --> </plugins> </build> </project>

1.2.3 src/main/docker/Dockerfile

在src/main建立docker目錄,並在docker目錄下建立Dockerfile檔案
注意:FROM 後面的image-name 和 冒號後面的tag都可以在映象倉庫中查詢

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD springboot-docker-1.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

1.3 CentOS7安裝Docker

# 安裝Docker
$ yum install docker

# 啟動Docker 服務
$ service docker start

# 設定開機啟動
$ chkconfig docker on

#LCTT 譯註:此處採用了舊式的 sysv 語法,如採用CentOS 7中支援的新式 systemd 語法,如下:
systemctl  start docker.service
systemctl  enable docker.service

# 配置Docker中國加速器(預設daemon.json是空的)
$ vi  /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.docker-cn.com"],
    "live-restore": true
}

$ systemctl restart docker
$ docker version

1.4 打包&執行

1.4.1 將springboot-docker工程使用ftp或者其它方式上傳到linux伺服器上,然後切換目錄到springboot-docker目錄下,並打包

$ cd springboot-docker
$ mvn package docker:build

在這裡插入圖片描述

1.4.2 啟動springboot-docker工程

$ docker run -p 8080:8080 -t springboot/springboot-docker

在這裡插入圖片描述

1.4.3 在瀏覽器上訪問API http://IP:8080/

在這裡插入圖片描述


二:Docker Compose示例

根據ip記錄使用者訪問次數並返回訪問的總次數

1. 建立Spring Boot工程

在這裡插入圖片描述

1.1 pom.xml

<dependencies>
	<dependency>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-data-jpa</artifactId>
	</dependency>
	<dependency>
	    <groupId>mysql</groupId>
	    <artifactId>mysql-connector-java</artifactId>
	</dependency>
</dependencies>

1.2 properties

application.properties

# 測試時使用開發環境
spring.profiles.active=dev

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true

application-dev.properties dev環境用於自己的開發環境,通過dev環境測試功能,測試通過後使用docker環境釋出

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

application-docker.properties docker環境

spring.datasource.url=jdbc:mysql://mysql:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

1.3 entity

package com.example.app.entity;

import javax.persistence.*;

@Entity
public class Visitor {
    @Id
    @GeneratedValue
    private long id;
    @Column(nullable = false)
    private  long  times;
    @Column(nullable = false)
    private  String  ip;
	
   // Getter & Setter
}

1.4 repository

package com.example.app.repository;

public interface  VisitorRepository extends JpaRepository<Visitor, Long> {
    Visitor findByIp(String ip);
}

1.5 controller

package com.example.app.controller;

@RestController
public class VisitorController {

    @Autowired
    private VisitorRepository repository;
	
	 /**
     * 記錄使用者訪問的次數,並返回訪問的總次數
     */
    @RequestMapping("/")
    public String index(HttpServletRequest request) {
        String ip=request.getRemoteAddr();
        Visitor visitor=repository.findByIp(ip);
        if(visitor==null){
            visitor=new Visitor();
            visitor.setIp(ip);
            visitor.setTimes(1);
        }else {
            visitor.setTimes(visitor.getTimes()+1);
        }
        repository.save(visitor);
        return "I have been seen ip "+visitor.getIp()+" "+visitor.getTimes()+" times.";
    }
}

1.6 Dockerfile

FROM maven:3.5-jdk-8

1.7 啟動專案

http://localhost:8080
在這裡插入圖片描述

2.nginx/conf.d/app.conf

在這裡插入圖片描述
nginx負載均衡配置proxy_pass

server {
    listen 80;
    charset utf-8;
    access_log off;

    location / {
        proxy_pass http://app:8080;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static {
        access_log   off;
        expires      30d;

        alias /app/static;
    }
}

3. docker-compose.yml

docker-compose.yml檔案位置與專案app根目錄同級目錄

version: '3'
services:
  nginx:
    container_name: v-nginx
    image: nginx:1.13
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
  mysql:
    container_name: v-mysql
    image: mysql/mysql-server:5.7
    restart: always
    environment:
      MYSQL_DATABASE: test
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: '%'
    ports:
        - "3306:3306"
  app:
    restart: always
    build: ./app
    working_dir: /app
    volumes:
      - ./app:/app
      - ~/.m2:/root/.m2
    expose:
      - "8080"
    depends_on:
      - nginx
      - mysql
    command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker

4. 啟動程式

$ cd springboot-docker-compose
$ docker-compose up

在這裡插入圖片描述

訪問nginx
在這裡插入圖片描述

docker-compose ps
在這裡插入圖片描述

部署程式只需要docker-compose up這一條命令,部署之前也不需要預先安裝nginx、mysql等服務,docker會自動拉取並啟動所依賴的容器(nginx、mysql等),只需一條命令就可部署專案,這極大的簡化了運維的工作。

五:參考

Mac平臺上Docker安裝與使用 https://blog.csdn.net/jiang_xinxing/article/details/58025417

純潔的微笑