目录
一、Docker介绍
(一)、Docker是什么?
Docker是轻量级的虚拟机产品,我们在使用Docker的时候,它并不会为每个虚拟化实例(容器)创建完整的虚拟硬件环境,而是为每个实例虚拟化少量的硬件环境(例如网卡)。这些虚拟化实例直接共享使用Linux系统的CPU、内存和硬盘资源。因此说,采用Docker的Linux主机,可以轻松创建几十个容器。运行在容器中的程序,除了有良好的隔离性之外,跟直接在Linux上运行没什么性能损失。
VMware这种重量级的虚拟机,无法做到这一点。VMware虚拟机创建每个实例,都要虚拟化完整的硬件环境,所以在Linux或者Windows系统上面根本无法创建多个这样的虚拟机实例。
(二)、为什么要使用Docker?
有很多人都不明白为什么要在云主机上安装Docker,把程序直接部署在Linux上不行吗?其实,使用Docker主要有两点原因:
首先,Docker容器之间是相互隔离的,我们可以在容器中部署程序的同时,不用担心跟其他容器产生冲突。例如某公司几年前开发的Java程序用的是JDK1.6,但是现在要部署的Java项目用JDK1.8开发的,现在我们无法在服务器上面同时安装JDK1.6和JDK1.8环境。如果我们用上了Docker程序,先创建出两个容器,然后分别安装JDK1.6和JDK1.8,接下来分别部署新旧程序。这就能做到在一个服务器上面可以部署若干程序的时候,不用担心发生矛盾冲突。其实你在阿里云和腾讯上面购买的云主机实例,就是这种虚拟化的容器。如果你想让容器之间可以通过网络访问,可以采用端口映射或者host模式,一会儿我会讲这个事情。
其次,Docker能为我们提供快速化部署。比如说有人在网上提供了PHP镜像,里面包括了PHP环境、Apache服务器和MySQL数据库,我们从网上下载镜像,然后创建容器,就直接可以部署PHP项目了,非常的方便。再比如,你自己也可以创建镜像,把要部署的程序和运行环境打成Docker镜像,分发给其他人,他们创建容器就可以直接运行程序了。
总结成一句话,Docker有毒,用上就会让人上瘾。
(三)、镜像和容器
Docker为了最大化的共享资源,减少资源浪费,创造出了镜像技术。镜像是虚拟实例之间相同的部分,差异化的部分叫做容器。比如说一个JDK镜像,里面安装了JDK1.8,然后我为这个镜像创建出3个容器,这三个容器共享使用JDK镜像中的Java环境,并且我可以在每个容器中部署不同的Java程序。如果Docker没有镜像技术,我们只能分别在三个容器中安装JDK环境,这就造成了不必要的重复浪费。
需要注意的是,容器只能读取镜像中的数据,不能修改镜像的内容,也就是说,镜像对于容器是只读的。
(四)、安装Docker环境
1、关闭SELINUX服务
SELINUX是CentOS自带的安全服务,因为晦涩难用,并且跟很多程序冲突,所以强烈建议大家关闭这个服务。
找到 /etc/sysconfig/selinux文件,把其中的 SELINUX设置为 disabled,保存文件之后重启CentOS系统。
2、更新yum程序
yum命令是CentOS自带的软件包管理器,我们安装Docker之前,最好能先更新一下yum命令,然后等上十分钟左右与,yum就更新好了。
yum update -y
3、安装Docker
执行下面的指令,稍等片刻,Docker程序就安装好了 。
yum install docker -y
4、管理Docker
启动和关闭Docker服务,可以通过下面的命令完成。每次启动Linux系统,别忘了要运行Docker服务,切记!
service docker start //启动
service docker stop //停止
service docker restart //重启
查看Docker中的镜像列表,可以执行下面的命令。
docker images
想要删除某个镜像可以用下面的命令。
docker rmi 镜像名字
5、配置加速器
因为Docker在线安装镜像是从国外的DockerHub网站下载文件,所以速度超级慢,所以我们要给Docker设置加速器。我们用的是腾讯云主机,当然设置腾讯云加速器是最快的。
打开 /etc/docker/daemon.json文件,然后设置成如下内容:
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
重新启动Docker服务,加速器才能生效。
service docker restart
二、Docker中安装程序
(一)、安装MySQL
在线安装MySQL镜像,这里我下载 8.0.23版本的MySQL数据库。
docker pull mysql:8.0.23
创建容器的时候,我们需要把MySQL容器内的数据目录映射到CentOS系统上面。如果MySQL容器挂掉了,数据库文件不会丢失。我们新建一个MySQL容器,挂载上这个数据目录就又能正常使用MySQL了。
这里我因为项目需要,我打算把容器设置成 host模式,就是不让Docker为容器虚拟网卡,Docker容器直接使用CentOS的网卡。A容器和B容器中使用的都是CentOS的网卡,所以A容器中localhost代表CentOS,B容器中的localhost也代表CentOS,两个容器相互访问,URL地址写localhost即可。例如B容器中JDBC路径的host写localhost,就能访问到A容器里面的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
(二)、安装MongoDB
执行命令,下载特定版本的MongoDB镜像。最新版本的MongoDB连接的时候登录认证兼容性不好,所以我们不必追求最新版本的MongoDB,我们只追求运行稳定,所以通用的老版本就很适合我们,这里用的是 4.4.7。
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内存,这里也采用了 host模式。
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,版本 6.0.10。
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镜像。
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
(五)、安装Nginx
首先下载安装Nginx镜像,这里我依然使用特定版本的镜像。
docker pull nginx:1.21.3
在root目录中,创建nginx文件夹。在该目录新建nginx.conf文件。并且创建html文件夹,新建index.html和50x.html文件。
nginx.conf:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
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;
}
index.html:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
50x.html:
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the error log for details.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>
执行下面的命令,创建Nginx容器,然后用浏览器访问云主机的80端口,可以看到Nginx的欢迎画面。
docker run -it -d --name nginx -m 200m --net=host \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /root/nginx/html:/usr/share/nginx/html:ro \
-e TZ=Asia/Shanghai \
nginx:1.21.3
接下来就可以将前端项目部署到nginx了,把项目文件上传到 /root/nginx/html目录中。打开浏览器,访问 http://云主机IP:80/项目文件名,如果能看到登陆页面,说明程序部署成功
(六)、安装Minio
执行命令,在线安装Minio镜像。
docker pull minio/minio
我们首先创建 /root/minio/data文件夹,然后给这个文件夹设置权限,否则Minio将无法使用该文件夹保存文件。
chmod -R 777 /root/minio/data/
接下来我们创建Minio容器,设定的访问帐户是root,密码为root123456,一会儿我们可以用浏览器访问Web管理画面。大家一定先做好端口映射,把Linux的9000和9001端口映射到Windows系统。使用云主机的同学,需要把这两个端口开放。
docker run -it -d --name minio \
-p 9000:9000 -p 9001:9001 \
-v /root/minio/data:/data \
-e TZ=Asia/Shanghai --privileged=true \
--env MINIO_ROOT_USER="root" \
--env MINIO_ROOT_PASSWORD="root123456" \
--env MINIO_SKIP_CLIENT="yes" \
minio/minio:latest
创建好容器之后,我们打开浏览器,访问http://localhost:9001/login,然后填写好登陆信息,就能进入Web管理画面。
在Web管理画面中,我们创建hospital存储桶,并且把存储桶的访问权限设定成 Public
(七)、安装node.js
执行命令,在线安装node镜像。
docker pull node:latest
在root目录中,创建nodejs文件夹。在该目录上传node.js的后端项目。
docker run -it -d --name nodejs --net==host \
-v /root/nodejs:/root/nodejs node
执行命令,创建nodejs容器。
docker run -it -d --name nodejs --net==host \
-v /root/nodejs:/root/nodejs node
进入nodejs容器。
docker exec -it nodejs bash
进入nodejs后端项目文件夹,安装node包。
cd /root/nodejs
npm install
启动nodejs服务。
node app.js
(八)、在云主机上面开放端口
在云主机上面开放一些端口,这样外界才能远程管理MySQL、MongoDB,以及访问前后端项目等等。我们在云主机的安全组面板上面可以设置要开放的端口。
因为Redis非常容易被注入挖矿脚本,所以Redis不对外提供访问,只能CentOS本机自己访问。当你的云主机一上线,就有很多国外的黑客主机开始做端口扫描,然后发送轮询请求,不停的组合碰撞你的SSH密码、MySQL密码、Redis密码等等。MySQL被攻破无非就是丢失很多商业数据,如果Redis被攻破,就被被注入挖矿病毒。你的云主机CPU会立即飙高到100%,其他程序则无法正常运行。
我用journalctl -xe命令查询到有黑客在恶意扫描的云主机,然后尝试登陆SSH。
抵御撞库攻击正确的做法是维护云主机的时候,在安全组面板上开放相关的一些端口,维护完成后,立即关闭这些端口,只保留类似80、443、8080这样的业务端口,所有的数据库端口和SSH端口全部关闭。