背景
引入消息队列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
| 12
 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 (镜像配有控制台),实测好像不需要
| 12
 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页面
| 12
 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解决方案
| 12
 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
| 12
 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
我也把解决办法记录一下
| 12
 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  | 12
 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
  需要修改配置
  | 12
 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
 
 | 
  | 12
 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
| 12
 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
| 12
 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
| 12
 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文件中  | 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | FROM java:8MAINTAINER 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并配置挂载文件夹
| 12
 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/
 
 |