尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 尼恩提供了一系列文章,旨在帮助开发者轻松搭建一键开发环境,涵盖Java分布式、高并发场景下的多种技术组件安装与配置。内容包括但不限于Windows和CentOS虚拟机的安装与排坑指南、MySQL、Kafka、Redis、Zookeeper等关键组件在Linux环境下的部署教程,并附带详细的视频指导。此外,还特别介绍了Vagrant这一虚拟环境部署工具,

尼恩说在前面

为了帮助大家打造一个一键开发环境,尼恩准备了一些列文章

尼恩Java 分布式 高并发 开发环境搭建 链接地址
windows centos 虚拟机 安装&排坑 vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解))
centos mysql 安装&排坑 centos mysql 笔记(内含vagrant mysql 镜像)
linux kafka安装&排坑 kafka springboot (或 springcloud ) 整合
Linux openresty 安装 Linux openresty 安装
【必须】Linux Redis 安装(带视频) Linux Redis 安装(带视频)
redis集群架构知识(史上最强,面试必看)
【必须】Linux Zookeeper 安装(带视频) Linux Zookeeper 安装, 带视频
ZooKeeper 客户端: GUI+命令行(史上最全)
Windows Redis 安装(带视频) Windows Redis 安装(带视频)
RabbitMQ 离线安装(带视频) RabbitMQ 离线安装(带视频)
RocketMQ 原理 - 部署 - 入门 RocketMQ 原理 - 部署 - 入门 (图解)
ElasticSearch 安装, 带视频 ElasticSearch 安装, 带视频
Nacos 安装(带视频) Nacos 安装(带视频)
【必须】Eureka Eureka 入门,带视频
【必须】springcloud Config 入门,带视频 springcloud Config 入门,带视频
【必须】SpringCloud 脚手架打包与启动 SpringCloud脚手架打包与启动
Linux 自启动 假死自启动 定时自启 Linux 自启动 假死启动

1 什么是vagrant

必先利其器,开发环境 和 开发工具 就是 我们开发人员的剑,所以我们需要一个快并且好用的剑

Vagrant是一个比较流行的虚拟机管理软件,使用Vagrant 可以让我们用命令直接从云上下载虚拟机的镜像,然后进行创建和管理等。

刚开始做开发的时候的都是把开发环境 配置在 自己的电脑上,随着后面我们接触的东西越来越多,慢慢的电脑上都是各种环境了,php,java,python,nodejs等等,非常麻烦,并且经常由于某种原因就把电脑重装了,ORZ,所以环境都要重来。所以打造一个属于自己并且可以移动的环境是非常重要的。

vagrant就是一款构建虚拟开发环境的工具,支持window,linux,mac,总有一款适合你。并且vagrant 可以把配置好的环境打包成一个box,分享给其他人直接使用,非常方便

vagrant 是一个很适合开发者的虚拟环境部署工具,本身集成了主流的虚拟器管理工具,支持 vmvare 和 virtualbox。

vagrant 的精髓在一个 Vagrantfile 里面,和 docker 的 Dockerfile 功能上一样。我们只需要把需要安装部署的步骤写在 Vagrantfile 里面,便可以实现轻松部署。vagrant 还支持把当前系统做成一个.box 后缀命名的镜像,类似 docker 的 image,可轻松实现环境的移植。

所以,使用vagrant可以在运行着多台vm的系统上定义复杂的虚拟框架。可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。是不是很酷?

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

VirtualBox 、vagrant、GitBash三剑客之间的关系

1.png

2 准备工作:

安装VirtualBox 、vagrant、GitBash

下载安装 VirtualBox ,下载安装 Vagrant ,下载更多不同系统甚至是已经配置好环境直接可以用的box,虽然可以直接在Vagrant直接使用网址,由Vagrant自动下载安装,但是考虑到网络情况,还是建议自行先下载好。

还可以在 http://www.vagrantbox.es/ 这里下载更多不同系统甚至是已经配置好环境直接可以用的box,虽然可以直接在Vagrant直接使用网址,由Vagrant自动下载安装,但是考虑到网络情况,还是建议自行先下载好。

可以从网盘下载

2.png

virtualbox 安装

VirtualBox 是一个免费开源的虚拟机,相对 VMware 来说更加小巧,个人比较喜欢。

虽然 Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的。

疯狂创客圈 百度网盘,也统一提供了下载

vagrant 安装

Vagant 网站下载最新的版本,根据自己的操作系统选择对应的版本下载即可。

疯狂创客圈 百度网盘,也统一提供了下载

注意,Vagrant 是没有图形界面的,所以安装完成后也没有桌面快捷方式。具体使用方法,接下来会详细说明。

GitBash

GitBash是windows下的Unix shell,方便向Vagrant输入指令。

https://git-scm.com/download/win

一般的java开发,都会使用git进行代码同步,所以此工具默认是已经安装了的

空间:

15G 的硬盘空间

下载需要的 box(镜像)

基础box

此外,还得下载官方封装好的基础镜像:
Ubuntu precise 32 VirtualBox http://files.vagrantup.com/precise32.box
Ubuntu precise 64 VirtualBox http://files.vagrantup.com/precise64.box

如果你要其他系统的镜像,可以来这里下载:http://www.vagrantbox.es/

