背景

引入消息队列rabbitmq时,需要在服务器安装rabbitmq,但考虑到安装rabbitmq还需要安装Erlang,并且还需自己找安装包安装较为复杂,最终选择引入docker容器技术,后续陆续将项目、mysql、redis都移入docker容器内,便于开发

内存计算,服务器总内存4g(实际内存3.5g,出去系统占用,可分配内存大概为3g),redis分配1g,mq占用200m,mysql占用200mb,java程序占用100-mb,剩余1.5g(以后分配其他微服务组件)

1.安装docker

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
# 1.yum包更新到最新
yum update

# 2.安装需要的软件包(yum-utils提供yum-config-manager的功能,,并且device mapper存储驱动程序需要device-mapper-persistent-data和lvm2)
yum install -y yum-utils device-mapper-persistent-data lvm2

# 3.设置yum源为阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4.安装docker
yum install docker-ce -y

# 5.安装后查看docker版本
docker -v

# 6.阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://7m1k2vj2.mirror.aliyuncs.com"]
}
EOF
#此处连接在阿里云找到。登录阿里云->控制台->容器镜像服务->镜像工具->镜像加速工具->加速器地址
sudo systemctl daemon-reload
# 开机启动
systemctl enable docker
sudo systemctl restart docker

2.安装rabbitMq

有说安装时要安装后面带有management的版本比如rabbitmq:3.8.14-management (镜像配有控制台),实测好像不需要

1
2
3
4
5
6
7
8
9
10
11
12
13
#拉去rabbitmq最新镜像
docker pull rabbitmq

#运行rabbitmq -v为容器卷挂载
#rabbitmq的运行时的data conf log都会存在/opt/docker-work/rabbitmq文件夹下
#注意1:一定要添加容器卷挂载,要不然容器down了就所有数据都没有了
#注意2:可以先新建文件夹后再运行(实测会自动建立主机本地文件夹)
#注意3:--privileged=true 一定要加
#注意4:这里15673是服务器的 15672是rabbit内部运行的端口 5673:5673同理
docker run -d -p 5673:5672 -p 15673:15672 -v /opt/docker-work/rabbitmq/data:/var/lib/rabbitmq -v /opt/docker-work/rabbitmq/conf:/etc/rabbitmq -v /opt/docker-work/rabbitmq/log:/var/log/rabbitmq --hostname=rabbitmqhost --privileged=true rabbitmq

#查看是否正常运行,有可能会莫名其妙原因没启动成功
docker ps

开放服务器的5673和15673端口,一般在对应服务器商的控制台

开启web页面

1
2
3
4
5
docker exec -it myrabbit /bin/bash

myrabbit指自己启动容器时定义的名称

rabbitmq-plugins enable rabbitmq_management

外网浏览器访问http://ip:15673/#/

默认账户密码都是 guest

默认用户guest访问报错User can only log in via localhost解决方案

1
2
3
4
5
6
7
8
9
10
11
#1.首先进入容器 
docker exec -it dcbccaa89648 /bin/bash

#2.创建用户
rabbitmqctl add_user admin admin123

#3.给用户授权角色
rabbitmqctl set_user_tags admin administrator

#4.给用户添加权限
rabbitmqctl set_permissions -p / admin “." ".” “.*”

不用重启服务,直接访问即可。

3.安装mysql

这里安装的是mysql5.7.39

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#拉去rabbitmq最新镜像
docker pull mysql:5.7.39

#运行mysql -v为容器卷挂载
#注意1:一定要添加容器卷挂载,要不然容器down了就所有数据都没有了
#注意2:--privileged=true 一定要加
#注意3:3307是服务器的端口 3306是docker容器内部的端口
#注意4:--character-set-server=utf8mb4 设置字符集
#注意5:--collation-server=utf8mb4_general_ci 排序方式
#注意6:MYSQL_ROOT_PASSWORD 初始化密码
####注意!!!这里会报错,docker logs mysql发现 原因是conf文件夹内没有文件,无法挂载,解决办法看下面
docker run -d --name mysql -p 3307:3306 -v /opt/docker-work/mysql5.7/data:/var/lib/mysql -v /opt/docker-work/mysql5.7/conf:/etc/mysql -v /opt/docker-work/mysql5.7/log:/var/log/mysql -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123456 --privileged=true mysql:5.7.39 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

#查看是否正常运行,有可能会莫名其妙原因没启动成功
docker ps

在什么运行docker的mysql时发现报错,查看logs后是配置文件没有找到对应的文件夹。找到这个博主的解决方法,能成功解决
mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘ Errcode: 2 - No such file or directory

我也把解决办法记录一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#1.先随意创建一个mysql容器
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7.39

#2.查看运行的容器
docker ps

#3.将mysql容器中的/etc/mysql中的mysql目录下的文件复制到宿主机/mydata/mysql/conf目录下
#命令格式:docker cp 容器id:容器内目录 宿主机目录
docker cp 4b1a0fe53315:/etc/mysql /opt/docker-work/mysql/conf
#4.检查一下/opt/docker-work/mysql/conf文件夹下,有两个文件夹分别是conf.d/ 和 mysql.conf.d/

#5.关掉刚刚的容器
docker rm -f mysql

#6.现在运行容器,能正常使用
docker run -d --name mysql -p 3307:3306 -v /opt/docker-work/mysql5.7/data:/var/lib/mysql -v /opt/docker-work/mysql5.7/conf:/etc/mysql -v /opt/docker-work/mysql5.7/log:/var/log/mysql -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=jxw78d3xl6r0wy7jb --privileged=true mysql:5.7.39 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

