文章目录
前言
一、拉取镜像、运行容器
- 1.1 MySQL安装
- 1.2 Redis安装
- 1.3 Nginx安装
- 1.4 RabbitMQ安装
- 1.4.1 安装步骤
- 1.4.2 Web-UI界面无法访问
- 1.5 Elasticsearch安装
- 1.5.1 安装步骤
- 1.5.2 9200端口无法访问
- 1.6 Logstash安装
- 1.6.1 安装步骤
- 1.6.2 插件安装失败
- 1.6.3 修改镜像地址
- 1.7 Kibana安装
- 1.8 MongoDB安装
- 1.9 MinIO安装
- 1.10 docker全部环境安装完成
二、SpringBoot应用部署
- 2.1 构建所有Docker镜像并上传
- 2.2 部署mall-admin
- 2.3 部署mall-search
- 2.4 部署mall-port
- 2.5 开启防火墙
- 2.6 访问接口进行测试
- 2.7 补充:docker启动容器时报错:iptables: No chain/target/match by that name
- mall-admin
- mall-search
- mall-portal
- 接口文档
前言
1)docker cp 复制文件和目录
Docker是一种流行的容器化平台,它允许开发人员在独立、可移植的环境中构建、打包和部署应用程序。在使用Docker时,常常需要在Docker容器和主机之间进行文件的复制和共享。Docker提供了一个名为docker cp
的命令,可以轻松地在容器和主机之间复制文件和目录。
docker cp
是Docker提供的一个用于在主机和容器之间复制文件和目录的命令,语法如下:
- 从容器复制文件到主机(将容器中的文件复制到主机):
docker cp 容器id:容器内目录 主机目录
。容器id或名称均可
- 从主机复制文件到容器(将主机中的文件复制到容器):
docker cp 主机目录 容器id:容器内目录
。容器id或名称均可
注:docker cp
命令会假定容器路径相对于容器的 /(根)目录,主机路径则是相对于执行 docker cp 命令的当前目录
2)修改虚拟内存vm.max\_map\_count大小
vm.max_map_count
是一个与内核虚拟内存子系统相关的参数,用于控制进程可以拥有的内存映射区域的最大数量。它通常用于限制一个进程可以打开的文件数量,特别是在使用大量内存映射文件的情况下。
在Linux系统上,vm.max_map_count
参数的默认值通常是较小的数值,例如65530。然而,对于一些需要大量内存映射的应用程序或者特定的使用场景,可能需要修改虚拟内存区域大小、增加该参数的值,以便支持更多的内存映射区域,否则可能会因为过小而无法启动。有两种方式可以设置虚拟内存:
3)重启网络、检查Docker网络配置
如果网络配置修改、导致某些服务起不来,可通过如下命令重启网络:
4)获取容器内部的IP地址
一、拉取镜像、运行容器
1.1 MySQL安装
- 下载MySQL
5.7
的docker镜像:
- 使用如下命令启动MySQL服务:
- 参数说明
- \-p 3306:3306:将容器的3306端口映射到主机的3306端口
- \-v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂在到主机
- \-v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
- \-v /mydata/mysql/data:/var/lib/mysql/:将数据文件夹挂载到主机
- \-e MYSQL\_ROOT\_PASSWORD=root:初始化root用户的密码,可自行设置
- 进入运行MySQL的docker容器:
- 使用MySQL命令打开客户端:
- 创建mall数据库:
- 安装上传下载插件,并将
document/sql/mall.sql
上传到Linux服务器上:
- 将
mall.sql
文件拷贝到mysql容器的/
目录下:
- 将sql文件导入到数据库:
- 创建一个
reader:123456
帐号并修改权限,使得任何ip都能访问:
1.2 Redis安装
- 下载Redis
7
的docker镜像:
- 使用如下命令启动Redis服务:因为docker部署的redis并不自带redis.conf文件,需要自己下载 wget < http://download.redis.io/redis-stable/redis.conf>
各参数的意义:
1)-restart=always 总是开机启动
2)-p 6379:6379 将6379端口挂载出去
3)–name 给这个容器取一个名字
4)-v 数据卷挂载 /home/dj/redis/redis.conf:/etc/redis/redis.conf
此处是将宿主机 /home/dj/redis/redis.conf 文件映射到 redis 容器下的 /etc/redis/redis.conf,此处你也可以理解为docker容器和宿主机共享这个文件。
5)-d redis:7.0.12 后台运行容器,不加-d就是直接在控制台输出,关闭窗口即停止容器。
6) redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的 redis.conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是宿主机下共享的 /home/dj/redis/redis.conf。
补充:如果有权限相关的问题,可以给容器一个特权模式。加一个 --privileged
7)--log-opt max-size=100m --log-opt max-file=3
max-size:指定日志文件大小上限
max-file:指定日志文件个数
8)--appendonly yes redis启动后数据持久化
redis.conf内容
- 进入Redis容器使用
redis-cli
命令进行连接:
1.3 Nginx安装
- 下载Nginx
1.22
的docker镜像:
- 先运行一次容器(为了拷贝配置文件):
- 将容器内的配置文件拷贝到指定目录:
- 修改文件名称:
- 终止并删除容器:
- 使用如下命令启动Nginx服务:
1.4 RabbitMQ安装
1.4.1 安装步骤
- 下载rabbitmq
3.9-management
的docker镜像:
- 使用如下命令启动RabbitMQ服务:
- 开启防火墙:
- 访问地址查看是否安装成功:< http://192.168.3.101:15672>
如果,Web-UI界面无法访问 :
- 输入账号密码并登录:guest guest
- 创建帐号并设置其角色为管理员:mall mall
- 创建一个新的虚拟host为:/mall
- 点击mall用户进入用户配置页面
- 给mall用户配置该虚拟host的权限
1.4.2 Web-UI界面无法访问
docker ps,通过 docker exec -it 容器id /bin/bash
进入容器内部;再 运行 rabbitmq-plugins enable rabbitmq_management
。此时可以通过访问<http://linuxip:15672,访问web界面,用户名和密码默认都是guest>
1.5 Elasticsearch安装
1.5.1 安装步骤
- 下载Elasticsearch
7.17.3
的docker镜像:
- 修改虚拟内存区域大小,否则会因为过小而无法启动:
补充:vm.max_map_count
是一个与内核虚拟内存子系统相关的参数,用于控制进程可以拥有的内存映射区域的最大数量。它通常用于限制一个进程可以打开的文件数量,特别是在使用大量内存映射文件的情况下。
在Linux系统上,vm.max_map_count
参数的默认值通常是较小的数值,例如65530。然而,对于一些需要大量内存映射的应用程序或者特定的使用场景,可能需要增加该参数的值,以便支持更多的内存映射区域。有两种方式可以设置虚拟内存:
- 使用如下命令启动Elasticsearch服务,内存小的服务器可以通过
ES_JAVA_OPTS
来设置占用内存大小:
通常情况下,Elasticsearch的HTTP API监听在9200端口上,而集群通信则监听在9300端口上。
- 启动时会发现
/usr/share/elasticsearch/data
目录没有访问权限,只需要修改/mydata/elasticsearch/data
目录的权限,再重新启动即可;
- 安装中文分词器IKAnalyzer,注意下载与Elasticsearch对应的版本,下载地址:< https://github.com/medcl/elasticsearch-analysis-ik/releases>
- 下载完成后解压到Elasticsearch的
/mydata/elasticsearch/plugins
目录下;
- 重新启动服务:
通过浏览器访问 <http://ip:9200,会返回版本信息。>
1.5.2 9200端口无法访问
先尝试将vm.max_map_count
设置得大点、重启elasticsearch,如果此方式能解决问题,就永久化修改配置:
一般修改vm.max\_map\_count大小后,就能正常访问。如果还是无法访问,尝试以下步骤。
2)修改elasticsearch配置
正常情况下docker拉取es,9200端口(api)可以访问到,5.0版本后9300端口(client)访问不到,解决方法如下:
- 拉取docker中elasticsearch配置文件到本地目录
之前已启动elasticsearch的情况下,复制es配置文件到本地
- 修改配置文件(重要)
其作用是允许任何ip地址访问elasticsearch,开发测试阶段可以这么做,生产环境下指定具体的IP。
3)使用curl测试链接
1.6 Logstash安装
1.6.1 安装步骤
- 下载Logstash
7.17.3
的docker镜像:
- 修改Logstash的配置文件
logstash.conf
中output
节点下的Elasticsearch连接地址为es:9200
,配置文件地址:< https://github.com/macrozheng/mall/blob/master/document/elk/logstash.conf>
从上述路径下载logstash.conf,修改output
- 创建
/mydata/logstash
目录,并将Logstash的配置文件logstash.conf
拷贝到该目录;
- 使用如下命令启动Logstash服务;
- 进入容器内部,安装
json_lines
插件。
1.6.2 插件安装失败
进入容器然后按照json\_lines插件这一步总是安装失败,OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
或者报错Unable to download data from https://rubygems.org
问题原因:这是由于Logstash默认从国外的镜像网下载插件的,所以很慢,甚至无法下载
解决方案:
- 方案一:修改镜像地址(此处我们使用该方式)
- 方案二:离线安装
1.6.3 修改镜像地址
1)首先确保linux上有gem,没有则安装yum install gem
2)检查并修改安装源
镜像地址有以下几种:
- (舍弃,官方不再维护)淘宝的镜像(< https://ruby.taobao.org/>)
- (不推荐,无法访问)Ruby China镜像(< https://gems.ruby-china.org/)>
- (推荐)国内gem源(< https://gems.ruby-china.com/)>
- (推荐)清华镜像(< https://mirrors.tuna.tsinghua.edu.cn/rubygems/)>
1.7 Kibana安装
- 下载Kibana
7.17.3
的docker镜像:
- 使用如下命令启动Kibana服务:
- 开启防火墙:
- 访问地址进行测试:< http://192.168.56.11:5601>
1.8 MongoDB安装
- 下载MongoDB
4
的docker镜像:
- 使用docker命令启动:
\-v:将宿主机的/docker\_volume/mongodb/data映射到容器的/data/db目录,将数据持久化到宿主机,以防止删除容器后,容器内的数据丢失。
补充:
如果使用docker pull mongo
拉取最新版本的mongo,mongo启动后会停止、无法启动,使用docker logs mongo
有如下提示,WARNING: MongoDB 5.0+ requires a CPU with AVX support, and your current system does not appear to have that!
可切换到 4.4.9的mongo,重新启动mongo、正常运行
1.9 MinIO安装
- 下载MinIO的Docker镜像;
- 下载完成后使用如下命令运行MinIO服务,注意使用
--console-address
指定MinIO Console的运行端口(否则会随机端口运行):
- 运行成功后就可访问MinIO Console的管理界面了,输入账号密码
minioadmin:minioadmin
即可登录,访问地址:< http://192.168.3.101:9090>
1.10 docker全部环境安装完成
- 所有下载镜像文件:
- 所有运行在容器里面的应用:
二、SpringBoot应用部署
使用IDEA打开mall项目。
2.1 构建所有Docker镜像并上传
- 修改项目根目录下的
pom.xml
中的docker.host
属性:
- 如果项目根目录的
pom.mxl
中docker-maven-plugin
的<executions>
节点被注释掉了就打开注释,使项目在打包时直接构建Docker镜像;
- 修改.yml配置文件,运行MallAdminApplication、MallDemoApplication、MallPortalApplication、MallSearchApplication,确保都能跑起来
或者先 maven clean、package,直接修改target目录下的配置文件
包括mall-admin、mall-demo、mall-admin、mall-portal下的
- 直接双击根项目
mall
的package
命令可以一次性打包所有应用的Docker镜像;
如果报错[ERROR] DOCKER> Cannot create docker access object [Connect to 192.168.56.11:2375 [/192.168.56.11] failed: Connection refused: connect]
,表明外部无法访问2375端口。解决方法如下:
在/usr/lib/systemd/system/docker.service
文件添加-H tcp://0.0.0.0:2375
,配置远程访问
2.2 部署mall-admin
注意
:如果想使用Logstash收集日志的话,需要将应用容器连接到Logstsh,添加如下配置即可
2.3 部署mall-search
2.4 部署mall-port
2.5 开启防火墙
2.6 访问接口进行测试
- mall-admin的api接口文档地址:< http://192.168.56.11:8080/swagger-ui/>
如果部署mall-admin映射到主机38080端口,此处就要使用 < http://192.168.56.11:38080/swagger-ui/,http://192.168.56.11:38080/swagger-ui.html>
- mall-search的api接口文档地址:< http://192.168.56.11:8081/swagger-ui/>
- mall-portal的api接口文档地址:< http://192.168.56.11:8085/swagger-ui/>
2.7 补充:docker启动容器时报错:iptables: No chain/target/match by that name
docker 服务启动的时候,docker服务会向iptables注册一个链,以便让docker服务管理的容器所暴露的端口之间进行通信
通过命令 \\
iptables -L\` 可以查看iptables 链。查看链路,发现并没有相关端口的iptables 链
- 根本原因:在开发环境中,如果你删除了iptables中的docker链,或者iptables的规则被丢失了(例如重启防火墙,笔者就是重启防火墙导致),docker就会报iptables error例如:iptables: No chain/target/match by that name
- 解决方案:重启docker服务,之后,正确的iptables规则就会被创建出来。再次查看iptables 链,相关链路已经出现,服务也正常启动。
mall-admin
- 启动项目:直接运行
com.macro.mall.MallAdminApplication
的main方法即可; - 接口文档地址:<http://localhost:8080/swagger-ui/>
mall-search
- 启动项目:直接运行
com.macro.mall.search.MallSearchApplication
的main方法即可; - 接口文档地址:<http://localhost:8081/swagger-ui/>
- 使用前需要先调用接口导入数据;<http://localhost:8081/esProduct/importAll>
- 如出现无法启动的问题,可以先删除Elasticsearch里面的数据再启动
mall-portal
- 启动mall-portal项目:直接运行
com.macro.mall.portal.MallPortalApplication
的main方法即可; - 接口文档地址:<http://localhost:8085/swagger-ui/>
接口文档
由于mall项目中的大部分接口需要登录认证之后才能访问,这里以mall-admin为例,介绍下接口文档的访问。
- 成功启动
mall-admin
模块后,我们可以通过该地址来访问接口文档:<http://localhost:8080/swagger-ui/>
- 接下来我们需要访问登录接口
/admin/login
来获取token;
- 登录成功后,返回结果中将返回token和tokenHead;
- 然后点击Swagger文档的
Authorize
按钮,输入tokenHead
+token
拼接的认证请求头,注意tokenHead
后面有个空格;
- 之后调用需要登录认证的接口,就可以正常访问了;
- 对于
mall-portal
模块的接口调用也是一样的,登录获取token的接口为/sso/login
。