微服务技术栈-Docker应用部署

文章目录

  • 前言
  • 一、数据卷
  • 二、Docker 应用部署
    • 1、MySQL部署
    • 2、Tomcat部署
    • 3、Nginx部署
    • 4、Redis部署
    • 5、Kafka部署
  • 总结


前言

之前文章讲到过,docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器,接下来我们将介绍如何使用docker去部署Java web开发的常见服务。


一、数据卷

在之前的文章中我们介绍了容器之间使用沙箱机制,相互隔离。现在我们继续来思考几个Docker容器在使用过程中会出现的问题。

  • Docker 容器删除后,在容器中产生的数据还在吗?
  • Docker 容器和外部继器可以交换文件吗?
  • 容器之间想要进行数据交互?

在解决上面几个问题之前,我们先来介绍一下Docker数据卷的概念。

Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,需要通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来。如果没有docker commit,那么当容器删除后,数据自然也就没有了。为了避免反复生成新的镜像,且能将Docker容器的数据持久化的保存下来,我们引入了数据卷的概念。

数据卷:宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。

配置数据卷的方法:创建启动容器时,使用-v参数 设置数据卷。

docker run ... -v 宿主机目录(文件):容器内目录(文件) ...

二、Docker 应用部署

学习完数据卷的概念之后,我们使用Docker来进行应用部署。

1、MySQL部署

回忆一下以前我们是怎么安装mysql的:
1.去mysql官网下载我们需要的mysql压缩包。
2.上传mysql并解压。
3.按照依赖关系依次安装rpm包
4.接着执行后面一系列的mysql初始化命令。

我们可以看出利用原始方法安装MySQL非常繁琐,且执行的命令太多很容易出错。

在Docker 容器中部署MySQL,并通过外部MySQL 客户端操作MySQL Server。要想在Docker容器中部署MySQL,我们只需要执行以下四步:

1.搜索mysql镜像
2.拉取mysql镜像
3.创建容器
4.操作容器中的mysql

在使用Docker部署MySQL的时候,还会存在一个问题:容器内的网络服务和外部机器不能直接通信。

解决方案:因为外部机器和宿主机可以直接通信且宿主机和容器可以直接通信,所以当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的端口,从而间接访问容器的服务,这种操作称为端口映射。

1.搜索mysql镜像

docker search mysql

2.拉取mysql镜像

docker pull mysql:8.0

在这里插入图片描述
3.创建容器,设置端口映射、目录映射。

# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
docker run -d \
-p 3306:3306 \
-e MYSQL_ROOT_HOST=% \
-e MYSQL_ROOT_PASSWORD=123456789 \
-v $PWD/conf:/etc/mysql/conf.d
-v $PWD/logs:/logs
-v $PWD/data:/var/lib/mysql
--name c_mysql \
mysql:8.0

参数说明

  • -p 3306:3306:将容器的3306端口映射到宿主机的3306端口。
  • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的conf/my.cnf挂载到容器/etc/mysql/my.cnf配置目录。
  • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs目录日志。
  • -v $PWD/data:/var/lib/mysql:将主机当前目录下的data目录挂载到容器的/var/lib/mysql数据目录。
  • -e MYSQL_ROOT_PASSWORD=123456:初始化root 用户密码。
    在这里插入图片描述
    4.进入MySQL的容器,可以看到MySQL的欢迎提示。
    在这里插入图片描述

2、Tomcat部署

部署tomcat的方式跟mysql大差不差,也是搜索镜像、拉取镜像、创建容器。
1.搜索Tomcat 镜像。

docker search tomcat

2.拉取tomcat镜像。

docker pull tomcat

3.创建容器,设置端口映射、目录映射。

创建容器,设置端口映射、目录映射
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat

参数说明:
- -p 8080:8080:将容器的8080端口映射到主机的8080端口
- -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps

3、Nginx部署

1.搜索Nginx镜像

docker search nginx

2.拉取Nginx镜像

docker pull nginx

3.创建容器,设置端口映射、目录映射

#在/root目录下创建nginx目录用于存储nginx数据信息
mkdir -p ~/nginx/conf
mkdir -p ~/nginx/log
mkdir -p ~/nginx/html# 生成容器
docker run --name nginx -p 9001:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf ~/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d ~/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html ~/nginx/# 删除正在运行的nginx容器
docker rm -f nginx#Docker 创建Nginx容器
docker run \
-p 9002:80 \
--name c_nginx \
-v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v ~/nginx/conf/conf.d:/etc/nginx/conf.d \
-v ~/nginx/log:/var/log/nginx \
-v ~/nginx/html:/usr/share/nginx/html \
-d nginx:lates

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、Redis部署

