Time: 2025-03-30 Sunday 21:00:00
SpringBoot利用docker一键在服务器部署(超简单)
为什么需要Docker
, 因为每次使用新的服务器都要下好多的软件,什么MySQL
,Redis
,JDK
,Nodejs
,Maven
, Nginx
, 然后一大堆配置, 程序员自然需要自动化,能不能把机械的行为自动化起来, 反正每次流程都是一样,当然了我们利用sh脚本也是可以的,把要下载的命令全部复制到文件里面,然后一起执行,不过mysql就比较麻烦了,因为需要获取临时密码,登录,修改访问权限
Docker的核心包是
1
| yum install docker-ce docker-ce-cli containerd.io
|
官方代码(centos9)
1
| sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
首先docker的下载和镜像源的配置我就不说了,自己摸索,(阿里云容器容器镜像控制台可以提供镜像加速网址)
所有需要更改的地方已经指出,严格按照要求来就可以成功
对于一个传统的mysql
+ redis
+ SpringBoot
项目,我们需要准备以下几个文件,你看吧核心其实就是jar包,DockerFile和compose文件
1 2 3 4 5 6
| . ├── deploy.sh(可以不需要) ├── docker-compose.yml ├── Dockerfile ├── usercenter.jar └── user-center.sql
|
这里我选择的策略是本地maven打成jar包再上传上去,否则5M带宽服务器maven下载包20分钟都下不完
首先写Dockerfile打包SpringBoot镜像,将usercenter.jar
改成你自己的jar包,注意这里会使用application-prod.properties
的配置文件
1 2 3 4 5
| FROM eclipse-temurin:17-jre WORKDIR /app COPY usercenter.jar ./app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/app.jar", "--spring.profiles.active=prod"]
|
然后写docker compose文件,该文件会启动java项目,并且配置好数据库,包括账号密码,数据存储, 在application-prod.properties
里面数据库的相关配置换成这里的变量名(environment
里面的变量名),在mysql.volume
这里./user-center.sql:
改成你自己需要初始化的sql文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| services: app: build: . container_name: usercenter-app ports: - "8080:8080" depends_on: - mysql - redis environment: - SPRING_DATASOURCE_URL=jdbc:mysql://usercenter-mysql:3306/user-center?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=your_passwrod - SPRING_DATA_REDIS_HOST=redis - SPRING_DATA_REDIS_PORT=6379 - MAVEN_OPTS=-Dmaven.repo.local=/maven-repo networks: - usercenter-network restart: always volumes: - maven-repo:/maven-repo
mysql: image: mysql:8.0 container_name: usercenter-mysql ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=your_password - MYSQL_DATABASE=user-center volumes: - mysql-data:/var/lib/mysql - ./user-center.sql:/docker-entrypoint-initdb.d/init.sql networks: - usercenter-network restart: always
redis: image: redis:7.0 container_name: usercenter-redis ports: - "6379:6379" volumes: - redis-data:/data networks: - usercenter-network restart: always
networks: usercenter-network: driver: bridge
volumes: mysql-data: redis-data: maven-repo:
|
最后我们写sh
文件,并赋予该文件执行权 sudo chmod +x ./deploy.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #!/bin/bash
echo "停止并删除旧容器..." docker compose down
echo "构建新镜像..." docker compose build
echo "启动服务..." docker compose up -d
echo "容器状态:" docker compose ps
|
执行该文件./deploy.sh
即可完成自动化构建,项目可以通过8080运行了
application-prod.properties
大概这样子,这里只留了数据库部分做参考
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
server.port=8080
spring.session.store-type=redis
spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:mysql://mysql:3306/user-center?useSSL=false&serverTimezone=UTC} spring.datasource.username=${SPRING_DATASOURCE_USERNAME:root} spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:your_password} spring.jpa.hibernate.ddl-auto=none spring.jpa.show-sql=false
spring.data.redis.host=${SPRING_DATA_REDIS_HOST:redis} spring.data.redis.port=${SPRING_DATA_REDIS_PORT:6379} spring.data.redis.database=0
|
Docker Compose在一定程度上就是运行多个这样的Docker Run命令
