Docker全家桶

一、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端口全部关闭。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GovG.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值