docker swarm搭建spring cloud全过程

服务器环境安装

本文记录生产环境搭建服务器过程

服务器环境说明

服务器 主机名 作用 系统版本 内核版本
10.148.30.160 node60 集群管理者 Centos7.6 3.10.0-957.21.3.el7.x86_64
10.148.30.161 node61 集群节点 Centos7.6 3.10.0-957.21.3.el7.x86_64
10.148.30.162 node62 集群节点 Centos7.6 3.10.0-957.21.3.el7.x86_64

服务器安装软件列表

  • docker-18.09.7
  • mysql-8.0.16
  • jdk-8u211

修改主机名

1
2
3
4
5
6
7
# 名称格式为: hostnamectl set-hostname xxx
# 在 10.148.30.160 执行
sudo hostnamectl set-hostname node60
# 在 10.148.30.161 执行
sudo hostnamectl set-hostname node61
# 在 10.148.30.162 执行
sudo hostnamectl set-hostname node62

修改三台主机分别添加host解析, 在/etc/hosts后面添加以下内容

1
2
3
10.148.30.160 node60
10.148.30.161 node61
10.148.30.162 node62

结果如图

测试是否生效

1
ping node60

结果如图

配置RSA登录

ssh RSA登录,是一种免密登录远程主机方式,为了让局域网主机之间访问更方便和安全,开启RSA免密登录方式

生成RSA公钥和私钥

在node60上执行

1
ssh-keygen -t rsa

命令选项参数使用默认参数,一直按回车完成生成公钥!

将公钥存储到远程主机

1
2
3
4
# i后面接的参数是保存你公钥的文件(我们这里是.ssh/id_rsa.pub);
# .ssh/authorized_keys文件写入id_rsa.pub保存的公钥
ssh-copy-id -i .ssh/id_rsa.pub root@node61
ssh-copy-id -i .ssh/id_rsa.pub root@node62

开启远程主机ssh的公钥登录

检查ssh服务的配置文件——/etc/ssh/sshd_config

1
2
3
RSAAuthentication yes    # 这行一定要取消注释的(删掉#号)
PubkeyAuthentication yes # 我的服务器没这行,不添加似乎也能用
AuthorizedKeysFile .ssh/authorized_keys # 我的服务器没这行,不添加似乎也能用

网上好多教程说要重启ssh服务,额。我没重启也生效了呀

重启ssh服务命令

1
systemctl restart sshd

如果想在node61和node62上做免密登录,也需要在node61和node62执行上述步骤

服务器分区

服务器硬盘分区 parted 硬盘分区

安装Docker

请查看docker安装教程 docker 安装教程

配置docker swarm集群

初始化swarm集群

在node60上初始化作为docker集群管理机

1
2
3
4
# 查看命令帮助
docker swarm init --help
# 创建swarm集群
docker swarm init --advertise-addr 10.148.30.160

结果如下图:
创建集群

开放docker swarm通信端口

集群节点之间保证TCP 2377、TCP/UDP 7946和UDP 4789端口通信

分别在node60,node61,node62上开放防火墙端口

TCP端口2377集群管理端口

TCP与UDP端口7946节点之间通讯端口

TCP与UDP端口4789 overlay网络通讯端口

1
2
3
4
5
6
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --reload

把另外两台主机加入到集群中

在node61,node62中执行初始化swarm集群的返回结果,上述图中红色圈出来的部分。
如果终端关闭或者退出了,可以在集群管理节点执行如下命令

1
2
# 重新获取join-token
docker swarm join-token worker

在node61和node62执行结果如图
加入dockerswarm

查看集群创建结果

在集群管理节点查看集群状态

1
docker node ls

结果如图
集群结果图

导入 docker rabbitmq redis 等镜像

从docker官网下载镜像成jar形式,上传到node61

1
2
# 导入镜像 rabbitmq
docker load -i rabbitmq.tar

结果如图

配置registry仓库

请查看Docker仓库Docker-registry安装和简单配置 Docker仓库Docker-registry安装和简单配置

安装nginx

下载安装包 nginx官网

下载成功后上传到node61

1
2
# 安装nginx
rpm -ivh nginx-1.9.8-1.el7.ngx.x86_64.rpm

nginx 配置文件目录 /etc/nginx

开启gzip压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# sudo vim /etc/nginx/nginx.conf

user nginx;
worker_processes 2;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

gzip on;

include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/default.conf 中配置反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 配置vue首页和代理
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.html?s=$1 last;
break;
}
root /usr/share/nginx/html;
index index.html index.htm;
}


# 配置java反向代理
location /api/v1/ {
proxy_pass http://localhost:8080/api/v1/; #来自jsp请求交给tomcat处理
proxy_redirect off;
proxy_set_header Host $host; #后端的Web服务器可以通过X-Forwarded-For>获取用户真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k以下的话>,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

上传前端代码到 /usr/share/nginx/html

安装java8

下载jdk8并上传到node60

删除Centos7自带的openjdk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 查看java是否存在
[root@node60 ~]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

# 查看是否已经安装openjdk
[root@node60 ~]# rpm -qa | grep java
tzdata-java-2019a-1.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.212.b04-0.el7_6.x86_64
python-javapackages-3.4.1-11.el7.noarch
java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64

# 删除openjdk
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64

# 删除openjdk-headless
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.212.b04-0.el7_6.x86_64

# 安装jdk-8u211-linux-x64
rpm -ivh jdk-8u211-linux-x64.rpm

# 查看安装结果
[root@node60 soft]# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

java 安装完毕

安装maven(可选)

下载并上传安装包, 二进制安装包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#  解压安装包
[root@node60 soft]# tar -xzvf apache-maven-3.6.1-bin.tar.gz

# 移动到 opt 目录下
[root@node60 soft]# mv apache-maven-3.6.1 /opt/

#设置环境变量
[root@node60 opt]# vim /etc/profile

# 在最后添加
# Maven环境变量配置
export MAVEN_HOME=/opt/apache-maven-3.6.1
export PATH=$PATH:$MAVEN_HOME/bin

#环境变量生效
[root@node60 opt]# source /etc/profile

#验证
[root@node60 opt]# mvn -version
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00)
Maven home: /opt/apache-maven-3.6.1
Java version: 1.8.0_211, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_211-amd64/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.21.3.el7.x86_64", arch: "amd64", family: "unix"

软件部署

创建overlay网络

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建overlay网路
docker network create \
--driver overlay \
--subnet 192.168.20.0/24 \
--gateway 192.168.20.1 \
my-overlay

# 查看网络
[root@node60 compose]# docker network ls
NETWORK ID NAME DRIVER SCOPE
55b00935fbe5 bridge bridge local
37fc8530569b docker_gwbridge bridge local
498765e6727c host host local
xy0efm1wfmnn ingress overlay swarm
xslgt0x31q86 my-overlay overlay swarm
01415e574220 none

Over