网友提供的centos 7.2网盘地址:https://pan.baidu.com/s/15S2OZq37FcL9RWWSTWntIw   提取码:3xb0
AI 代码解读

尼恩提示:可以不用下载 centos 基础镜像,直接用尼恩的镜像。

下载预装了很多组件的 springcloud.box 镜像,

疯狂创客圈网盘,尼恩 为大家准备了springcloud.box镜像,里边预装了java 、 redis 、zookeeper、kafka、Eureka、springcloud config 等必须的组件。

网盘地址请参见【博客园总入口

3.png

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

3 使用vagrant导入Java开发环境

第一步,新建目录

E:\virtual\work
AI 代码解读

选择新建立的文件夹作,右键 —> Git Bash Here,在Git Bash打开当前目录

在 Git Bash 中可以看到,当前的linux 格式目录,执行指令如下:

$ pwd
/e/virtual/work

第二步,添加镜像到 vagrant

使用下面的命令添加镜像

vagrant box add  springcloud-dev   /e/virtual/workcluster/springcloud-dev-10.box
AI 代码解读

$ vagrant box add centos /e/virtual/workcluster/springcloud-dev-10.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'springcloud-dev ' (v0) for provider:
box: Unpacking necessary files from: file:///E:/virtual/workcluster/springcloud-dev-10.box
box:
==> box: Successfully added box 'springcloud-dev ' (v0) for 'virtualbox'!

参数说明:


参数:springcloud-dev           表示指定名称,如果名称使用base,之后可以直接使用 
参数: /springcloud-dev-10.boxbox镜像文件的文件名,这里是本地保存box的路径。也可以是可以下载box的网址,如果是网址的话,Vagrant会自动启动下载。   镜像文件,找尼恩获取哈。
AI 代码解读

添加之后,使用下面的命令,查看添加好了的镜像

查看镜像

$ vagrant box list
centos (virtualbox, 0)
springcloud-dev (virtualbox, 0)

删除镜像

vagrant add remove 删除 box,自动帮你生成vagrantfile

vagrant box remove springcloud-dev
AI 代码解读

第三步,初始化虚拟机

设置好box之后,在当前工作目录运行

$ vagrant init springcloud-dev
AI 代码解读

centos为初始化的时候需要指定box的名称。执行的结果如下:

$ vagrant init centos
A Vagrantfile has been placed in this directory. You are now
ready to vagrant up your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
vagrantup.com for more information on using Vagrant.

你也可以使用已有的目录,切换到开发目录里,用 centos 镜像初始化当前目录。

初始化镜像之后,在当前目录生成一个虚拟机的配置文件 Vagrantfile,通过该配置文件,可以配置端口映射、虚拟机的IP、目录映射等。

通过文本编辑器打开Vagrantfile可以进行一些进一步的常用配置,如果配置登录用户名称和密码,虚拟机的ip如下:

config.ssh.username = "root"
config.ssh.password = "vagrant"

config.vm.network :private_network, ip: "192.168.68.128"
AI 代码解读

重启虚拟机,这样我们就能用 192.168.233.128 访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行。

下面是尼恩的配置文件,有三个节点的虚拟机集群,的完整配置,供大家参考,或者直接使用,具体如下:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  (1..3).each do |i|
    config.vm.define vm_name = "cdh#{i}"  do |config|
        config.vm.provider "virtualbox" do |v|
         #       v.customize ["modifyvm", :id, "--name", vm_name, "--memory", "4096",'--cpus', 1]
            v.customize ["modifyvm", :id, "--name", vm_name]
                                        #        v.customize ["modifyvm", :id, "--memory", "4096"]
                                            v.customize ["modifyvm", :id, "--memory", "8192"]
            v.customize ["modifyvm", :id, "--cpus", "2"]
        end
        config.vm.box = "springcloud-dev"
        config.vm.hostname =vm_name
        config.ssh.username = "root"
        config.ssh.password = "vagrant"
                            #        config.ssh.shell = "powershell"
                            #config.ssh.shell = "bash -l"
        config.vm.network :private_network, ip: "192.168.56.12#{i}"
                                config.vm.provision :shell, :path => "bootstrap.sh"
    end
  end
end
AI 代码解读

第四步,启动虚拟机

使用如下命令:


 # 启动全部虚拟机节点 , 一共启动 3个节点
$ vagrant up  

# 或者,指定名字,启动部分虚拟机节点 , 启动 cdh1 节点
$ vagrant up  cdh1  # 启动名字为cdh1的虚拟机节点
AI 代码解读

你会看到终端显示了启动过程,启动完成后,我们就可以用 SSH 登录虚拟机了,剩下的步骤就是在虚拟机里配置你要运行的各种环境和参数了。

vagrant ssh # SSH 登录 cd /vagrant # 切换到开发目录,也就是宿主机上的 E:\virtual\work

Windows 用户注意:Windows 终端并不支持 ssh,所以需要安装第三方 SSH 客户端,比如:Putty、Cygwin 、Git Bash等。

有关初始账户和密码:

账户 密码
vagrant vagrant
root vagrant

可以使用其他的终端工具,通过root访问虚拟机了

启动过程中的错误

1 适配器创建失败 : Failed to create the host-only adapter

