Spring Boot入门教程(五十二): 在Docker上运行Spring Boot

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vbirdbest/article/details/84314293

一:基础示例

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

纯洁的微笑

猜你喜欢

转载自blog.csdn.net/vbirdbest/article/details/84314293