简介

本章将创建工程项目,完成如下目标:
①、本地运行 nacos,idea 中运行微服务项目,使得编写的微服务能注册到 本地 nacos
②、将微服务打成 jar 包,将该 jar包上传到指定目录,编写 Dockerfile 和 docker-compose.yml 文件。将其运行成 docker 容器,该容器中的 微服务能访问其他容器中的 nacos
image.png
要解决的主要问题:
在不清楚 nacos服务容器的ip情况下,如何编写 docker-compose.yml 文件,使其 微服务能在容器中访问到 nacos 容器所在服务。

项目环境搭建

创建父项目 RuoYi-Cloud

image.png
其 pom.xml 文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.ruoyi</groupId>
  7. <artifactId>ruoyi</artifactId>
  8. <packaging>pom</packaging>
  9. <version>1.0-SNAPSHOT</version>
  10. <modules>
  11. <module>ruoyi-modules</module>
  12. </modules>
  13. <properties>
  14. <ruoyi.version>1.0.0</ruoyi.version>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  17. <java.version>1.8</java.version>
  18. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  19. <druid.version>1.2.4</druid.version>
  20. <dynamic-ds.version>3.2.1</dynamic-ds.version>
  21. <spring-boot.mybatis>2.1.3</spring-boot.mybatis>
  22. <pagehelper.boot.version>1.3.0</pagehelper.boot.version>
  23. <fastjson.version>1.2.75</fastjson.version>
  24. <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
  25. <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
  26. <kaptcha.version>2.3.2</kaptcha.version>
  27. <poi.version>4.1.2</poi.version>
  28. </properties>
  29. <!-- 依赖声明 -->
  30. <dependencyManagement>
  31. <dependencies>
  32. <!-- SpringBoot 依赖配置 -->
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-dependencies</artifactId>
  36. <version>${spring-boot.version}</version>
  37. <type>pom</type>
  38. <scope>import</scope>
  39. </dependency>
  40. <!-- SpringCloud Alibaba 微服务 -->
  41. <dependency>
  42. <groupId>com.alibaba.cloud</groupId>
  43. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  44. <version>${spring-cloud-alibaba.version}</version>
  45. <type>pom</type>
  46. <scope>import</scope>
  47. </dependency>
  48. <!-- SpringCloud 微服务 -->
  49. <dependency>
  50. <groupId>org.springframework.cloud</groupId>
  51. <artifactId>spring-cloud-dependencies</artifactId>
  52. <version>${spring-cloud.version}</version>
  53. <type>pom</type>
  54. <scope>import</scope>
  55. </dependency>
  56. </dependencies>
  57. </dependencyManagement>
  58. <build>
  59. <plugins>
  60. <plugin>
  61. <groupId>org.apache.maven.plugins</groupId>
  62. <artifactId>maven-compiler-plugin</artifactId>
  63. <configuration>
  64. <source>${java.version}</source>
  65. <target>${java.version}</target>
  66. <encoding>${project.build.sourceEncoding}</encoding>
  67. </configuration>
  68. </plugin>
  69. </plugins>
  70. </build>
  71. </project>

创建子模块 ruoyi-modules

image.png
其 pom.xml 文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>ruoyi</artifactId>
  7. <groupId>com.ruoyi</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <packaging>pom</packaging>
  12. <artifactId>ruoyi-modules</artifactId>
  13. <modules>
  14. <module>ruoyi-system</module>
  15. </modules>
  16. </project>

创建子子模块 ruoyi-system

image.png

pom.xml 文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <groupId>com.ruoyi</groupId>
  7. <artifactId>ruoyi-modules</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>ruoyi-system</artifactId>
  12. <packaging>jar</packaging>
  13. <dependencies>
  14. <!-- SpringBoot Web -->
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-web</artifactId>
  18. </dependency>
  19. <!-- springcloud ailibaba nacos discovery -->
  20. <dependency>
  21. <groupId>com.alibaba.cloud</groupId>
  22. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  23. </dependency>
  24. </dependencies>
  25. <build>
  26. <plugins>
  27. <plugin>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-maven-plugin</artifactId>
  30. <executions>
  31. <execution>
  32. <goals>
  33. <goal>repackage</goal>
  34. </goals>
  35. </execution>
  36. </executions>
  37. </plugin>
  38. </plugins>
  39. </build>
  40. </project>

