首先说一下心得吧!刚开始拿到这个任务的时候很懵,因为我之前也就是在学校跟着导师学过一些虚拟机,但是我们在安装的时候会有可视化窗口,相对来说看着亲和许多,但是这个是一个实体机纯命令窗口所以看起来很恐怖,总感觉一不小心可能就把系统弄坏了,也是一路小心翼翼的安装,各种百度参考看各位大神是怎么做的,虽然一波三折最后也算完成啦!做IT就是不断的学习,不要害怕困难,问题解决对自己来说也算是一种提升!文末会介绍一些我在安装途中遇到在网上没有查到解决办法,最终凭着参考相关资料和几天的安装配置经验解决的问题
1、 介绍一下用到哪些技术和中间件。
数据库:neo4j、influxdb、postgre;
后端:java、SpringBoot
工具中间件:Nginx、elk、Nacos、JDK8、11
前端:vue
2、开始安装配置环境
(1)JDK8
我在安装之前先检查了一下jdk是否安装了,发现已经有了openjdk8,所以我就没有自己安装。在网上找了一个安装jdk的教程https://blog.csdn.net/qq_39390545/article/details/111769675
(2)JDK11
说明一下,有了8为什么还要11,因为有些中间件启动依赖Java环境,比如nacos、neo4j。neo4j比较新的版本还要依赖于11,所以先下载安装一下,因为java环境已经有了,11也就是现在安装包解压一下,需要用到时直接Java_HOME=安装路径即可。
下载安装包,官网路径 http://www.oracle.com/technetwork/java/javase/archive-139210.html
创建一个目录,将下载的安装包解压到路径下,自己做记录,方便后来要用时找到。
记录几个命令:
#创建多级目录
mkdir -p 路径
#解压压缩包
tar -zxvf 文件名
(3)PostgreSQL
安装服务
yum install postgresql-server
初始化数据库
postgresql-setup initdb
设置ip能访问,默认安装路径是/var/lib/pgsql/data,编辑配置文件listen_addressses='*';
#切到安装目录
cd /var/lib/pgsql/data
#编辑配置文件
vi postgresql.conf
#设置网络访问修改成listen_addressses='*'
设置开机启动,启动数据库
systemctl enable postgresql && systemctl start postgresql
修改默认密码
#登录PostgreSQL
sudo -u postgres psql
#修改登录PostgreSQL密码,命令以;结尾
ALTER USER postgres WITH PASSWORD '新密码';
#退出PostgreSQL客户端
\q
(4)InfluxDB
下载并且安装
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4.x86_64.rpm
sudo yum localinstall influxdb-1.8.4.x86_64.rpm
默认路径
#默认的配置文件
/etc/influxdb/influxdb.conf
#日志文件
/var/log/influxdb/influxd.log
#数据文件
/var/lib/influxdb/data
#初始化脚本文件
/usr/lib/influxdb/scripts
到达目录 /usr/lib/systemd/system 下 创建influxdb.service 文件 复制以下内容
[Unit]
Description=influxdb
Documentation=https://v2.docs.influxdata.com/v2.0/get-started/
After=network.target
[Service]
ExecStart=/usr/bin/influxd
Restart=on-failure
[Install]
WantedBy=multi-user.target
设置开机启动并启动
systemctl enable influxdb && systemctl start influxdb
由于我们的系统是在内部局域网使用所以很多都是默认配置,这里influxdb默认不需要用户认证,如果需要的话可以修改配置文件打开用户认证,设置用户密码,具体操作这里不介绍。
(5)Nacos
下载安装
Nacos是Java项目,Java是跨平台的,所以Nacos安装包无所谓是windows还是linux版本。
将安装包解压到一个路径下面
创建nacos.service文件配置成自定义服务,方便启动
#创建文件
vim /lib/systemd/system/nacos.service
#编辑内容,注意启动路径需要修改
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nacos/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置开机启动并且启动
systemctl enable nacos && systemctl start nacos
(6)Docker安装
下载安装 链接:
https://download.docker.com/linux/static/stable/x86_64/
#解压
tar -zxvf docker-20.10.7.tgz
#将解压出来的docker文件复制到 /usr/bin/ 目录下
cp docker/* /usr/bin/
#进入/etc/systemd/system/目录,并创建docker.service文件
cd /etc/systemd/system/
touch docker.service
#打开docker.service文件,将以下内容复制
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=192.168.200.128
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
#给docker.service文件添加执行权限
chmod 777 /etc/systemd/system/docker.service
#重新加载配置文件(每次有修改docker.service文件时都要重新加载下)
systemctl daemon-reload
#启动
systemctl start docker
#设置开机启动
systemctl enable docker.service
#重启
systemctl restart docker
(7)elk
由于elk平常安装维护的少,完全是参考一位大神写的博客,照着一步步做的,这里就直接去看大神的博客吧!
https://blog.csdn.net/m0_62877071/article/details/128210237
需要注意的是SpringBoot版本有对应的elk版本,docker的版本不够新的话,可能没有elk的一些镜像,安装之前最好先了解一下。
(8)Nginx
下载安装
docker pull nginx
启动
#后面一个nginx代表的是镜像名称,可能需要带上版本号,例如ngnix:latest
docker run --name nginx -p 80:80 -d nginx
映射文件,方便后期更新网站
#创建映射文件
mkdir -p /data/nginx/{conf,conf.d,html,logs}
#复制文件到创建的文件夹下
docker cp nginx:/etc/nginx/nginx.conf /data/nginx/
docker cp nginx:/etc/nginx/conf.d /data/nginx/conf/
docker cp nginx:/usr/share/nginx/html/ /data/nginx/html/
docker cp nginx:/var/log/nginx/ /data/nginx/logs/
#停止容器
docker stop ngnix
#移除容器
docker rm nginx
#带着映射文件启动,后面一个nginx代表的是镜像名称,可能需要带上版本号,例如ngnix:latest
docker run --name nginx -p 80:80 -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/html/:/usr/share/nginx/html/ -v /data/nginx/logs/:/var/log/nginx/ -v /data/nginx/conf/:/etc/nginx/conf.d --privileged=true -d nginx
文件映射好了,接下来只需要把网站放到html下面就可以访问了。
如果需要多个网站,可以再建一个文件夹例如ngnix81,再把nginx81文件映射一下,映射启动时把路径换一下,启动端口换一下即可
#带着映射文件启动,后面一个nginx代表的是镜像名称,可能需要带上版本号,例如ngnix:latest
docker run --name nginx -p 81:80 -v /data/nginx81/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx81/html/:/usr/share/nginx/html/ -v /data/nginx81/logs/:/var/log/nginx/ -v /data/nginx81/conf/:/etc/nginx/conf.d --privileged=true -d nginx
(9)利用Dockerfile部署java服务
创建文件夹,文件夹中放两个东西 一个dockerfile,一个jar包
dockerfile内容
FROM openjdk:8
VOLUME /tmp
ADD znjp-workflowList-3.0-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT [ "java", "-Duser.timezone=GMT+08 -Xms512m -Xmx512m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512m", "-jar", "/app.jar"]
内容代码不难分析,大概意思就是把java定义成一个jar,和java启动参数
操作镜像、容器命令
#打包镜像
docker build -t znjp-workflow .
#启动容器
docker run -p 22438:22438 -e TZ=Asia/Shanghai -d --restart=always --name znjp-workflow -m 600m -v /home/local/share:/home/local/share -v/etc/localtime:/etc/localtime znjp-workflow
#查看日志
docker logs -f --tail 100 znjp-workflow
#查看容器
docker ps
#停止容器
docker stop 名称/id
#删除
docker rm 名称/id
#查看镜像
docker images
#删除镜像
docker rmi 名称/id
注意这样部署,每次更新jar包都需要停止容器、删除容器、删除镜像、创建镜像、启动容器
(10)开放端口访问
因为防火墙原因,如果不开放端口,就算是同一个局域网也是不能访问到刚才部署的东西,下面是一些命令:
常用命令:
systemctl start firewalld #启动
systemctl stop firewalld #停止
systemctl status firewalld #查看状态
systemctl disable firewalld #开机禁用
systemctl enable firewalld #开机启动
开放或关闭端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent #开放80/tcp端口 (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --query-port=80/tcp #查看80/tcp端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent #关闭80/tcp端口
批量开放或关闭端口:
firewall-cmd --zone=public --add-port=40000-45000/tcp --permanent #批量开放端口,打开从40000到45000之间的所有端口
firewall-cmd --zone=public --list-ports #查看系统所有开放的端口
firewall-cmd --zone=public --remove-port=40000-45000/tcp --permanent #批量关闭端口,关闭从40000到45000之间的所有端口
更新防火墙的设置:
firewall-cmd --reload #更新防火墙的设置,使上面的修改生效
可以选择直接关闭防火墙,但是不建议这样做,要是被攻击了导致一些后果,可能是我们没法承担的,最好就是开放需要的端口。
3、遇到的几个问题及解决办法
(1)服务部署以后微服务之间不能相互调用
刚开始以为是防火墙的问题,搞了半天发现还是不行,最后看到一个帖子说的大概是docker启动时-p参数,然后在java服务容器启动时加上-p 11440:11440得以解决,意思就是端口映射,容器内部端口映射到主机的端口,前面是宿主机端口号,后面是容器端口号,也就是jar在nacos配置中心中配置的启动端口。
(2)服务部署以后服务不能访问宿主机已经有的文件
有了第一个问题的经验,猜到可能是因为文件路径没有映射,然后在java服务容器启动时加上-v /download/temp:/download/temp得以解决,意思就是文件路径映射,容器内部文件路径映映射到主机的文件路径映,前面是宿主机文件路径映,后面是文件路径映。
(3)服务部署以后占用的运行内存越来越大
我一共部署了四十多个服务,服务部署以后过了半天发现128g运行内存的服务器只剩一两个g运行内存了,而且发现好多服务响应时间都非常的长,甚至不响应了,去服务器上看的时候也卡的要死,还有服务OOM了。
很纳闷,因为我在dockerfile文件里面已经设置了最大内存,四十几个服务怎么也不可能达到128g,在网上看了很多帖子,最后找到一个关于容器在启动时设置最大内存的,刚开始感觉不太可能是因为这个,然后查看了一下运行内存占用详细信息,发现每个java程序都是一两个g甚至更大,然后就试试看看可不可行,由于机器基本已经卡死了,只能硬件强制重启服务器,然后每个启动参数都带上-m 600m得以解决,意思就是设置一个容器使用内存最大值,具体数字可以根据需要更改。
(4)配置静态ip问题
在配置网络时,还遇到一个问题。由于我们系统是欧拉的,有些文件名称和centos的不太一样,再加上我对这个不太懂,然后我就把eno1配置成静态ip了,导致系统两个ip,在ifconfig的时候eno1和eno3都是同一个ip,这样一来无论是我ping其他ip还是其他ip来ping这个都不通,自己也不知道是这个问题,后来就在网上看到都是配置的ens3文件,我也感觉两个ip很奇怪,然后就把eno1恢复了,把eno3配置成静态ip,重启以后得以解决。
(5)解决容器服务可以用127.0.0.1ip访问
在第一个问题中映射了端口,虽然能通过宿主机ip加端口访问,但是我们的服务器可能会迁移,这样一来迁移一次就得全部服务的配置ip都要改一次,很麻烦!!!于是就想用127.0.0.1的ip启动服务,可是这样启动是有问题的,由于容器都是单独的ip,如果配置成127.0.0.1启动服务是不能互相调用的。请教了一下用过docker的兄弟,说是加一个启动参数可以实现127.0.0.1的ip访问,试了一下是可以行得通的。