延安免費做網(wǎng)站怎么創(chuàng)作自己的網(wǎng)站
前述:
?本篇教程將略過很多docker下載環(huán)境配置的基礎(chǔ)步驟,如果您對docker不太熟悉請參考我的上一個教程:SpringBoot新手快速入門系列教程九:基于docker容器,部署一個簡單的項目
使用 Docker Compose 支持部署 Docker 項目有許多優(yōu)勢,
對比:使用 Docker 和 Docker Compose
功能 | Docker | Docker Compose |
---|---|---|
單一容器管理 | 良好,使用 Dockerfile 和 docker run | 良好,但通常用于多容器管理 |
多容器管理 | 較繁瑣,需要手動管理各個容器 | 優(yōu)秀,使用 docker-compose.yml 文件 |
服務(wù)依賴管理 | 手動設(shè)置依賴關(guān)系和啟動順序 | 自動管理依賴關(guān)系和啟動順序 |
配置和環(huán)境管理 | 使用環(huán)境變量和配置文件 | 使用環(huán)境變量和配置文件,統(tǒng)一管理 |
擴(kuò)展和縮放 | 手動擴(kuò)展,使用 docker run | 簡單擴(kuò)展,使用 docker-compose up --scale |
另外對于分布式的 Spring Boot 應(yīng)用,建議使用 Docker Compose 來管理多個服務(wù)。雖然僅使用 Docker 也可以實現(xiàn),但 Docker Compose 提供了更多的便利性和簡化操作,特別是當(dāng)涉及到多個相互依賴的服務(wù)時。以下是原因及如何使用 Docker Compose 來構(gòu)建分布式 Spring Boot 應(yīng)用的詳細(xì)步驟:
使用 Docker Compose 的優(yōu)勢
- 簡化多容器管理:通過一個簡單的
docker-compose.yml
文件定義所有服務(wù),使用一個命令即可啟動或停止整個應(yīng)用。 - 服務(wù)依賴管理:可以定義服務(wù)之間的依賴關(guān)系,確保按順序啟動。
- 統(tǒng)一網(wǎng)絡(luò)管理:所有服務(wù)自動加入同一個網(wǎng)絡(luò),方便服務(wù)之間的通信。
- 環(huán)境變量和配置管理:可以在
docker-compose.yml
文件中統(tǒng)一管理環(huán)境變量和配置。 - 易于擴(kuò)展和縮放:可以簡單地通過調(diào)整
docker-compose.yml
文件擴(kuò)展服務(wù)實例數(shù)量。
步驟一:新建基于Docker Compose的項目
選擇依賴
步驟二:代碼示例
1. 創(chuàng)建實體類
在 src/main/java/com/yuye/www/hellodockeradv/entity
目錄下創(chuàng)建 User.java
文件:
package com.yuye.www.hellodockeradv.entity;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
2,創(chuàng)建Repository接口
在 src/main/java/com/yuye/www/hellodockeradv/repository
目錄下創(chuàng)建 UserRepository.java
文件:
package com.yuye.www.hellodockeradv.repository;import com.yuye.www.hellodockeradv.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;import java.util.Optional;public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByName(String name);boolean existsByName(String name);
}
3,創(chuàng)建Controller
在 src/main/java/com/yuye/www/hellodockeradv/controller
目錄下創(chuàng)建 UserController.java
文件:
package com.yuye.www.hellodockeradv.controller;import com.yuye.www.hellodockeradv.entity.User;
import com.yuye.www.hellodockeradv.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Optional;@RestController
public class UserController {@Autowiredprivate UserRepository userRepository;@GetMapping("/register")public String registerUser(@RequestParam String name) {// Check if a user with the same name already existsif (userRepository.existsByName(name)) {return "User already exists";}// If user doesn't exist, create a new user and save to the databaseUser user = new User();user.setName(name);userRepository.save(user);return "User registered successfully";}@GetMapping("/login")public String loginUser(@RequestParam String name) {Optional<User> user = userRepository.findByName(name);if (user.isPresent()) {return "User found: " + name;} else {return "User not found";}}
}
4. 配置 application.properties
文件
在 src/main/resources/application.properties
文件中添加MySQL數(shù)據(jù)庫連接配置
spring.application.name=HelloDockerAdv
spring.datasource.url=jdbc:mysql://localhost:3306/userdata?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Qwerty123
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialectserver.port=8081
5. 創(chuàng)建 Dockerfile
在項目根目錄下創(chuàng)建一個 Dockerfile
文件:
# 使用官方的OpenJDK鏡像作為基礎(chǔ)鏡像
FROM openjdk:17-jdk-slim# 添加一個環(huán)境變量來指示Spring Boot使用哪個端口
ENV SERVER_PORT=8080# 將jar包添加到容器中
COPY build/libs/HelloDockerAdv-0.0.1-SNAPSHOT.jar app.jar# 暴露應(yīng)用程序的端口
EXPOSE 8080# 運行jar包
ENTRYPOINT ["java", "-jar", "/app.jar"]
6. 創(chuàng)建 docker-compose.yml
文件
在項目根目錄下創(chuàng)建一個 docker-compose.yml
文件:
version: '3.8'
services:app:image: hellodockeradvbuild:context: .dockerfile: Dockerfileports:- "8080:8080"depends_on:- mysqlenvironment:SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/demoSPRING_DATASOURCE_USERNAME: rootSPRING_DATASOURCE_PASSWORD: yourpasswordmysql:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: yourpasswordMYSQL_DATABASE: demoports:- "3306:3306"volumes:- mysql-data:/var/lib/mysqlvolumes:mysql-data:
7. 構(gòu)建和運行Docker容器
確定你的mysql數(shù)據(jù)庫有一個
userdata
和一個user的表
然后啟動mysql后
在項目根目錄下運行以下命令:
# 構(gòu)建Spring Boot應(yīng)用程序
./gradlew build# 啟動Docker Compose,構(gòu)建并運行所有服務(wù)
docker-compose up --build