VBoxManage.exe: error: Failed to create the host-only adapter
VBoxManage.exe: error: Assertion failed: [!aInterfaceName.isEmpty()] at 'F:\tinderbox\win-5.1\src\VBox\Main\src-server\HostNetworkInterfaceImpl.cpp' (74) in long __cdecl HostNetworkInterface::init(class com::Bstr,class com::Bstr,class com::Guid,enum __MIDL___MIDL_itf_VirtualBox_0000_0000_0038).
VBoxManage.exe: error: Please contact the product vendor!
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage.exe: error: Context: "enum RTEXITCODE __cdecl handleCreate(struct HandlerArg *)" at line 94 of file VBoxManageHostonly.cpp
AI 代码解读

网上的大部分的解决方案为:


在virtualbox 管理 - > 全局设定 -> 网络 - > tab 仅主机网络 - > 添加
正常情况下是可以添加成功的,但是有可能报
Could not find Host Interface Networking driver!Please reinstall(找不到主机接口网络驱动程序!请重新安装)

如果第一步报错,这是因为之前卸载虚拟网卡的时候把驱动也给删除了。
可以在安装virtualbox目录…/Oracle VM VirtualBox中的 drivers\ network\ netadp6目录下有三个文件
VBoxNetAdp6.cat
VBoxNetAdp6.inf
VBoxNetAdp6.sys
这就是virtualbox虚拟网卡的驱动,右击VBoxNetAdp6.inf,右键点安装即可。
然后再做第二步。应该可以完成了。
AI 代码解读

4 打包分发

如果要备份自己虚拟机镜像box文件,可以进行 打包。

后面可以把这个box文件,分发给其他人。

打包之前,退出并关闭虚拟机。

在终端里对开发环境进行打包:

$ vagrant package
AI 代码解读

打包完成后会在当前目录生成一个 package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。

执行的过程如下:


$ vagrant halt
==> default: Attempting graceful shutdown of VM...
==> default: Forcing shutdown of VM...


$ vagrant package --output  springcloud-dev.box
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: E:/virtual/work/springcloud-dev

$ vagrant box list
centos (virtualbox, 0)
AI 代码解读

命令的具体说明:

vagrant package -hUsage: vagrant package [options] [name]

Options:
--base NAME virtualbox程序里面的虚拟机的名称,不是box的名字也不是Vagrantfile里面的虚拟机名称.默认是打包当前目录下面的虚拟机。
--output NAME 要打包成的box名称,不会自动添加.box后缀,要手动加.默认值package.box

--include FILE... 打包时包含的文件名,你可以把.box文件理解为一个压缩包
--vagrantfile FILE 打包时包含的Vagrantfile文件,原理和上面类似
-h, --help Print this help
例子:vagrant package –base virtualbox_vm_name –output newbox_name.box

5 通过Vagrantfile进行虚拟机配置:

网络配置:

Vagrant的网络有三种模式

1、较为常用是端口映射,就是将虚拟机中的端口映射到宿主机对应的端口直接使用 ,在Vagrantfile中配置:

config.vm.network :forwarded_port, guest: 80, host: 8080
AI 代码解读

guest: 80 表示虚拟机中的80端口, host: 8080 表示映射到宿主机的8080端口。

2、如果需要自己自由的访问虚拟机,但是别人不需要访问虚拟机,可以使用private_network,并为虚拟机设置IP ,在Vagrantfile中配置:

 config.vm.network :private_network, ip: "192.168.1.104"
AI 代码解读

192.168.1.104 表示虚拟机的IP,多台虚拟机的话需要互相访问的话,设置在相同网段即可

3、如果需要将虚拟机作为当前局域网中的一台计算机,由局域网进行DHCP,那么在Vagrantfile中配置:

config.vm.network :public_network
AI 代码解读

目录映射:

默认的,vagrant将共享你的工作目录(即Vagrantfile所在的目录)到虚拟机中的/vagrant,所以一般不需配置即可,如你需要可配置:

Vagrant.configure("2") do |config|


  config.vm.synced_folder "src/", "/srv/website"
end
AI 代码解读

"src/":物理机目录;"/srv/website"虚拟机目录

目录映射(文件夹)详细说明如下:

既然是开发环境,那么开发工作肯定还是需要在本地完成,而不是都要进到虚拟机中去完成,虚拟机就好好在后台运行服务就好了,不然就本末倒置了,所以这里就需要使用目录映射功能,将本地的目录映射到虚拟机的对应目录。

默认情况下,当前的工作目录,会被映射到虚拟机的 /vagrant 目录,当前目录下的文件可以直接在 /vagrant 下进行访问,当然也可以在通过 ln 创建软连接,如

ln -fs /vagrant/wwwroot /var/www
AI 代码解读

来进行目录映射,当然,从自动化配置的角度,能不进系统就不需要进系统,所以在Vagrant也可以进行目录映射的操作:

config.vm.synced_folder "wwwroot/", "/var/www"
AI 代码解读

前面的参数 “wwwroot/” 表示的是本地的路径,这里使用对于工作目录的相对路径,这里也可以使用绝对路径,比如: “d:/www/”

后面的参数 “/var/www” 表示虚拟机中对应映射的目录。

当在启动Vagrant后,对于虚拟机有进行过安装环境相关的配置,如果并不希望写在Vagrant的启动shell里面每次都重新安装配置一遍,可以将当前配置好的虚拟机打包成box,