bootstrap.yml 文件

  1. # Tomcat
  2. server:
  3. port: 9201
  4. # Spring
  5. spring:
  6. application:
  7. # 应用名称
  8. name: ruoyi-system
  9. profiles:
  10. # 环境配置
  11. active: dev
  12. cloud:
  13. nacos:
  14. discovery:
  15. # 服务注册地址
  16. server-addr: 127.0.0.1:8848

主启动类

package com.ruoyi.system;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RuoYiSystemApplication {

    public static void main(String[] args) {
        SpringApplication.run(RuoYiSystemApplication.class, args);
    }

}

项目打包

方式1

image.png

方式2

使用 cmd 命令行工具,然后切换路径到父项目,使用如下命令打包:

mvn clean package -Dmaven.test.skip=true

打包的结果

image.png

本地测试

运行本地nacos

image.png

本地运行jar包

java -jar ruoyi-system-1.0-SNAPSHOT.jar

验证结果

登录到nacos控制台: http://localhost:8848/nacos 默认的用户名和密码都是 nacos
查看服务是否注册成功?

发布到 Docker

创建目录

目录如图所示:
image.png

拷贝打包好的jar到指定目录

将 ruoyi-system-1.0-SNAPSHOT.jar 文件拷贝到 ruoyi / modules / system / jar 目录下

创建 Dockerfile文件

在 ruoyi / modules / system 目录下,创建 Dockerfile 文件。其内容如下:

# 基础镜像
FROM  openjdk:8-jre
# author
MAINTAINER ruoyi

# 挂载目录
VOLUME /home/ruoyi
# 创建目录
RUN mkdir -p /home/ruoyi
# 指定路径
WORKDIR /home/ruoyi
# 复制jar文件到路径
COPY ./jar/ruoyi-system-1.0-SNAPSHOT.jar /home/ruoyi/ruoyi-system-1.0-SNAPSHOT.jar
# 启动系统服务
ENTRYPOINT ["java","-jar","ruoyi-system-1.0-SNAPSHOT.jar"]

编辑 docker-compose.yml 文件

关键内容截图:
image.png
具体的 docker-compose.yml 文件内容:

version : '3.8'
services:
  mysql:
    container_name: ruoyi-mysql
    build:
      context: ./mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/logs:/logs
      - ./mysql/data:/var/lib/mysql
    command: [
          'mysqld',
          '--innodb-buffer-pool-size=80M',
          '--character-set-server=utf8mb4',
          '--collation-server=utf8mb4_unicode_ci',
          '--default-time-zone=+8:00',
          '--lower-case-table-names=1'
        ]
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: 'nacos_config'
  redis:
    container_name: ruoyi-redis
    build:
      context: ./redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/conf/redis.conf:/home/ruoyi/redis/redis.conf
      - ./redis/data:/data
    command: redis-server /home/ruoyi/redis/redis.conf

  nacos: 
    container_name: ruoyi-nacos
    image: nacos/nacos-server
    env_file:
      - ./nacos/env/nacos-standlone-mysql.env
    volumes:
      - ./nacos/logs/:/home/nacos/logs
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    depends_on:
      - mysql
  nginx:
    container_name: ruoyi-nginx
    build:
      context: ./nginx
    ports:
    - "80:80"
    volumes:
      - ./nginx/html/dist:/home/ruoyi/projects/ruoyi-ui
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx
      - ./nginx/conf.d:/etc/nginx/conf.d

  ruoyi-modules-system:                   # 服务名称
    container_name: ruoyi-modules-system  # 容器名称,但最终的容器名称会加上项目名做前缀
    build:
      context: ./ruoyi/modules/system     #指定构建镜像的上下文路径(即 Dockerfile文件所在路径)
    environment:
      - spring.cloud.nacos.discovery.server-addr=nacos:8848
    ports:
    - "9201:9201"                         # 端口映射
    depends_on:
      - nacos                             # 依赖的服务。这里表示先启动 nacos服务所在容器

启动容器

cd /data/ruoyi             # 切换到 docker-compose.yml 文件所在位置
docker-compose up -d       # 以后台方式启动 docker-compose.yml 文件定义的容器(服务)

查看服务状态

docker-compose ps

查看日志

比如查看 ruoyi-modules-system 服务的日志

docker-compose logs ruoyi-modules-system

查看微服务是否注册到 nacos

image.png

知识点

通过服务名方式代替ip地址

image.png