自学内容网 自学内容网

利用Docker一键发布Nginx-Tomcat-MySQL应用集群

Docker简介,可以看上一篇文章:

为什么互联网公司离不开Docker容器化,它到底解决了什么问题?-CSDN博客

 Docker体系结构

docker核心就是镜像和容器:

镜像就是应用程序的安装文件,包含了所有需要的资源,但是不能运行。

容器是最终运行的产物,每个容器都是可以独立运行的应用程序。

需要先在服务器上安装docker引擎,才可以进行使用,服务器上安装doker引擎后,会内置一个客户端。docker的执行过程为:客户端发送docker命令,docker引擎接收到命令后,会检查本地是否有镜像,没有的话就用远程仓库把镜像下载,然后创建容器,对外提供服务。

说明:本文章是学习docker的使用,所以是在Windows电脑上,安装了虚拟机,在虚拟机中安装CentOS7操作系统,在CentOS7中进行docker的部署;在实际的项目部署时,不需要虚拟机,而是直接在服务器上进行部署。

环境准备

安装虚拟机的步骤省略。

虚拟机安装后,在虚拟机中安装CentOS7,参考文章:

在VMware中安装和配置linux系统_vmware创建虚拟机-CSDN博客

CentOS7配置网络的教程(让CentOS7可以和物理机网络互通,同时可以访问互联网),参考文章:

VMware虚拟机环境下Centos7 静态IP的设置方法_虚拟机设置ip-CSDN博客

为了操作方便,使用Xsheel和Xftp进行命令操作和文件传输,这两个软件直接从官网下载即可,安装免费版本。下载地址:家庭/学校免费 - NetSarang Website

以上步骤全部操作完成,把虚拟机运行起来,找到安装的操作系统并开机,便可以用Xsheel直接访问CentOS7了。这是在物理机上使用Xsheel连接上CentOS7后的样子:

在CentOS7上安装docker

1.安装底层工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

这是安装Docker的底层工具,它就会自动提示下载,很快下载就完成了。

如果遇到报错的情况,可以参考这个文章进行解决:

安装docker 遇到异常Could not resolve host: mirrorlist.centos.org

2.加入阿里云yum仓库提速docker下载过程

sudo yum-config-manager --add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

增加阿里云的Docker下载仓库,默认情况下,Docker官方是从他的国外的服务器下载速度是非常慢的,所以在这里我们是使用yum config manager组件来指定一个新的下载源,指向的是阿里的应用服务器,通过阿里来提高我们Docker的下载速度。

3.更新一下仓库的源信息

sudo yum makecache fast

4.自动安装下载Docker

sudo yum -y install docker-ce

在这里它就会自动的下载解析,可以看到利用阿里云下载速度是非常快的,Docker便自动安装成功。

5.启动Docker服务

sudo service docker start

6.验证docker是否启动成功

docker version

至此docker安装成功,docker它的安装过程,因为操作系统可能有不同,但是命令每个平台都是一样的,docker version显示我们当前已安装的版本。

7.配置镜像加速器

因为docker需要从远程的仓库中下载镜像,速度比较慢,为了快速下载镜像文件,通过使用国内提供的仓库进行镜像的下载,操作步骤如下:

vi /etc/docker/daemon.json

删除原有的配置,替换为下面的配置:

{
"registry-mirrors": ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"]
}

保存并退出文件编辑。

重新启动docker

systemctl daemon-reload
systemctl restart docker

 到此为止,docker镜像加速器配置就完成了。

应用部署实战

部署一个Java编译后的jar包程序,并通过NGINX反向代理服务器,对应用进行访问:

要部署的应用架构如下:

app1、app2、app3代表3个应用,模拟分布式架构。NGINX负责请求转发,分别将用户请求转发给三个应用,三个应用连接MySQL数据库进行数据获取。

以上内容均放在一个虚拟网段中,给该网段起名:my-bridge。

1.创建虚拟网段

docker network create -d bridge my-bridge

2.构建MySQL 5.7 容器,并挂载到容器内部

把素材放到服务器/usr/local目录下

素材文件下载地址:

https://download.csdn.net/download/liangmengbk/90062212?spm=1001.2014.3001.5503

docker run \

-p 3306:3306 \

--network my-bridge \

--name db \

-v /usr/local/bsbdj/sql:/docker-entrypoint-initdb.d \

-v /usr/local/bsbdj/data:/var/lib/mysql \

-e MYSQL_ROOT_PASSWORD=root \

-d mysql:5.7

命令解读:

  • docker run ...mysql 5.7 代表创建并自动运行mysql 5.7 容器,如果宿主机没有mysql 5.7镜像,则自动会从dockerhub进行下载。
  • --name db是容器的名字。
  • -p 3306:3306 代表将容器内部MySQL5.7 映射到宿主机的3306端口,这样才可以从外界进行访问。
  • --network my-bridge 代表将db容器加入到my-bridge虚拟网段,这样才可以和其他容器通信。
  • -v /usr/local/bsbdj/sql ... 代表将宿主机的sql目录挂载到容器内的docker-entrypoint-initdb.d,根据dockerhub 的描述,放入docker-entrypoint-initdb.d目录下的SQL文件会在MySQL容器创建后自动执行,完成数据初始化任务。
  • -v /usr/local/bsbdj/data ...同样是挂载,因为容器很容易创建或迁移,如果将MySQL数据文件保存在容器内部,容器销毁数据就会丢失,因此同样使用-v命令将容器内产生的数据文件挂载到宿主机的data目录下,这样即使容器销毁数据也不会丢失。
  • -e MYSQL_ROOT_PASSWORD=root ,mysql容器要求的环境参数,说明创建容器时默认数据库root密码为root。
  • -d 代表采用后台模式运行,不加-d则采用前台独占方式运行。

