版权声明:本文为博主原创文章,未经博主允许不得转载。 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 启动项目
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