背景
引入消息队列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 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
- 运行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
- 下载配置文件
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
|
在目录/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: #}
# 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项目
- 上传jar到服务器的指定目录
- 在该目录下创建Dockerfile 文件
vim Dockerfile
- 然后将下面的内容复制到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
|
- 创建好Dockerfile文件之后,执行命令 构建镜像:
docker build -t wlbbj .
然后docker images 看看你的容器是否存在
docker run -d –name wlbbj -p 8081:8081 wlbbj
7.安装elasticsearch
- 查询到SpringBoot与Elasticsearch的对应版本如下

本文使用的SpringBoot版本为2.3.7.RELEASE
对应的Elasticsearch版本为7.6.2
- 下载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/
|