1.搜索Redis镜像

docker search redis

2.拉取Redis镜像

docker pull redis:6.0.8

3.创建容器,设置端口映射、目录映射

docker run -id --name=c_redis -p 6379:6379 redis:6.0.8 --requirepass "100"

5、Kafka部署

1.拉取zookeeper镜像

docker pull wurstmeister/zookeeper

2.拉取kafka镜像

docker pull wurstmeister/kafka

3.运行zookeeper镜像

docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper

4.运行kafka镜像

docker run -d --name kafka -p 9092:9092 --link zookeeper -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_ADVERTISED_HOST_NAME=localhost -e KAFKA_ADVERTISED_PORT=9092  wurstmeister/kafka

5.进入kafka镜像

docker exec -it 镜像名 /bin/bash

6.测试kafka工作情况

#先进入 kafka的bin 目录。
cd /opt/kafka_2.12-2.5.0(这里看自己的目录版本号)/bin/
#自己创建topic
kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic mytopic

7.修改kafka配置文件(要在宿主机里面改然后cp到容器中,因为在容器中改容器一启动就会失效)

#拷贝到宿主机
docker cp b8c5206770d1:/opt/kafka_2.13-2.8.1/config/server.properties  ~/server.properties
#修改的配置文件内容:
在kafka的应用下/config/server.properties下找到listeners=PLANTEXT://9092,去掉井号,并且将服务器ip或者域名加入到PLANTEXT:的后面,其中PLANTEXT是kafka默认使用的通信协议。在这个文件中,还有一个advertised.listeners的配置,这个主要用来配置公网ip
#从宿主机拷贝到容器中
docker cp ~/server.properties b8c5206770d1:/opt/kafka_2.13-2.8.1/config/server.properties
#重启容器
docker restart kafka

总结

在本章中我们介绍了数据卷这个概念,数据卷解决了docker容器在运行过程中的数据持久化问题。然后我们利用Docker来部署了与Java Web开发联系非常紧密的几个服务,可以看出使用了docker之后我们的部署变得十分方便且管理起来非常清晰,在后续的文章中将介绍更多有关docker部署服务的知识。


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

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

相关文章

数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

vue 使用 创建二维数组响应数据 渲染 echarts图标

目前我遇到的情况就是用动态的二维数组数据渲染echarts图标,我们从后端收到的接口一般是个一维数组,需要手动构建并且保证响应式。接下来我做了个案例 一、案例总逻辑 1. 先创建一个vue项目 2. 添加 echarts依赖 3. 模拟数据请求,构建二维数组…

DevicData-D-XXXXXXXX勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

引言: 在数字时代,数据安全成为一项至关重要的挑战。DevicData-D-XXXXXXXX勒索病毒(以下简称DevicData病毒)是这场战斗中的新敌人,它能够以毁灭性的方式加密您的数据,迫使您在数据和时间之间做出艰难的选择…

59. 螺旋矩阵 II

题目描述 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入:n …

AcWing 288. 休息时间,《算法竞赛进阶指南》,环形与后效性处理

288. 休息时间 - AcWing题库 在某个星球上,一天由 N 个小时构成,我们称 0 点到 1 点为第 1 个小时、1 点到 2 点为第 2 个小时,以此类推。 在第 i 个小时睡觉能够恢复 Ui 点体力。 在这个星球上住着一头牛,它每天要休息 B 个小…

基于SpringBoot的房屋租赁管理系统的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 屋主管理 房屋信息管理 房屋租赁公告 租用订单管理 房屋信息管理 保洁管理 房屋信息 租用订单管理 取消订单管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 互联网发展至今,无论是其理论还是…

【面试题精讲】如果一个类没有声明构造方法,该程序能正确执行吗?

“ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是构造方法? 构造方法(Constructor)是一种特殊的方法&#x…

Centos 服务器 MySQL 8.0 快速开启远程访问