注:如果网络模式中使用 private_network 的话,在打包之前需要清除一下private_network的设置,避免不必要的错误:

sudo rm -f /etc/udev/rule.d/70-persistent-net.rules
AI 代码解读

制作完成之后直接将box文件拿到其他计算机上配置即可使用。

更多信息可以参考官方文档:http://docs.vagrantup.com/v2/
AI 代码解读

启动的时自运行需要的shell命令或脚本

内部脚本:

Vagrant::Config.run do |config|
  config.vm.provision :shell, :inline => "echo abc > /tmp/test"
end
AI 代码解读

外部脚本:



Vagrant.configure("2") do |config|
  config.vm.provision :shell, :path => "script.sh"   #脚本的路径相对于项目根,也可使用绝对路径
end
AI 代码解读

附:简单的vagrantfile文件

Vagrant.configure(2) do |config|
    config.ssh.username = "root"
    config.ssh.password = "vagrant"
    config.vm.box = "centos"
    config.vm.network "private_network", ip: "192.168.68.128"

   config.vm.synced_folder "/home/wangkongming/files/works/code/kfz-pm", "/data/webroot/pmv2"

end
AI 代码解读

6 vagrant 常用命令

官网文档:https://docs.vagrantup.com/v2/getting-started/index.html

vagrant init 初始化vagrantfile

vagrant add remove 删除 box,自动帮你生成vagrantfile

vagrant box remove springcloud-dev
AI 代码解读

vagrant add box 添加 box,自动帮你生成vagrantfile

vagrant box add  springcloud-dev   /e/virtual/workcluster/springcloud-dev-3.box
AI 代码解读

vagrant halt 关闭虚拟机

vagrant destroy 销毁虚拟机

vagrant ssh 连接虚拟机

vagrant reload 修改vagarntfile文件后,重启虚拟机,重新加载

vagrant suspend 暂时挂起虚拟机

vagrant status 查看虚拟机运行状态

vagrant package 打包 box文件

vagrant package --base cdh1 --output  springcloud-dev-4.box
AI 代码解读

vagrant box list 首先查看已经添加的box:

$ vagrant box list
centos (virtualbox, 0)
AI 代码解读

vagrant destroy 销毁当前虚拟机,不需要的虚拟机最好销毁,释放存储空间

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

7 虚拟机集群

建立虚拟机目录

先建立一个目录: /e/virtual/workcluster,通过 Git Bash进入 /e/virtual/workcluster,然后

添加镜像到 Vagrant

把下载的镜像springcloud-dev.box放入目录,添加镜像到 Vagrant

vagrant box add  springcloud-dev  springcloud-dev.box
AI 代码解读

springcloud-dev 表示指定名称,如果使用base,之后可以直接使用

初始化镜像

$ vagrant init springcloud-dev

输出以下日志:

A Vagrantfile has been placed in this directory. You are now
ready to vagrant up your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
vagrantup.com for more information on using Vagrant.
在当前目录生成了 Vagrantfile 文件。

修改Vagrantfile

修改文件以下:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  (1..3).each do |i|
    config.vm.define vm_name = "cdh#{i}"  do |config|
        config.vm.provider "virtualbox" do |v|
            v.customize ["modifyvm", :id, "--name", vm_name, "--memory", "2048",'--cpus', 1]
        end
        config.vm.box = "springcloud-dev"
        config.vm.hostname =vm_name
        config.ssh.username = "root"
        config.ssh.password = "vagrant"
        config.vm.network :private_network, ip: "192.168.56.12#{i}"
                                config.vm.provision :shell, :path => "bootstrap.sh"
    end
  end
end
AI 代码解读

上面的文件中定义了三个虚拟机,三个虚拟机的名字和 hostname 分别为cdh一、cdh二、cdh3,网络使用的是 host-only 网络。

在启动成功以后,会运行 bootstrap.sh 脚本,你能够编写你本身的脚本。

bootstrap.sh 脚本

#!/usr/bin/env bash

# The output of all these installation steps is noisy. With this utility
# the progress report is nice and concise.

echo "Update /etc/hosts"
cat > /etc/hosts <<EOF
127.0.0.1       localhost

192.168.56.121 cdh1
192.168.56.122 cdh2
192.168.56.123 cdh3
EOF

echo "Disable iptables"
setenforce 0 >/dev/null 2>&1 && iptables -F

### Set env ###
echo "export LC_ALL=en_US.UTF-8"  >>  /etc/profile
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
AI 代码解读
  • 设置hosts文件
  • 关掉防火墙
  • 设置虚拟机时区

启动集群

$ vagrant init springcloud-dev
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

$ vagrant up
....省略一大堆的输出
AI 代码解读

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

8 推倒重来

在使用的过程中,如果遇到问题,不好解决。 可以直接推倒重来,做好镜像的及时备份即可。

首先使用 vagrant status 查看一下状态

$ vagrant status
Current machine states:

