容器化部署
# 容器化部署
# 后端本地容器部署
本地采用容器方式进行项目的部署,因为每个人使用的电脑,操作系统都各不相同,加之不同人的喜好和偏好也不尽相同,无法做到全覆盖。
提示
这里仅以容器方式安装Nacos
,ELK
,Kafka
,Zookeeper
,Sentinel
,本地安装PostgreSQL
,MySQL
和Redis
的方式,进行示意性说明。仅供参考,具体安装请结合自身及时情况,适时调整。
本地安装
- PostgreSQL
- MySQL
- Redis
容器安装
- Nacos
- ELK
- Kafka & Zookeeper
- Sentinel
# [1]本地Docker安装(Windows版)
- Windows 本地安装 Docker 请参考个人博文:
- Windows 10 2004 (20H1) 安装 Docker Desktop for Windows (2.3.0.2) 以 WSL 2 方式运行容器 (opens new window)
- Windows 10 将 Docker Desktop for Windows(WSL 2 方式)文件存储移出C盘放置到其它目录 (opens new window)
# [2]安装配置MySQL
- 正常安装MySQL
- 创建Nacos持久化数据库
即在MySQL中,为Nacos新建用户,新建数据库,给数据库用户分配数据库权限。
- 导入Nacos初始脚本
下载 (opens new window)最新稳定版的Nacos压缩包。解压后,在{NACOS_HOME}/conf
目录下,找到nacos-mysql.sql
导入到数据库中。
提示
在工程的${project home}/configurations/scripts
目录下,保存了一份Nacos脚本可以使用,如果不是最新请自行重新下载。
- 开放MySQL数据库IP访问
正常情况下,本地开发使用localhost
就可以访问已安装的mysql服务; 因为Docker是使用内部的独立网络,Docker内部容器想要访问外部的数据库,只能通过ip地址才能访问。所以需要开放数据库的IP访问,否则会出现 Docker 容器发无法连接数据库的情况。
使用命令行工具,登录进入MySQL,输入以下脚本查看数据库的可访问情况:
mysql> select host,user from mysql.user;
查询结果示例:
| host | user |
| --------- | ---------------- |
| localhost | root |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
2
3
4
5
6
host字段的值是localhost,说明只允许本地访问
找到对应你所用的用户,设置允许任意IP访问,执行语句:
mysql> update mysql.user set host = '%' where user = 'root';
mysql> flush privileges;
2
3
# [2]安装配置PostgreSQL
- 安装PostgreSQL数据库
正常安装即可。跟随安装的Wizard一步一步进行即可。
- 创建应用数据库
参见:创建应用数据
- 导入建表数据
参见:导入数据库脚本
- 开放IP访问
如果想要使用Docker封装的服务,就需要开放PostgreSQL
的IP访问。Windows环境,链接PostgreSQL
是主机名填写“localhost”
可以正常链接,使用IP地址不能进行链接
在${PostgreSQL_HOME}/12/data
目录下,找到postgresql.conf
和pg_hba.conf
。
- 打开
postgresql.conf
,在59行,找到listen_addresses
,修改为:
listen_addresses = '*'
- 修改端口号打开
postgresql.conf
,在63行,找到port
PostgreSQL 12 中,该项默认就为 ‘*’,所以可以不用修改
- 打开
pg_hba.conf
,在最后增加:
host all all 192.168.0.0/16 trust
允许访问PostgreSQL服务器的客户端IP地址, 其中:192.168.0.0/16表示允许192.168.0.1-192.168.255.255网段访问。可根据实际情况调整
- 重启数据服务
# [3]安装配置Redis
- 安装Redis
正常安装即可
- 开放IP访问
在redis
安装目录下,找到redis.windows-service.conf
- 将
56
行bind 127.0.0.1
注释掉,修改为
#bind 127.0.0.1
- 将
75
行protected-mode
参数改为no
protected-mode no
生产环境不建议这样,还是要指定具体IP安全一些
- 重启服务
# [4]部署Kafka,Zookeeper,Nacos,ELK,Sentinel Dashboard
除了MySQL
,PostgreSQL
和Redis
以外,其它相关运行环境组件 Zookeeper
,Kafka
,Nacos
,ELK
,Sentinel Dashboard
,可以通过docker-compose
方式进行部署,执行以下命令即可:
- 运行容器
注意:
ELK
依赖一个重要参数 vm.max_map_count
,如果这个值小于262144
,ELK
会无法正常启动
一种解决办法
如果是采用 WSL2
的方式运行容器,那么在Linux中输入以下命令
sudo -i
sudo sysctl vm.max_map_count=524288
2
然后在启动Docker Desktop
另一种解决办法:
- open powershell
- wsl -d docker-desktop
- echo "vm.max_map_count = 262144" > /etc/sysctl.d/99-docker-desktop.conf
参考 : https://github.com/docker/for-win/issues/5202 (opens new window)
说明
已经将Dockerfile以及docker-compose修改为参数运行。
因此运行一下命令时,请确保.env 文件在执行命令的目录下。
例如:如果在C:\Users\Administrator\Desktop
执行命令,那么.env
文件,就需要在C:\Users\gengwei.zheng\Desktop
目录下
docker-compose -f ${project_home}/configurations/docker/docker-compose/linux/herodotus/env.base.yml up -d
该命令会查看本地是否已经有了相关镜像,如果没有会首先下载镜像,然后再运行,请先保证网络畅通
- 停止容器
docker-compose -f ${project_home}/configurations/docker/docker-compose/linux/herodotus/env.base.yml stop
- 停止并删除容器
docker-compose -f ${project home}/configurations/docker/docker-compose/linux/herodotus/env.base.yml down
# [5]部署Skywalking
注意
由于 Skywalking
采用 Elasticsearch
进行数据存储,因此 Skywalking
运行之前,要保证 Elasticsearch
已经正常运行。
虽然docker-compose有depends_on属性,但是该属性只能解决容器启动的先后顺序问题,并不能实现某一个容器及容器内部所有应用启动成功之后再运行的问题。
因此,这里将环境依赖的应用,拆分为两个docker-compose
文件,
- 先运行
${project_home}/configurations/docker/docker-compose/linux/herodotus/env.base.yml
,待所有容器及内部服务成功运行之后, - 再运行
${project_home}/configurations/docker/docker-compose/linux/herodotus/env.skywalking.yml
通过docker-compose方式进行部署,执行以下命令即可:
- 运行容器
docker-compose -f ${project_home}/configurations/docker/docker-compose/linux/herodotus/env.skywalking.yml up -d
该命令会查看本地是否已经有了相关镜像,如果没有会首先下载镜像,然后再运行,请先保证网络畅通
- 停止容器
docker-compose -f ${project_home}/configurations/docker/docker-compose/linux/herodotus/env.skywalking.yml stop
- 停止并删除容器
docker-compose -f ${project_home}/configurations/docker/docker-compose/linux/herodotus/env.skywalking.yml down
# [6]服务打包部署
在命令行中,执行以下命令即可
- 运行容器
docker-compose -f ${project home}/configurations/docker/docker-compose/linux/herodotus/services.dev.yml --env-file=${project_home}/configurations/docker/docker-compose/linux/herodotus/.env up -d
该命令会查看本地是否已经有了相关镜像,如果没有会首先构建镜像,然后再运行,请先保证网络畅通
- 停止容器
docker-compose -f ${project home}/configurations/docker/docker-compose/linux/herodotus/services.dev.yml --env-file=${project_home}/configurations/docker/docker-compose/linux/herodotus/.env up -d stop
- 停止并删除容器
docker-compose -f ${project home}/configurations/docker/docker-compose/linux/herodotus/services.dev.yml --env-file=${project_home}/configurations/docker/docker-compose/linux/herodotus/.env up -d down
# 服务器容器部署
提示
应用环境的部署是一项大工程,同样的基础设施根据不同应用场景需求,可以采用多种多样不同的方式进行部署。基础设施的部署也比较复杂,其中任意一项都可以单独作为专门话题进行讨论。这就是所谓的“千人千面”, 而且基础设施部署并不是本项目的重点,所以此处不再展开。当然,只要是技术问题,欢迎在群里积极讨论交流。
使用Docker-compose打包Docker,参见[Eurynome Cloud Docker 打包使用方法](#Eurynome Cloud Docker 打包使用方法)
# Docker打包设计
# Eurynome Cloud Docker 打包设计初衷
Eurynome Cloud Docker 打包的设计,采取了与大多数开源微服务框架不同的方式。采取这种不同的方式进行打包,主要是考虑解决以下两方面问题:
# [1]Skwalking Agent的引入问题
系统中为了解决服务链路跟踪及监控的问题,引入了Skywalking组件。Skywalking想要正确运行,除了要保证Skywalking Server的正常运行外,还要将Skywalking"注入"到服务的运行环境中。
- 如果是以
fat jar
的方式运行服务,需要在服务的运行命令中指定Skywalking Agent以及相关的参数,如下命令
java -javaagent:/skywalking-agent.jar=agent.service_name=${SW_AGENT_SERVICE_NAME},collector.backend_service=${SW_COLLECTOR_BACKEND_SERVICE} ${JAVA_OPTS} -jar /app.jar
- 如果是以Docker的方式运行服务,传统的方式就需要把
skywalking-agent.jar
一并打入到服务的docker中。
由于Docker-compose打包上下文的问题,就需要在每一个模块中都复制一份skywalking-agent.jar。很不好管理,看着也不舒服。
# [2]Dockerfile的编写和放置问题
常规Java微服务的Docker打包方式,要么采用Maven Plugin的方式,要么采用docker-compose的方式。不管哪一种方式,都需要在该服务代码所在目录下新建一个Dockerfile文件。
一方面,每个服务下的Dockerfile文件中的配置信息,除了服务的JAR包名不同以外,其余的所有配置都相同,就是一种重复劳动。
另一方面,如果要增加Skywalking,那么需要在每一个服务所在目录下都拷贝一份skywalking-agent.jar
。不仅重复工作,代码结构也不美观整洁。
# Eurynome Cloud Docker 打包的设计
为了解决上述两方面问题,Eurynome Cloud
在所有模块之外之指定了一个统一的目录,将需要打包的jar以及dockerfile全部放入该目录,通过该目录形成一个统一的上下文环境。在Eurynome Cloud工程中,${project_home}/configurations/docker/context
就是这个上下文环境。
在这个上下文环境中,除了包含通用的Dockerfile,Skywalking Agent以外,在使用Maven进行编译的过程中,还会将所有需要打包服务的对应的jar包拷贝到${project_home}/configurations/docker/context/target
目录下。这样打包的所有资源就都已经具备,同时还解决了上述两个问题。
提示
可以通过修改${project_home}/pom.xml
中的<docker.build.directory>
值,来改变拷贝jar包的目录
# Eurynome Cloud Docker 打包使用方法
# [1]修改信息
由于使用了一个统一的Dockerfile来解决重复定义Docker打包配置文件的问题,想要实现使用一个Dockerfile打出不同的Docker,那么就需要通过传参的方式来改变Dockerfile中的值。
这里采用的是环境变量的方式,在${project_home}/configurations/docker/docker-compose/.env
文件中定义这些参数。其中包含版本号以及具体服务对应的包名。所以如果有新增服务或者想要指定版本号,首先就需要修改这个配置文件。
# [2]执行命令
执行打包命令
docker-compose -f ${project home}/configurations/docker/docker-compose/linux/herodotus/services.dev.yml --env-file=${project_home}/configurations/docker/docker-compose/linux/herodotus/.env up -d
或者
docker-compose -f ${project home}/configurations/docker/docker-compose/linux/herodotus/services.prod.yml --env-file=${project_home}/configurations/docker/docker-compose/linux/herodotus/.env up -d
说明
上文说到想要以Docker的方式运行服务并且关联Skywalking,就需要在打包时将Skywalking Agent打入到Docker中。但实际应用中并不是所有环境都需要使用Skywalking,比如:在生产环境需要使用Skywalking,在开发环境中并不需要Skywalking以降低资源消耗。
因此,Eurynome Cloud 提供了两种打包配置
使用${project home}/configurations/docker/docker-compose/linux/herodotus/services.dev.yml
这个Docker-compose配置文件打包时,对应的Dockerfile文件是${project home}/configurations/docker/context/development/Dockerfile
。这个Dockerfile配置中,没有包含Skywalking Agent的拷贝命令。
使用${project home}/configurations/docker/docker-compose/linux/herodotus/services.prod.yml
这个Docker-compose配置文件打包时,对应的Dockerfile文件是${project home}/configurations/docker/context/production/Dockerfile
。这个Dockerfile配置中,包含了Skywalking Agent的拷贝命令。
这样通过不同的命令,实现了对不同Docker环境需求的支持。
# 前端本地容器部署
# [1]修改后端网关地址
在工程 eurynome-cloud-ui/packages/@herodotus/ui
目录下,找到 .env.production
配置文件。
修改配置参数 VUE_APP_GATEWAY
的值为可以正确访问的后端服务网关地址。
# [2]编译前端代码
使用下面命令,编译前端代码。
// 重新编译组件库
lerna run lib
// 编译前端工程代码
yarn e:ui prod
2
3
4
5
6
7
# [3]打包Docker镜像
执行以下命令,将已经编译好的前端代码,打包成 Docker
镜像。
docker-compose -f ${ui-project-home}/container/herodotus/ui.yml up -d
2
3
# [4]验证
在浏览器中,访问地址 http://ip:3000
。 前端页面正常打开,说明打包部署成功。