当前位置: 首页 > news >正文

利用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万台服务器已经上百万个容器实例。

相关文章:

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

Docker简介,可以看上一篇文章: 为什么互联网公司离不开Docker容器化,它到底解决了什么问题?-CSDN博客 Docker体系结构 docker核心就是镜像和容器: 镜像就是应用程序的安装文件,包含了所有需要的资源&…...

关于数据库数据国际化方案

方案一:每个表设计一个翻译表 数据库国际化的应用场景用到的比较少,主要用于对数据库的具体数据进行翻译,在需要有大量数据翻译的场景下使用,举个例子来说,力扣题目的中英文切换。参考方案可见: https://b…...

【系统架构设计师】高分论文:论信息系统的安全与保密设计

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 摘要正文摘要 本人所在工作单位承担了我市城乡智慧建设工程综合管理平台项目的开发工作。我有幸参与了本项目,并担任架构师一职,全面负责项目的需求分析和系统设计等工作。城乡智慧建设工程综合管理平台项目包括…...

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载,已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd,键入rustc --version,出现 rust 版本号&…...

【docker】docker compose多容器部署

Docker Compose 的详细讲解与实际应用 什么是 Docker Compose? Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用。 通过一个 docker-compose.yml 文件,可以同时启动多个服务,简化多容器管理。 Docker Compose 的核心…...

JS +CSS @keyframes fadeInUp 来定义载入动画

JSCSS 更完美展现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>跳动加载指示器</title>&l…...

Seatunnel解决ftp读取json文件无法读取数组以及格式化之后的json无法解析的问题

问题原因 在JsonRead这个方法里面 在源码中使用的逻辑是读取一行 然后把这个json进行解析 但是这样存在一个问题 比如如果json的格式是这样的 { name&#xff1a;“zhangsan”&#xff0c; age&#xff1a;25 } 如果是这样的话 第一行读到的内容就是 { 显然 一个 { 并不是一个…...

Elasticsearch在liunx 中单机部署

下载配置 1、下载 官网下载地址 2、上传解压 tar -zxvf elasticsearch-XXX.tar.gz 3、新建组和用户 &#xff08;elasticsearch 默认不允许root账户&#xff09; #创建组 es groupadd es #新建用户 useradd ryzhang -g es 4、更改文件夹的用户权限 chown -R ryzhang …...

深入探索 HarmonyOS 的 Navigation 组件:灵活的页面管理与动态导航

在移动应用开发中&#xff0c;页面的跳转和导航一直是核心功能之一。对于 HarmonyOS 开发者来说&#xff0c;Navigation 组件提供了一个强大的工具来实现灵活的页面管理和导航体验。今天&#xff0c;我们将深入探讨如何使用 HarmonyOS 中的 Navigation 组件来管理页面跳转、工具…...

【CUDA】CUDA Hierarchy

【CUDA】CUDA 基本概念和 Hierarchy CUDA 编程基础&#xff1a;Host 和 Device 工作流程 首先简单介绍CUDA 编程的基本概念&#xff1a;讲解 Host&#xff08;CPU&#xff09;与 Device&#xff08;GPU&#xff09;的区别、内存管理以及 CUDA 运行时的工作机制。 Host&#x…...

28.100ASK_T113-PRO Linux+QT 显示一张照片

1.添加资源文件 2. 主要代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QImage> #include <QPixmap>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);QIm…...

GitLab使用中遇到的一些问题-记录

错误内容一 Warning: Permanently added gitlab.com (ED25519) to the list of known hosts. gitgitlab.com: Permission denied (publickey). Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. …...

【微服务】Docker

一、Docker基础 1、依赖的兼容问题&#xff1a;Docker允许开发中将应用、依赖、函数库、配置一起打包&#xff0c;形成可移植镜像Docker应用运行在容器中&#xff0c;使用沙箱机制&#xff0c;相互隔离。 2、如何解决开发、测试、生产环境有差异的问题&#xff1a;Docker镜像…...

【C#】书籍信息的添加、修改、查询、删除

文章目录 一、简介二、程序功能2.1 Book类属性&#xff1a;方法&#xff1a; 2.2 Program 类 三、方法&#xff1a;四、用户界面流程&#xff1a;五、程序代码六、运行效果 一、简介 简单的C#控制台应用程序&#xff0c;用于管理书籍信息。这个程序将允许用户添加、编辑、查看…...

Python 入门教程(2)搭建环境 | 2.4、VSCode配置Node.js运行环境

文章目录 一、VSCode配置Node.js运行环境1、软件安装2、安装Node.js插件3、配置VSCode4、创建并运行Node.js文件5、调试Node.js代码 一、VSCode配置Node.js运行环境 1、软件安装 安装下面的软件&#xff1a; 安装Node.js&#xff1a;Node.js官网 下载Node.js安装包。建议选择L…...

Spark常问面试题---项目总结

一、数据清洗&#xff0c;你都清洗什么&#xff1f;或者说 ETL 你是怎么做的&#xff1f; 我在这个项目主要清洗的式日志数据&#xff0c;日志数据传过来的json格式 去除掉无用的字段&#xff0c;过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…...

【AI系统】Auto-Tuning 原理

Auto-Tuning 原理 在硬件平台驱动算子运行需要使用各种优化方式来提高性能&#xff0c;然而传统的手工编写算子库面临各种窘境&#xff0c;衍生出了自动生成高性能算子的的方式&#xff0c;称为自动调优。在本文我们首先分析传统算子库面临的挑战&#xff0c;之后介绍基于 TVM…...

AMEYA360:上海永铭电子全新高压牛角型铝电解电容IDC3系列,助力AI服务器电源高效运转

随着数据中心和云计算的高速发展&#xff0c;AI服务器的能效要求日益提高。如何在有限空间内实现更高的功率密度和稳定的电源管理&#xff0c;成为AI服务器电源设计的一大挑战。永铭推出全新高压牛角型铝电解电容IDC3系列&#xff0c;以大容量、小尺寸的创新特性&#xff0c;为…...

echarts地图立体效果,echarts地图点击事件,echarts地图自定义自定义tooltip

一.地图立体效果 方法1:两层地图叠加 实现原理:geo数组中放入两个地图对象,通过修改zlevel属性以及top,left,right,bottom形成视觉差 配置项参考如下代码: geo: [{zlevel: 2,top: 96,map: map,itemStyle: {color: #091A51ee,opacity: 1,borderWidth: 2,borderColor: #16BAFA…...

什么是 Socket?

Socket&#xff08;套接字&#xff09;是计算机网络编程中的一个重要概念&#xff0c;它用于在不同计算机之间进行通信。Socket 提供了一种机制&#xff0c;使得应用程序可以通过网络发送和接收数据。Socket 通信通常基于 TCP/IP 协议&#xff0c;但也可以使用其他协议&#xf…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...