全部开发者教程

企业级在线办公系统

上节课我们安装好了Docker环境,在部署程序之前,我们首先要把MySQL、MongoDB、Redis和RabbitMQ,都部署在Docker容器中。为了分别管理起来更方便,每个程序部署到一个单独的容器中。

一、安装MySQL

利用上节课设置的加速器,我们可以在线安装MySQL镜像,这里我下载8.0.23版本的MySQL数据库。

docker pull mysql:8.0.23

创建容器的时候,我们需要把MySQL容器内的数据目录映射到CentOS系统上面。如果MySQL容器挂掉了,数据库文件不会丢失。我们新建一个MySQL容器,挂载上这个数据目录就又能正常使用MySQL了。

以前我说过Docker会给每个容器创建一个虚拟的网卡,然后分配一个Docker内网IP地址。假设A容器部署了MySQL,B容器中的Java程序想要访问A容器的MySQL,JDBC路径就要写A容器的Docker内网IP地址,略显麻烦。
这次部署项目,我打算把容器设置成host模式,就是不让Docker为容器虚拟网卡,Docker容器直接使用CentOS的网卡。A容器和B容器中使用的都是CentOS的网卡,所以A容器中localhost代表CentOS,B容器中的localhost也代表CentOS,两个容器相互访问,URL地址写localhost即可。例如B容器中JDBC路径的host写localhost,就能访问到A容器里面的MySQL。这样我们部署的若干容器,相互访问就简单多了。

MySQL容器我分配内存空间是500M,如果将来觉得不够用,删除容器,再创建新容器的时候分配更大的内存。而且只要挂载上那些文件目录,MySQL的数据就不会丢失。

docker run -it -d --name mysql --net=host \
-m 500m -v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/config:/etc/mysql/conf.d  \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai mysql:8.0.23 \
--lower_case_table_names=1

用Navicat连接MySQL数据库,创建emos逻辑库,然后导入git上面的SQL文件。

三、安装MongoDB

执行命令,下载特定版本的MongoDB镜像。最新版本的MongoDB连接的时候登录认证兼容性不好,所以我们不必追求最新版本的MongoDB,我们只追求运行稳定,所以通用的老版本就很适合我们。

docker pull mongo:4.4.7

创建/root/mongo/mongod.conf文件,然后在文件中添加如下内容:

net:
   port: 27017
   bindIp: "0.0.0.0"

storage:
   dbPath: "/data/db"

security:
   authorization: enabled

创建容器,为MongoDB分配500M内存。

docker run -it -d --name mongo --net=host \
-v /root/mongo:/etc/mongo \
-v /root/mongo/data/db:/data/db \
-m 500m \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai \
mongo:4.4.7 --config /etc/mongo/mongod.conf

四、安装Redis程序

执行命令,在线安装Redis镜像,这里我们也是安装特定版本的Redis。

docker pull redis:6.0.10

创建/root/redis/conf/redis.conf文件,然后添加如下内容:

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile ""
databases 4
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
requirepass abc123456

执行命令,创建Redis容器,分配300M内存。

docker run -it -d --name redis -m 300m  --net=host \
-e TZ=Asia/Shanghai \
-v /root/redis/conf:/usr/local/etc/redis redis:6.0.10 \
redis-server /usr/local/etc/redis/redis.conf

五、安装RabbitMQ

执行命令,在线安装RabbitMQ镜像。虽然咱们的项目暂时没有用上RabbitMQ,但是在手册中我会更新消息模块的代码,那时候就会用上RabbitMQ了,所以咱们先把RabbitMQ部署好,以后要用到。

docker pull rabbitmq:3.8.9

执行命令,创建RabbitMQ容器,分配300M内存。

docker run -it -d --name mq -m 300m --net=host -e TZ=Asia/Shanghai rabbitmq:3.8.9

六、在云主机上面开放端口

在云主机上面开放一些端口,这样外界才能远程管理MySQL、MongoDB,以及访问前后端项目等等。我们在云主机的安全组面板上面可以设置要开放的端口。

图片描述
因为Redis非常容易被注入挖矿脚本,所以Redis不对外提供访问,只能CentOS本机自己访问。当你的云主机一上线,就有很多国外的黑客主机开始做端口扫描,然后发送轮询请求,不停的组合碰撞你的SSH密码、MySQL密码、Redis密码等等。MySQL被攻破无非就是丢失很多商业数据,如果Redis被攻破,就被被注入挖矿病毒。你的云主机CPU会立即飙高到100%,其他程序则无法正常运行。

我用journalctl -xe命令查询到有黑客在恶意扫描的云主机,然后尝试登陆SSH。

图片描述
抵御撞库攻击正确的做法是维护云主机的时候,在安全组面板上开放相关的一些端口,维护完成后,立即关闭这些端口,只保留类似80、443、8080这样的业务端口,所有的数据库端口和SSH端口全部关闭。

序号 端口 来源 用途 临时开放
1 3306 0.0.0.0/0 MySQL端口
2 6379 0.0.0.0/0 Redis端口
3 27017 0.0.0.0/0 MongoDB端口
4 4369 0.0.0.0/0 RabbitMQ端口
5 5671 0.0.0.0/0 RabbitMQ端口
6 5672 0.0.0.0/0 RabbitMQ端口
7 8090 0.0.0.0/0 emos-api项目端口
8 9090 0.0.0.0/0 emos-workflow项目端口
9 80 0.0.0.0/0 emos-vue项目端口