注意:docker发现宿主机上没有MySQL容器,会自动下载。

安装的MySQL对应的架构图如下:

MySQL安装完成后,使用navicate工具进行访问:

数据库和表都已经创建完成,创建数据库和表用到的脚本就是/usr/local/bsbdj中sql目录中提前准备好的脚本:

3.构建应用镜像

在上传到/usr/local/bsbdj目录下资料中,有个dockerfile文件,这个文件是用来构建应用镜像的,也就是把自己的应用程序,构建为docker的镜像文件。

dockerfile文件内容:
FROM openjdk:11  表示引用openjdk11的镜像,在这个镜像基础上进行扩展,
ADD ./app /usr/local/bsbdj  将指定的宿主机文件,复制到容器内部。
WORKDIR /usr/local/bsbdj   在镜像内部切换工作目录
CMD ["java","-jar", "bsbdj.jar"]   执行 java -jar bsbdj.jar 命令

切换到dockerfile文件所在的路径下面:

cd /usr/local/bsbdj

执行创建镜像的命令:

docker build -t itlaoqi/bsbdj:1.0 .

该命令的作用是读取dockerfile文件,并在宿主机上生成镜像。

镜像的名称是自定义的,这里定义为 itlaoqi/bsbdj:1.0

最后面的点,代表当前目录。

镜像创建完成后,查看所有安装部署在宿主机上的镜像:

docker images

这个就是我们自己创建的镜像文件。

4.创建APP容器

docker run \

--name app1 \

--network my-bridge \

-p 8080:8080 \

-d itlaoqi/bsbdj:1.0

 docker run --name app2 \

--network my-bridge \

-p 8081:8080 \

-d itlaoqi/bsbdj:1.0

 

docker run \

--name app3 \

--network my-bridge \

-p 8082:8080 \

-d itlaoqi/bsbdj:1.0

上面的命令会创建3个应用容器,三个容器都是基于同一个镜像(itlaoqi/bsbdj:1.0)生成的,三个容器名称分别为app1、app2、app3

在浏览器中访问宿主机(CentOS操作系统的IP,我的IP为192.168.1.10),加上应用的端口,就可以访问应用系统了。

三个应用容器通过不同的端口,都可以正常访问。

需要注意的地方,jar包程序中数据库链接需要与数据库容器名称一致,应用才能访问到数据库。

这里的db就是MySQL容器的名称,代码中的名称要跟容器名称一致,才能访问数据库。

5.创建Nginx容器

创建反向代理服务器,配置负载均衡策略。

docker run --name nginx \
-v /usr/local/bsbdj/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network my-bridge \
-p 80:80 \
-d nginx

注意:docker发现宿主机上没有NGINX容器,会自动下载。

命令解读:

docker run --name nginx \  运行NGINX容器,如果没有则自动部署

-v /usr/local/bsbdj/nginx/nginx.conf:/etc/nginx/nginx.conf \  用宿主机上的文件替换NGINX容器中的配置文件

-p 80:80 \ 宿主机的80端口对应到NGINX容器的80端口。

/usr/local/bsbdj/nginx/nginx.conf文件是提前准备好的NGINX配置负载均衡策略的文件。

配置文件中核心部分是上图所示的位置,app1、app2、app3指应用容器的名称,后面的8080代表容器内提供服务的端口。这里一定要填写容器内服务的端口,不是宿主机的端口(8080/8081/8082)。

location / 代表对请求做转发,proxy_pass为转发的规则,bsbdj对应到upstream的名称。当前的配置默认采用轮询的方式,对请求均匀进行转发。

通过浏览器访问应用,验证NGINX是否部署成功,通过访问宿主机的IP(80端口可以省略),能够正常访问,就说明NGINX部署完成了。

6.实用脚本

查看网段内的容器信息

docker network inspect my-bridge

my-bridge是指虚拟网段名称。

在containers中看到容器,都是互联互通的。这些容器都是通过容器名称(Name)来互相访问的。

查看当前启动的容器

docker ps

删除上面已经安装的所有容器与镜像

docker rm -f nginx
docker rm -f app1
docker rm -f app2
docker rm -f app3
docker rm -f db
docker rmi -f itlaoqi/bsbdj:1.0
docker rmi -f mysql:5.7
docker rmi -f openjdk:11
docker network rm my-bridge

rm 指移除容器

-f 指强制操作

rmi 指删除镜像

network 虚拟网段

docker官网:https://hub.docker.com/

如果要在多台服务器上进行容器集群部署,需要使用另外的技术Kubernetes(K8s)。K8s被称为容器编排工具,作用是在docker的基础上进行大规模、多节点、多容器的统一管理和统筹。而且提供了响应的监控和管理界面。可以同时管理超过20万台服务器已经上百万个容器实例。


原文地址:https://blog.csdn.net/liangmengbk/article/details/144151616

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!