cdh1                      running (virtualbox)
cdh2                      not created (virtualbox)
cdh3                      not created (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
AI 代码解读

然后使用vagrant halt 关机

$ vagrant halt cdh1
==> cdh1: Attempting graceful shutdown of VM...
The configured shell (config.ssh.shell) is invalid and unable
to properly execute commands. The most common cause for this is
using a shell that is unavailable on the system. Please verify
you're using the full path to the shell and that the shell is
executable by the SSH user.
AI 代码解读

可能关不了,因为ssl 坏了上不去了, 直接在virtualbox的界面去关,完了在看状态;

$ vagrant status
Current machine states:

cdh1                      poweroff (virtualbox)
cdh2                      not created (virtualbox)
cdh3                      not created (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.
AI 代码解读

vagrant destroy 销毁虚拟机

$ vagrant destroy
==> cdh3: VM not created. Moving on...
==> cdh2: VM not created. Moving on...
    cdh1: Are you sure you want to destroy the 'cdh1' VM? [y/N] y
==> cdh1: Destroying VM and associated drives...
AI 代码解读

vagrant up cdh1 重新启动

$ vagrant up cdh1
Bringing machine 'cdh1' up with 'virtualbox' provider...
==> cdh1: Importing base box 'springcloud-dev'...
==> cdh1: Matching MAC address for NAT networking...
。。。。。
    cdh1: Update /etc/hosts
    cdh1: Disable iptables
AI 代码解读

成功了

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

9 为将docker设置到专用的磁盘

使用尼恩的镜像,磁盘空间已经有 50G

本节内容,可以不看

背景,docker 导入镜像,报磁盘空间没有啦

为将docker设置到专用的磁盘,效果如下:

/dev/sdb /var/lib/docker ext4 errors=remount-ro 0 1

查看磁盘

在虚拟机中添加一块物理的磁盘,重起虚拟机。

查看磁盘:

[root@cdh2 ~]# fdisk -l

Disk /dev/sdb: 21.9 GB, 21892923392 bytes, 42759616 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sda: 10.5 GB, 10485760000 bytes, 20480000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0000ca5e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20479999     9726976   8e  Linux LVM

Disk /dev/mapper/centos-root: 8866 MB, 8866758656 bytes, 17317888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 1048 MB, 1048576000 bytes, 2048000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
AI 代码解读

磁盘分区

使用fdisk /dev/sdb进入菜单项,m是列出菜单,p是列出分区表,n是增加分区,w是保存并推出。由于这里增加的磁盘只有5G,因此5G划为一个区。

fdisk /dev/sdb
AI 代码解读

选项说明

m打印菜单
n新建分区
    p选择主分区
    e选择扩展分区
        1选择分区号
            选择初始位置,默认为1
            选择结束为止,默认为磁盘结尾
AI 代码解读

分区创建完成,可以列表查看,保存退出

p打印分区表
w写入分区表保存
q退出
AI 代码解读

过程的输出

fdisk /dev/sdb
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-42759615, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-42759615, default 42759615):
Using default value 42759615
Partition 1 of type Linux and of size 20.4 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
AI 代码解读

重新载入磁盘分区信息

无返回就是载入磁盘信息成功,针对磁盘进行操作

partprobe /dev/sdb
AI 代码解读

注意:
使用fdisk工具只是将分区信息写到磁盘,
在格式化分区值前需要使用partprobe让kernel重新读取分区信息,如果不成功则需要重启系统

对磁盘分区进行格式化

使用ext4文件系统

mkfs.ext4 /dev/sdb
AI 代码解读

过程的输出

[root@cdh2 ~]# mkfs.ext4 /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1338240 inodes, 5344952 blocks
267247 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2153775104
164 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
AI 代码解读

格式化完成后续优化配置,取消磁盘自检

tune2fs -c -1 /dev/sdb
AI 代码解读

分区挂载

挂载磁盘分区到指定目录

mkdir /var/lib/docker
 mount /dev/sdb /var/lib/docker
AI 代码解读

配置开机自动挂载分区

编辑 /etc/fstab,开机自动挂载

/etc/fstab 增加一行

vim /etc/fstab 


/dev/sdb               /var/lib/docker                ext4    errors=remount-ro 0 1
AI 代码解读

查看磁盘分区信息

[root@cdh2 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.3G  6.2G  2.2G  75% /
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G   28K  3.9G   1% /dev/shm
tmpfs                    3.9G  8.6M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1                497M  164M  334M  33% /boot
tmpfs                    783M     0  783M   0% /run/user/0
none                     319G  142G  178G  45% /vagrant
/dev/sdb                  20G   45M   19G   1% /var/lib/docker
AI 代码解读

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

10 虚拟机起来了, mysql访问不了

(1) mysql 没有启动

刚刚导入的最新版本的虚拟机,好几个 中间件都没有启动, 可以进入到 下面的这个目录

/home/docker-compose/base-env

看到 msyql ,redis、zk 、kafka 的一键启动目录

在这里插入图片描述

进入各自的目录 ,通过下面的命令,一键启动

docker-compose up -d
AI 代码解读

(2)mysql 端口映射 外部无法访问问题

此时出现问题,在centos 虚拟机上部署msyql后,在centos 内能够访问3306端口服务,但是在宿主机windows却不能访问。

这应该是由于请求被拦截。

一、查看firewall-cmd --state

如果输出的是“not running”则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接的情况了。

如果输出的是“running”,表示当前FirewallD正在运行,需要再输入下面的命令查看现在开放了哪些端口和服务:

firewall-cmd --list-ports
firewall-cmd --list-services
AI 代码解读

解决方案有两种:

1.关闭FirewallD服务:

如果您不需要防火墙,那直接关掉FirewallD服务就好了

systemctl stop firewalld.service
AI 代码解读

2.添加策略对外打开指定的端口:

比如我们现在要打开对外5000/tcp端口,可以使用下面的命令:

firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload
AI 代码解读

如果只是临时打开端口,去掉第一行命令中的“--permanent”参数,那么当再次重启FirewallD服务时,本策略将失效。

二、ip转发没有打开

sysctl net.ipv4.ip_forward
AI 代码解读

显示net.ipv4.ip_forward=0则表示未打开。

三、service iptables打开并拦截了

可关闭service iptables

service iptables stop
AI 代码解读

若docker run时出现错误:

iptables: No chain/target/match by that name.
AI 代码解读

则只需重启docker服务即可

service docker restart
AI 代码解读

或者:

#设置iptables防火墙为开机启动项
systemctl enable iptables.service

#启动防火墙使配置文件生效
systemctl start iptables.service

#停止防火墙
systemctl stop iptables.service

#重启防火墙使配置文件生效
systemctl restart iptables.service

最终版本:

启动docker并进行端口映射后,docker会在iptables中添加DNAT规则,将收到的对应端口的包转换ip并进行转发,同时添加规则将所有来自docker网域的ip进行转换。

但是在Centos7上出现docker可以正常访问外网,但是外网发出的请求在经过eth1接收转发后送达不到docker0,或者送到却出现(oui Unknown)的状况。暂时不清楚这到底是为什么经过DNAT后无法送达docker0.

最终解决办法是在启动docker后,重启iptables

service iptables restart
AI 代码解读

清空docker添加的所有规则,而后添加规则

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
AI 代码解读

将所有来自docker的包172.17.0.0/16的ip替换为本机ip并发送,以达到docker访问外网的目的。

(3) firewalld相关命令

按照下面的步骤,检查一下就行,主要是防火墙问题。

防火墙本来是关闭了的, 但是很多小伙伴,需要重新开启防火墙,再关闭一次,就OK了。

1、centos中firewalld 防火墙与iptables 防火墙

centos7以前的版本默认使用iptables服务进行管理防火墙规则。

centos7以及其以上版本默认使用firewalld服务管理防火墙。

所以在centos8中,就使用其默认的firewalld配置防火墙。

firewalld 防火墙和iptables 防火墙的官方说明可以参照
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls#sec-Comparison_of_Firewalld_to_system-config-firewall_and_iptables

2、firewalld相关命令
#进程与状态相关

systemctl start firewalld.service            #启动防火墙  
systemctl stop firewalld.service             #停止防火墙  
systemctl status firewalld                   #查看防火墙状态
systemctl enable firewalld             #设置防火墙随系统启动
systemctl disable firewalld                #禁止防火墙随系统启动
firewall-cmd --state                         #查看防火墙状态  
firewall-cmd --reload                        #更新防火墙规则   
firewall-cmd --list-ports                    #查看所有打开的端口  
firewall-cmd --list-services                 #查看所有允许的服务  
firewall-cmd --get-services                  #获取所有支持的服务
AI 代码解读

#区域相关

firewall-cmd --list-all-zones                    #查看所有区域信息  
firewall-cmd --get-active-zones                  #查看活动区域信息  
firewall-cmd --set-default-zone=public           #设置public为默认区域  
firewall-cmd --get-default-zone                  #查看默认区域信息
AI 代码解读

#接口相关

firewall-cmd --zone=public --add-interface=eth0  #将接口eth0加入区域public
firewall-cmd --zone=public --remove-interface=eth0       #从区域public中删除接口eth0  
firewall-cmd --zone=default --change-interface=eth0      #修改接口eth0所属区域为default  
firewall-cmd --get-zone-of-interface=eth0                #查看接口eth0所属区域
AI 代码解读

#端口控制

firewall-cmd --query-port=8080/tcp             # 查询端口是否开放
firewall-cmd --add-port=8080/tcp --permanent               #永久添加8080端口例外(全局)
firewall-cmd --remove-port=8800/tcp --permanent            #永久删除8080端口例外(全局)
firewall-cmd --add-port=65001-65010/tcp --permanent      #永久增加65001-65010例外(全局)  
firewall-cmd  --zone=public --add-port=8080/tcp --permanent            #永久添加8080端口例外(区域public)
firewall-cmd  --zone=public --remove-port=8080/tcp --permanent         #永久删除8080端口例外(区域public)
firewall-cmd  --zone=public --add-port=65001-65010/tcp --permanent   #永久增加65001-65010例外(区域public)
AI 代码解读

最常用命令

firewalld-cmd --zone=public --add-ports=8080/tcp --permanent
AI 代码解读

命令解析

firwall-cmd:是Linux提供的操作firewall的一个工具(服务)命令
–zone #作用域
–add-port=8080/tcp #添加端口,格式为:端口/通讯协议 ;add表示添加,remove则对应移除
–permanent #永久生效,没有此参数重启后失效

(4)执行mysql 客户端命令

需要进入容器,才能执行mysql命令, 命令如下

docker exec -it mysql /bin/bash
AI 代码解读

在这里插入图片描述

11 磁盘扩容

使用尼恩的镜像,磁盘空间已经有 50G

本节内容,可以不看

默认的磁盘是10个g,太小了

一个麻烦事——虚拟硬盘空间不!够!了!

使用了df -h命令一看,结果发现,主硬盘(/dev/sda1)总空间居然只有10G,然而一般的系统镜像初始大小就超过9G。

在网上一查,发现vagrant其实最初设计定位是快速还原运行环境,于是vagrant一般情况下在虚拟机初始化阶段不会留出很足的主硬盘空间。

扩容准备工作

  • 环境变量
    在这次操作中,我们需要用到virtualbox提供的vboxmanage命令。

    所以我们首先需要将此命令添加到环境变量中。

具体的办法:在windows下的操作,就是将virtualbox的安装路径添加至path项。

在这里插入图片描述

unix系统中应该类似。

记录原始硬盘信息

这次修改的虚拟机,是名称为cdh2,搜一下对应的.vmdk文件,直接搜索 cdh2即可

在这里插入图片描述

打开目录

在这里插入图片描述

看到两个虚拟磁盘 vmdk, 一个是 9g,一个16g, 那个16g的,是后面另外挂载的,用于存储docker镜像的

这次扩容的,是那个原始的,9g的

vboxmanage showhdinfo "box-disk001.vmdk"

在这里插入图片描述

PS C:\Users\DELL\VirtualBox VMs\cdh2>
>> vboxmanage showhdinfo "box-disk001.vmdk"
UUID:           8417c868-11a2-48f1-819d-a8024543c533
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       C:\Users\DELL\VirtualBox VMs\cdh2\box-disk001.vmdk
Storage format: VMDK
Format variant: dynamic default
Capacity:       10000 MBytes
Size on disk:   9260 MBytes
Encryption:     disabled
In use by VMs:  cdh2 (UUID: b66c6666-f514-4ddd-9a83-be6c4ff42ee4)
PS C:\Users\DELL\VirtualBox VMs\cdh2>
AI 代码解读

记录下原硬盘的uuid,之后会有用。

8417c868-11a2-48f1-819d-a8024543c533
AI 代码解读

制作扩容版硬盘

首先是将原硬盘进行克隆操作

vboxmanage clonehd "box-disk001.vmdk" "box-disk001-clone.vdi" --format vdi
AI 代码解读

在这里插入图片描述

这个vdi的uuid为

Clone medium created in format 'vdi'. UUID: 994f19ed-4792-4f4c-92eb-0fa2a295e311
P
AI 代码解读

将硬盘克隆成了vdi格式后,就可以开始下一步的扩容操作了:

首先扩容,再查看

vboxmanage modifyhd "box-disk001-clone.vdi" --resize 30720

vboxmanage showhdinfo box-disk001-clone.vdi
AI 代码解读

其中30720单位为MB,即表示30G空间。

查看容量

PS C:\Users\DELL\VirtualBox VMs\cdh2> vboxmanage showhdinfo box-disk001-clone.vdi
UUID:           994f19ed-4792-4f4c-92eb-0fa2a295e311
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       C:\Users\DELL\VirtualBox VMs\cdh2\box-disk001-clone.vdi
Storage format: vdi
Format variant: dynamic default
Capacity:       30720 MBytes
Size on disk:   7709 MBytes
Encryption:     disabled
Property:       AllocationBlockSize=1048576
AI 代码解读

转回原来的格式

接下来将硬盘文件转回原来的格式(其实直接使用vdi格式也可以),

以及,建议不要直接覆盖原来的 vmdk硬盘文件,以作备份。

VBoxManage clonehd "box-disk001-clone.vdi" "resized-disk001.vmdk" --format vmdk

PS C:\Users\DELL\VirtualBox VMs\cdh2> VBoxManage clonehd "box-disk001-clone.vdi" "resized-disk001.vmdk" --format vmdk
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vmdk'. UUID: 5f03bf70-a0c7-4f1b-a9fa-f4985f64cfab
AI 代码解读

记录一下新vmdk文件的uuid信息。

到这一步,带有原数据和新尺寸的硬盘就制作完毕了。

将新硬盘载入使用

替换原硬盘文件
虽然说是替换,不过还是建议将原来的vmdk文件进行一个备份。

字面意思,替换原文件

windows:

ren box-disk001.vmdk box-disk001-backup.vmdk
ren resized-disk001.vmdk box-disk001.vmdk
AI 代码解读
PS C:\Users\DELL\VirtualBox VMs\cdh2> vboxmanage showhdinfo .\resized-disk001.vmdk
UUID:           5f03bf70-a0c7-4f1b-a9fa-f4985f64cfab
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       C:\Users\DELL\VirtualBox VMs\cdh2\resized-disk002.vmdk
Storage format: vmdk
Format variant: dynamic default
Capacity:       30720 MBytes
Size on disk:   7610 MBytes
Encryption:     disabled
AI 代码解读
PS C:\Users\DELL\VirtualBox VMs\cdh2> ren box-disk001.vmdk box-disk001-backup.vmdk
PS C:\Users\DELL\VirtualBox VMs\cdh2> ren resized-disk001.vmdk box-disk001.vmdk
PS C:\Users\DELL\VirtualBox VMs\cdh2>
AI 代码解读

在这里插入图片描述

替换为新vmdk文件的uuid

旧的uuid

8417c868-11a2-48f1-819d-a8024543c533
AI 代码解读

新的

5f03bf70-a0c7-4f1b-a9fa-f4985f64cfab
AI 代码解读

其实替换完机子之后,还差最后一步:

  • 修改.box配置文件

  • 修改VirtualBox.xml配置文件

修改.box配置文件

打开原来的vmdk对应的box文件,将原来的vmdk的uuid信息全部替换为新vmdk文件的uuid。

在这里插入图片描述

在这里插入图片描述

修改之后

在这里插入图片描述

下面还有一个地方哈

在这里插入图片描述

修改注册中心的配置

还有一个文件 media registry('C:\Users\DELL.VirtualBox\VirtualBox.xml')也要改

在这里插入图片描述

修改注册中心的配置, 中间生产的 vmdisk全部在下边,需要去掉:

在这里插入图片描述

把这些注释屌

特别注意: 修改之前关闭virtualbox进程

这点特别注意,尼恩在这里耗了1个小时

id总是修改不成功

血和泪的教训呀

重启并且添加分区

在这里插入图片描述

连接上去,查看分区,发现 /dev/sda: 32.2 GB

[root@cdh2 ~]# fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0000ca5e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20479999     9726976   8e  Linux LVM

Disk /dev/sdb: 21.9 GB, 21892923392 bytes, 42759616 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-root: 8866 MB, 8866758656 bytes, 17317888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 1048 MB, 1048576000 bytes, 2048000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
AI 代码解读

到,主硬盘现在已经扩大到了30G,再也不用担心空间不够用啦。

开始分区

fdisk /dev/sda
# m 帮助菜单 \ p 该整磁盘详细信息 \ d 删除分区 \ n 添加分区 \w保存变更
AI 代码解读

下一步,输入n,进行创建分区。

下一步,输入3,进行创建分区的编号,之前有2个了。

下一步,选择开始扇区,和末尾扇区,都是默认值,把剩下的全给他

在这里插入图片描述

再次看磁盘

[root@cdh2 ~]#  fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0000ca5e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    20479999     9726976   8e  Linux LVM
/dev/sda3        20480000    62914559    21217280   83  Linux

Disk /dev/sdb: 21.9 GB, 21892923392 bytes, 42759616 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-root: 8866 MB, 8866758656 bytes, 17317888 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/centos-swap: 1048 MB, 1048576000 bytes, 2048000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
AI 代码解读

sda 3出来了

重启,然后格式化和挂载

# 格式化分区
mkfs.ext4  /dev/sda3
# 挂载
mount /dev/sda3 /home/docker-compose
# 设置开机自动挂载
echo "/dev/sda3 /home/docker-compose 0 0" >> /etc/fstab
cat  /etc/fstab
# 查看当前挂载目录情况
df -h
AI 代码解读

mkfs.ext4 /dev/sda3

[root@cdh2 ~]# mkfs.ext4  /dev/sda3
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1327104 inodes, 5304320 blocks
265216 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2153775104
162 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
AI 代码解读

mount /dev/sda3 /home/docker-compose

[root@cdh2 ~]# mkdir /home/docker-compose
[root@cdh2 ~]# mount /dev/sda3 /home/docker-compose
AI 代码解读

设置开机自动挂载

echo "/dev/sda3 /home/docker-compose ext4 errors=remount-ro 0 1" >> /etc/fstab
cat /etc/fstab

[root@cdh2 ~]# echo "/dev/sda3  /home/docker-compose  ext4 errors=remount-ro 0 1" >> /etc/fstab
[root@cdh2 ~]# cat  /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Jan 27 12:42:03 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=461cd9c0-513e-48db-bb08-d07a8f6ef260 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdb               /var/lib/docker                ext4    errors=remount-ro 0 1
#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
vagrant /vagrant vboxsf uid=0,gid=0,_netdev 0 0
#VAGRANT-END
/dev/sda3  /home/docker-compose  ext4 errors=remount-ro 0 1
AI 代码解读

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

尼恩技术圣经系列PDF

……完整版尼恩技术圣经PDF集群,请找尼恩领取

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
打赏
0
6
7
0
210
分享
相关文章
|
5月前
|
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
174 34
|
6月前
|
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
421 4
2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解步骤及报错对应解决方法]
Mysql And Redis基础与进阶操作系列(1)之[MySQL的下载、安装、配置详解步骤及报错对应解决方法]
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
6月前
|
springCloud中将redis共用到common模块
通过将Redis配置和操作服务提取到Common模块,可以在Spring Cloud微服务架构中实现高效的代码复用和统一管理。这种设计不仅简化了各个服务的配置和依赖管理,还提高了代码的可维护性和可读性。希望本文对你在Spring Cloud项目中集成和使用Redis有所帮助。
194 0
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
725 1
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
232 1
【SpringCloud Alibaba系列】Dubbo高级特性篇
本章我们介绍Dubbo的常用高级特性,包括序列化、地址缓存、超时与重试机制、多版本、负载均衡。集群容错、服务降级等。
【SpringCloud Alibaba系列】Dubbo高级特性篇

热门文章

最新文章

目录
目录