概述

最近在想做个cloud项目,gitee上找了个模板项目,后端使用到 Nacos、Gateway、Security等技术,需要到 Docker 容器部署,在此总结一下,若有不足之处,望大佬们可以指出。

什么是 Docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

Docker的三大核心概念镜像、容器、仓库

  • 镜像:类似虚拟机的镜像、用俗话说就是安装文件。
  • 容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见的。
  • 仓库:类似代码仓库,是Docker集中存放镜像文件的场所。

部署Spring Cloud项目

实现流程

在这里插入图片描述

Maven 打包插件

  • maven-jar-plugin:打包不会把依赖库给打包进去,解压开里面会发现少了lib(只包括当前模块的jar,不包含依赖jar,无法直接启动)。
  • spring-boot-maven-plugin:会把依赖库一起打包进jar包

我目前项目中配置

<build>
        <!-- 项目名 -->
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!--跳过测试-->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
		</plugins>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
	</build>

Linux 中 jar 包分布
在这里插入图片描述
在这里插入图片描述

System 模块

在这里插入图片描述

Dockerfile

FROM java:8

MAINTAINER lanys

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

#添加jar包到容器中
ADD maku-cloud-system.jar  maku-cloud-system.jar

#暴露端口
EXPOSE 8081

ENTRYPOINT ["java", "-server", "-Xms512M", "-Xmx512M", "-Djava.security.egd=file:/dev/./urandom", "-Dfile.encoding=UTF-8", "-XX:+HeapDumpOnOutOfMemoryError", "-jar", "maku-cloud-system.jar" ]

生成镜像

格式:

# docker build -t 镜像名称:版本 .
docker build -t makunet_system:1.0 .

Gateway

在这里插入图片描述

Dockerfile

# 构建镜像,执行命令:【docker build -t makunet:1.0 .】

# 网关 docker build -t makunet_gateway:1.0 .
# 后台 docker build -t makunet_system:1.0 .
# 启动compost docker-compose up -d
FROM java:8

MAINTAINER lanys

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

#添加jar包到容器中
ADD maku-cloud-gateway.jar  maku-cloud-gateway.jar

#暴露端口
EXPOSE 8080

ENTRYPOINT ["java", "-server", "-Xms512M", "-Xmx512M", "-Djava.security.egd=file:/dev/./urandom", "-Dfile.encoding=UTF-8", "-XX:+HeapDumpOnOutOfMemoryError", "-jar", "maku-cloud-gateway.jar" ]

生成镜像

docker build -t makunet_gateway:1.0 .

查看生成效果

 docker images

在这里插入图片描述

docker-compose.yml

在这里插入图片描述

version: '3.9'
services:
  # 服务定义名称
  maku-cloud-gateway:
    # 指定镜像名称
    image: makunet_gateway:1.0
    # 指定运行服务名称,就是上面
    container_name: maku-cloud-gateway
    # 暴露端口
    ports:
      - 8080:8080
    # 挂载解析
    volumes:
      - /work/www/maku-cloud/maku-cloud-gateway.jar:/app/app.jar
  # 服务定义名称
  maku-cloud-system:
    # 指定镜像名称
    image: makunet_system:1.0
    container_name: maku-cloud-system
    volumes:
      - /work/www/maku-cloud/maku-cloud-system.jar:/app/app.jar

启动 docker-compose.yml

查看启动是否正常(测试):

compost docker-compose up

启动挂载:

compost docker-compose up -d

开放端口及实现效果

在这里插入图片描述
在这里插入图片描述

拓展

指定 yml 文件配置

Spring Cloud yml 配置文件 一般需要指定 Nacos 中的对应 测试环境(test)、生产环境(prod)需要在 docker-compose.yml 中设置compose变量

docker-compose.yml

maku-cloud-gateway:
    image: makunet:1.0
    container_name: maku-cloud-gateway
    ports:
      - 8080:8080
    # 设置环境变量
    env_file:
      // 指定当前目录下的 app.env 文件
      - app.env
    volumes:
      - /work/www/maku-cloud/maku-cloud-gateway.jar:/app/app.jar

app.env

nacos_host=8.134...
nacos_port=88..
nacos_namespace=53b571a0-08c7-4a2d-b094-32dc....
nacos_group=test
activated_properties=test

bootstrap.yml

server:
  port: 8081

spring:
  application:
    name: maku-cloud-system
  profiles:
    active: ${nacos_group:"dev"}
  cloud:
    nacos:
      discovery:
        server-addr: ${nacos_host:127.0.0.1}:${nacos_port:8848}
        # 命名空间,默认:public
        namespace: ${nacos_namespace:}
        service: ${spring.application.name}
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        namespace: ${spring.cloud.nacos.discovery.namespace}
        file-extension: yaml
        # 指定配置
        extension-configs:
          - data-id: datasour...yaml
            refresh: true
          - data-id: comm...yaml
            refresh: true
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