docker exec -it mysql /bin/bash
mysql -uroot -p123456
#7.创建数据库,新建数据后,退出并删除此容器
docker stop mysql && docker rm mysql

#8.数据依然存在,即可。表示数据正常挂载保存宿主机

用图形化软件链接服务器的3307端口即可。

4.安装redis

redis可以直接指定conf文件配置,也可以不指定配置

4.1 不指定redis.conf

  1. 运行Redis
    1
    2
    3
    4
    # 运行服务
    docker run -it --name redis-master -d -p 6300:6379 redis redis-server --requirepass masterpassword
    # 测试连接redis
    docker exec -it redis-master redis-cli -a <master-password>

4.2 指定redis.conf

  1. 下载配置文件
    wget http://download.redis.io/redis-stable/redis.conf

需要修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bind 127.0.0.1 # 注释当前行,表示任意ip可连
daemonize no #一定要为no 设置为yes
# 则可能会导致Docker容器异常终止的问题。
# 因为在Docker中,容器的生命周期是由主进程(PID为1)来管理的,
# 而如果Redis进程作为守护进程运行,它将不会成为容器的主进程,
# 而是成为一个子进程。如果Redis进程在后台终止或崩溃,
# Docker容器可能会认为主进程已经退出,从而导致容器的异常终止。

requirepass masterpassword # 设定密码

# 要启用混合持久化,您需要在Redis配置文件中设置以下两个参数:
save 900 1 # 触发RDB持久化的条件
appendonly yes # 开启AOF持久化
appendfsync everysec # 表示Redis每秒钟将AOF缓冲区中的数据写入磁盘一次,确保数据的最高安全性和一致性。

bind 0.0.0.0 # 表示所有ip都可以连接这台redis 可以指定从服务器和部署项目服务器的ip

1
2
3
4
5
6
7
8
9
10
# 运行服务--restart=always 
docker run --log-opt max-size=100m --log-opt max-file=2 -p 6300:6379 --name redis-master -v /opt/docker-work/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /opt/docker-work/redis/data:/data -d redis redis-server /usr/local/etc/redis/redis.conf

# 测试连接redis
docker exec -it redis-master redis-cli -a <master-password>

# 新增数据后
docker rm -f redis

# 创建一个新的redis检查数据是否成功挂载到本地

5.安装nginx

docker官网

查到当前stable的版本是1.22.1

1
2
3
4
5
6
7
8
docker pull nginx:1.22.1

docker run -d --name nginx -p 80:80 \
-v /opt/docker-work/nginx/conf/vhost:/etc/nginx/conf.d:rw \
-v /opt/docker-work/nginx/logs:/var/log/nginx:rw \
-v /opt/docker-work/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:rw \
-v /opt/docker-work/nginx/html:/etc/nginx/html:rw \
nginx:1.22.1

在/opt/docker-work/nginx/conf创建nginx.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
28
29
30
31
32
user  nginx;

worker_processes 1;

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;
}

在目录/opt/docker-work/nginx/conf/vhost下创建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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
server {

listen 80;
server_name localhost;

#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;

location / {
#root /data/nginx/html;
root /usr/share/nginx/html;
index index.html index.htm;
#autoindex on;
#try_files $uri /index/index/page.html;
#try_files $uri /index/map/page.html;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

npm run build打包后放到html即可。

6.部署jar项目

  1. 上传jar到服务器的指定目录
  2. 在该目录下创建Dockerfile 文件

vim Dockerfile

  1. 然后将下面的内容复制到Dockerfile文件中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FROM java:8
    MAINTAINER lnx
    ADD wulibibiji-0.0.1-SNAPSHOT.jar wlbbj.jar
    EXPOSE 8081
    ENTRYPOINT ["java","-jar","wlbbj.jar"]

    # from java:8 拉取一个jdk为1.8的docker image
    # maintainer 作者是lnx,指令设置生成镜像的 Author 字段
    # crm-0.0.1-SNAPSHOT.jar 就是你上传的jar包,替换为jar包的名称
    # crm.jar 是你将该jar包重新命名为什么名称,在容器中运行
    # expose 该容器暴露的端口是多少,就是jar在容器中以多少端口运行
    # entrypoint 容器启动之后执行的命令,java -jar crm.jar 即启动jar
  2. 创建好Dockerfile文件之后,执行命令 构建镜像:

docker build -t wlbbj .

  1. 然后docker images 看看你的容器是否存在

  2. docker run -d –name wlbbj -p 8081:8081 wlbbj

7.安装elasticsearch

  1. 查询到SpringBoot与Elasticsearch的对应版本如下

本文使用的SpringBoot版本为2.3.7.RELEASE

对应的Elasticsearch版本为7.6.2

  1. 下载docker并配置挂载文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker pull elasticsearch:7.6.2

mkdir config
mkdir data
mkdir plugins
echo "http.host: 0.0.0.0" >> config/elasticsearch.yml


docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /opt/docker-work/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /opt/docker-work/elasticsearch/data:/usr/share/elasticsearch/data \
-v /opt/docker-work/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
--privileged=true elasticsearch:7.6.2

# 如果启动报错,需要给config和data和plugins权限
chomd 777 /opt/docker-work/elasticsearch
chomd 777 /opt/docker-work/elasticsearch/**

# 访问,有数据即可
http://124.71.183.56:9200/