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

news2024/12/5 3:25:13

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python使用python-docx处理word

文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word(1)打开文档(2)添加标题(3)添加段落(4)添加文字块(5)添加图片(6&#xf…

echarts的双X轴,父级居中的相关配置

前言:折腾了一个星期,在最后一天中午,都快要放弃了,后来坚持下来,才有下面结果。 这个效果就相当是复合表头,第一行是子级,第二行是父级。 子级是奇数个时,父级label居中很简单&…

CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8&#xff0c;支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图&#xff0c;确保页面在不同设备上自适应显示 --&…

STM32 PWM波形详细图解

目录 前言 一 PWM介绍 1.1 PWM简介 1.2 STM32F103 PWM介绍 1.3 时钟周期与占空比 二.引脚映像关系 2.1引脚映像与寄存器 2.2 复用功能映像 三. PWM 配置步骤 3.1相关原理图 3.2配置流程 3.2.1 步骤一二&#xff1a; 3.2.2 步骤三&#xff1a; 3.2.3 步骤四五六七&#xff1a; …

6.824/6.5840 Lab 1: MapReduce

宁静的夏天 天空中繁星点点 心里头有些思念 思念着你的脸 ——宁夏 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 由于这个lab整体难度实在不小&#xff0c;故考虑再三还是决定留下代码仅供参考 6.824的强度早有耳闻&#xff0c;我终于也是到了挑战这座高…

东方隐侠网安瞭望台第8期

谷歌应用商店贷款应用中的 SpyLoan 恶意软件影响 800 万安卓用户 迈克菲实验室的新研究发现&#xff0c;谷歌应用商店中有十多个恶意安卓应用被下载量总计超过 800 万次&#xff0c;这些应用包含名为 SpyLoan 的恶意软件。安全研究员费尔南多・鲁伊斯上周发布的分析报告称&…

【python自动化一】pytest的基础使用

1.pytest简述 pytest‌ 是一个功能强大且灵活的Python测试框架&#xff0c;其主要是用于流程控制&#xff0c;具体用于UI还是接口自动化根据个人需要而定。且其具有丰富插件&#xff0c;使用时较为方便。咱们具体看下方的内容&#xff0c;本文按照使用场景展开&#xff0c;不完…

EasyDSS视频推拉流技术的应用与安防摄像机视频采集参数

安防摄像机的视频采集参数对于确保监控系统的有效性和图像质量至关重要。这些参数不仅影响视频的清晰度和流畅度&#xff0c;还直接影响存储和网络传输的需求。 安防摄像机图像效果的好坏&#xff0c;由DSP处理器和图像传感器sensor决定&#xff0c;如何利用好已有的硬件资源&…

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…

论文:IoU Loss for 2D/3D Object Detection

摘要&#xff1a;在2D/3D目标检测任务中&#xff0c;IoU (Intersection-over- Union)作为一种评价指标&#xff0c;被广泛用于评价不同探测器在测试阶段的性能。然而&#xff0c;在训练阶段&#xff0c;通常采用常见的距离损失(如L1或L2)作为损失函数&#xff0c;以最小化预测值…

CAD 文件 批量转为PDF或批量打印

CAD 文件 批量转为PDF或批量打印&#xff0c;还是比较稳定的 1.需要本地安装CAD软件 2.通过 Everything 搜索工具搜索&#xff0c;DWG To PDF.pc3 &#xff0c;获取到文件目录 &#xff0c;替换到代码中&#xff0c; originalValue ACADPref.PrinterConfigPath \ r"C:…

【错误记录】jupyter notebook打开后服务器错误Forbidden问题

如题&#xff0c;在Anaconda Prompt里输入jupyter notebook后可以打开浏览器&#xff0c;但打开具体项目后就会显示“服务器错误&#xff1a;Forbidden”&#xff0c;终端出现&#xff1a; tornado.web.HTTPError: HTTP 403: Forbidden 查看jupyter-server和jupyter notebook版…

[MacOS] [kubernetes] MacOS玩转虚拟化最佳实践

❓ 为什么不在MacOS本机安装呢&#xff1f;因为M系列芯片是Arm架构&#xff0c;与生产环境或者在本地调试时候&#xff0c;安装虚拟镜像和X86不同&#xff0c;造成不必要的切换环境的额外成本&#xff0c;所以在虚拟化的x86调试 步骤 & 详情 一: 安装OrbStack & 并配置…

网络编程相关 API 学习

目录 1. 网络编程中的基本概念 2. UDP 的 socket api 的使用 (1) DatagramSocket API (2) DatagramPacket API (3) InetSocketAddress API (4) 使用 UDP 的 socket api 3. TCP 的 socket api 的使用 (1) ServerSocket API (2) Socket API 1. 网络编程中的基本概念 客…

【Android】View工作原理

View 是Android在视觉上的呈现在界面上Android提供了一套GUI库&#xff0c;里面有很多控件&#xff0c;但是很多时候我们并不满足于系统提供的控件&#xff0c;因为这样就意味这应用界面的同类化比较严重。那么怎么才能做出与众不同的效果呢&#xff1f;答案是自定义View&#…

burp2

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

【阅读记录-章节5】Build a Large Language Model (From Scratch)

目录 5. Pretraining on unlabeled data5.1 Evaluating generative text models5.1.1 Evaluating generative text models5.1.2 Calculating the text generation loss评估模型生成文本的质量 5.1.3 Calculating the training and validation set losses 5.2 Training an LLM5.…

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…

DDD架构设计

今天的应用架构&#xff0c;意指软件系统中固定不变的代码结构、设计模式、规范和组件间的通信方式。在应用开发中架构之所以是最重要的第一步&#xff0c;因为一个好的架构能让系统安全、稳定、快速迭代。在一个团队内通过规定一个固定的架构设计&#xff0c;可以让团队内能力…

再来聊聊总线机制

背景 之前写过一篇《KafkaPostgreSql&#xff0c;构建一个总线服务》&#xff0c;近期在实践过程中又踩了一些坑&#xff0c;有了一些新的体验&#xff0c;拿出来再说道说道。 我们说EventBus 是一种设计模式和编程工具&#xff0c;它简化了应用程序组件之间的通信。通过使用…