环境: MySQL 8.0(低版本会有些不同), Rocky Linux 9.0(CentOS) 直接上干货,相信大家看到这个文章的时候都已经安装完了。 1. 先从服务器上使用 root 进行登录(刚安装完默认只能本地…

java Spring Boot在配置文件中关闭热部署

之前更大家一起搭建了一个热部署的开发环境 但是 大家要清楚一个情况 我们线上程序运行突然内部发生变化这是不可能的。 所以 他就只会对我们开发环境有效 是否开启 我们可以通过 application配置文件来完成 我这里是yml格式的 参考代码如下 spring:devtools:restart:enabled…

OpenWrt使用Privoxy插件修改UA

OpenWrt使用privoxy修改UA 1.安装privoxy插件 SSH连接到路由器 更新插件列表 update opkg安装插件 opkg install privoxy luci-app-privoxy luci-i18n-privoxy-zh-cn重启路由器 2.配置privoxy 打开配置页面 文件和目录 访问和控制 转发 杂项 日志 编辑配置 浏览器打开 …

代码随想录算法训练营第五十八天 | 动态规划 part 16 | 583. 两个字符串的删除操作、72. 编辑距离

目录 583. 两个字符串的删除操作思路思路2代码 72. 编辑距离思路代码 583. 两个字符串的删除操作 Leetcode 思路 dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。递推公…

云原生Kubernetes:简化K8S应用部署工具Helm

目录 一、理论 1.HELM 2.部署HELM2 3.部署HELM3 二、实验 1.部署 HELM2 2.部署HELM3 三、问题 1.api版本过期 2.helm初始化报错 3.pod状态为ImagePullBackOff 4.helm 命令显示 no repositories to show 的错误 5.Helm安装报错 6.git命令报错 7.CentOS 7 下git c…

volatile关键字使用总结

先说结论 1. volatile关键字可以让编译器层面减少优化,每次使用时必须从内存中取数据,而不是从cpu缓存或寄存器中获取 2. volatile关键字不能完全禁止指令重排,准确地说是两个volatile修饰的变量之间的命令不会进行指令重排 3. 使用volati…

模板方法模式,基于继承实现的简单的设计模式(设计模式与开发实践 P11)

文章目录 实现举例应用钩子 Hook 模板方法模式是一种基于继承的设计模式,由两部分构成: 抽象父类(一般封装了子类的算法框架)具体的实现子类 实现 简单地通过继承就可以实现 举例 足球赛 和 篮球赛 都有 3 个步骤&#xff0c…

常用Redis界面化软件

对于Redis的操作,前期有过介绍【Centos 下安装 Redis 及命令行操作】。而在Redis的日常开发调试中,可使用可视化软件方便进行操作。 本篇主要介绍Redis可视化的两款工具:Redis Desktop Manager和AnotherRedisDesktopManager。 1、Redis Desk…

C# 图解教程 第5版 —— 第1章 C# 和 .NET 框架

文章目录 1.1 在 .NET 之前1.2 .NET 时代1.2.1 .NET 框架的组成1.2.2 大大改进的编程环境 1.3 编译成 CIL1.4 编译成本机代码并执行1.5 CLR1.6 CLI1.7 各种缩写1.8 C# 的演化1.9 C# 和 Windows 的演化(*) 1.1 在 .NET 之前 MFC(Microsoft Fou…

组合模式,宏指令和普通指令的聚合应用(设计模式与开发实践 P10)

文章目录 定义举例抽象类文件系统常用 程序设计中有一些 事物是由相似的子事物 构成的例子 定义 回顾过去的命令模式,有一些命令里面包含了一个序列的操作,如果你玩魔兽世界或者类似的 MMO 游戏,里面你会用到 宏指令,就是一个指…

[python 刷题] 4 Median of Two Sorted Arrays

[python 刷题] 4 Median of Two Sorted Arrays 题目: Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays. The overall run time complexity should be O ( l o g ( m n ) ) O(log (mn)) O(lo…

设计模式探索:从理论到实践的编码示例 (软件设计师笔记)

😀前言 设计模式,作为软件工程领域的核心概念之一,向我们展示了开发过程中面对的典型问题的经典解决方案。这些模式不仅帮助开发者创建更加结构化、模块化和可维护的代码,而且也促进了代码的复用性。通过这篇文章,我们…

Linux目录权限的亿点点细节

在linux系统中用户对于目录的rwx权限意味着什么? 文章目录 rwx r 可以显示目录的内容,比如ls w 可以创建或删除文件,比如touch, rm x 可以进入到目录内,比如cd