首页 资讯 社群 我的社区 搜索

八、springboot 简单优雅的通过docker-compose 构建

yimo~
2019-11-12 16:34:12

配置Redis

增加配置

在pom.xml文件中增加Redis的依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

在application.properties 中存在redis 连接信息。 

#配置redis
# Redis数据库索引(默认为0)
spring.redis.database=0  
# Redis服务器地址
spring.redis.host=192.168.252.53
# Redis服务器连接端口
spring.redis.port=6389 
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

简单使用

配置好了,我们还是说一下简单使用,这些在之前也有讲,代码也是差不多的。我们在controller 层创建一个 redis 包,在Redis包下创建一个RedisController类。
代码如下:

@RestController
@RequestMapping("/redis")
@Slf4j
public class RedisController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping(value = "/add",method = RequestMethod.GET)
    public String add(@RequestParam(value="key")String key,@RequestParam(value = "value") String value){
        ValueOperations ops=stringRedisTemplate.opsForValue();
        ops.set(key,value);
        return "success";
    }

    @RequestMapping(value = "/get",method = RequestMethod.GET)
    public String get(@RequestParam(value = "key")String key){
        ValueOperations ops=stringRedisTemplate.opsForValue();
        return (String) ops.get(key);
    }

}

好了项目整合Redis 就这么多了,至于测试我们待会后面部署好了一起测试。接下来开始重头戏。

docker-compose 部署

我们现在有一个springboot项目,现在怎么构建成一个镜像放在服务器上运行呢?
我们一步步来,首先是增加配置。

pom.xml

还是我们熟悉的pom.xml 我们需要在pom.xml 中 build-->plugins 中增加配置:

<!-- Docker -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <!-- 将插件绑定在某个phase执行 -->
                <executions>
                    <execution>
                        <id>build-image</id>
                        <!-- 用户只需执行mvn package ,就会自动执行mvn docker:build -->
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 指定生成的镜像名 -->
                    <imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
                    <!-- 指定标签 -->
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                    </imageTags>
                    <!-- 指定 Dockerfile 路径 -->
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <!-- 指定远程 docker api地址 -->
                    <dockerHost>http://127.0.0.1:2375</dockerHost>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!-- jar包所在的路径此处配置的对应target目录 -->
                            <directory>${project.build.directory}</directory>
                            <!-- 需要包含的jar包,这里对应的是Dockerfile中添加的文件名 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

上面都有注释没有什么好讲的,其中指定生成镜像名的${docker.image.prefix} 的值在properties 中配置。

Dockerfile

我们在项目的src-->main 创建一个docker 包,包下创建一个Dockerfile 问价 ,内容如下:

FROM java:8
VOLUME /tmp
ADD zlflovemm-1.0.0.jar zlflovemm-1.0.0.jar
ENTRYPOINT ["java","-jar","/zlflovemm-1.0.0.jar"]

mvn package

接下来我们使用maven package 打包,就可以将项目打包成镜像并发送到我们配置的服务器上。可以看到我们的镜像已经到我们的服务器了。

docker-compose.yml

我们现在项目镜像有了,现在需要通过docker-compose.yml 将项目,mysql .redis 都管理起来。
我们创建一个docker-compose.yml 内容如下:

version: "3"

services:
  webapp:
    image: quellanan/zlflovemm:1.0.0
    ports:
      - "9001:9090"
    volumes:
      - "/data"
    depends_on: 
      - redis
      - mysql

  redis:
    image: redis:latest
    restart: always
    ports:
      - "6389:6379"
    volumes:
      - /redis/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf

  mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_USER: 'root'
      MYSQL_PASS: '123456'
    ports:
       - "3306:3306"
    volumes:
       - "./db:/var/lib/mysql"
       - "./conf/my.cnf:/etc/my.cnf"
       - "./init:/docker-entrypoint-initdb.d/"

webapp 和Redis 配置我就不说了,上一篇文章已经说了,这里我们说一下mysql 的配置。
image:mysql:laster 我们选择最新的版本的mysql 镜像。

    environment:
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_USER: 'root'
      MYSQL_PASS: '123456'

environment 配置的是mysql 的root 用户密码普通的用户及密码。
配置我们自定义的mysql 配置,如果使用的默认的,这里的数据卷其实可以不用指定。

volumes:
       - "./db:/var/lib/mysql"
       - "./conf/my.cnf:/etc/my.cnf"
       - "./init:/docker-entrypoint-initdb.d/"

我们创建好了docker-compose 后,在同级目录下执行

docker-compose up

就可以看到镜像容器已经启动了。项目包含三个镜像,现在我们来验证一下项目正常启动没有。

测试

由于我们使用了docker镜像的mysql 。所以之前的项目使用的数据库需要重新执行一次,我们代码中有,我就不贴出来了。项目的接口我们现在调一下看看。

# 检测项目正常启动没有
http://192.168.252.53:9001/zlflovemm/

# 检测mysql 是否正常
http://192.168.252.53:9001/zlflovemm/user/list

# 检测Redis 是否正常
http://192.168.252.53:9001/zlflovemm/redis/add?key=a&value=123
http://192.168.252.53:9001/zlflovemm/redis/get?key=a

到此为止。

用户评论