八、springboot 簡單優雅的通過docker-compose 構建


前言

這個項目有一段時間沒有更新了,不過我可沒有偷懶喲,是偷偷准備了一個大招,現在是時候展示啦哈哈。

我們今天要做的,就是將我們的項目通過docker-compose 構建成鏡像運行。為什么要這樣做呢?比我我前面的這些教程,用到了mysql,如果你們想要運行我的程序,就必須在自己電腦上裝mysql 數據庫才行,也就是項目用依賴了哪些環境,都必須先將這些環境部署好才能運行項目,那我們要做的,只用安裝docker和docke-compose ,然后運行就完事了,不用管什么環境的。

初一聽,好像還行,但是根本沒有接觸docker-compose 怎么辦?不要慌,一個專題帶你飛,雖不能讓你所向披靡,但也足你叱吒江湖啦
傳送門:docker自我修煉從0到1

還有我查看項目發現竟然沒有配置Redis,但是Redis 使用也是很廣泛的,我之前的文章有詳細的講解springboot項目怎么使用redis。我這里只是簡單的將他配上去確保架構的完整性,就不做更多的講解,需要詳細了解的可以參考Redis--從零開始隨筆

好了,前面說了這么多無非是想表達這篇文章分兩個大部分,部署Redis和通過docker-compose 搭建。

配置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);
    }

}

file

好了項目整合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 中配置。
file

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 打包,就可以將項目打包成鏡像並發送到我們配置的服務器上。可以看到我們的鏡像已經到我們的服務器了。
file

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

file
就可以看到鏡像容器已經啟動了。項目包含三個鏡像,現在我們來驗證一下項目正常啟動沒有。

測試

由於我們使用了docker鏡像的mysql 。所以之前的項目使用的數據庫需要重新執行一次,我們代碼中有,我就不貼出來了。項目的接口我們現在調一下看看。

# 檢測項目正常啟動沒有
http://192.168.252.53:9001/zlflovemm/

file

# 檢測mysql 是否正常
http://192.168.252.53:9001/zlflovemm/user/list

file

# 檢測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

file

番外

到此為止,將springboot項目構建成鏡像完成啦,感覺整篇文件將的比較粗糙,這篇主要是整合,詳細的都在前面的博客已經講了,所以這里就沒有再講了。

好了,就說這么多啦
代碼上傳到github:
https://github.com/QuellanAn/zlflovemm

后續加油♡

歡迎大家關注個人公眾號 "程序員愛酸奶"

分享各種學習資料,包含java,linux,大數據等。資料包含視頻文檔以及源碼,同時分享本人及投遞的優質技術博文。

如果大家喜歡記得關注和分享喲❤

file


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM