上节课我们安装好了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项目端口 | 否 |