Spring Boot入門教程(五十二): 在Docker上執行Spring Boot
阿新 • • 發佈:2018-12-31
一:基礎示例
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 啟動專案
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
純潔的微笑
- Docker(一):Docker入門教程 http://www.ityouknow.com/docker/2018/03/07/docker-introduction.html
- Docker(二):Dockerfile 使用介紹 http://www.ityouknow.com/docker/2018/03/12/docker-use-dockerfile.html
- Docker(三):Dockerfile 命令詳解 http://www.ityouknow.com/docker/2018/03/15/docker-dockerfile-command-introduction.html
- Docker(四):Docker 三劍客之 Docker Compose http://www.ityouknow.com/docker/2018/03/22/docker-compose.html
- Docker(五):Docker 三劍客之 Docker Machine http://www.ityouknow.com/docker/2018/03/30/docker-machine.html
- Docker(六):Docker 三劍客之 Docker Swarm http://www.ityouknow.com/docker/2018/04/19/docker-swarm.html
- Spring Boot 2 (四):使用 Docker 部署 Spring Boot http://www.ityouknow.com/springboot/2018/03/19/spring-boot-docker.html
- Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 實踐 http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html
- Spring Boot 2 (六):使用 Docker 部署 Spring Boot 開源軟體雲收藏 http://www.ityouknow.com/springboot/2018/04/02/docker-favorites.html