概述
最近在想做个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