vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :
免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《尼恩Java面试宝典 最新版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取
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)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。是不是很酷?
VirtualBox 、vagrant、GitBash三剑客之间的关系
2 准备工作:
安装VirtualBox 、vagrant、GitBash
下载安装 VirtualBox ,下载安装 Vagrant ,下载更多不同系统甚至是已经配置好环境直接可以用的box,虽然可以直接在Vagrant直接使用网址,由Vagrant自动下载安装,但是考虑到网络情况,还是建议自行先下载好。
还可以在 http://www.vagrantbox.es/ 这里下载更多不同系统甚至是已经配置好环境直接可以用的box,虽然可以直接在Vagrant直接使用网址,由Vagrant自动下载安装,但是考虑到网络情况,还是建议自行先下载好。
可以从网盘下载
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
尼恩提示:可以不用下载 centos 基础镜像,直接用尼恩的镜像。
下载预装了很多组件的 springcloud.box 镜像,
疯狂创客圈网盘,尼恩 为大家准备了springcloud.box镜像,里边预装了java 、 redis 、zookeeper、kafka、Eureka、springcloud config 等必须的组件。
网盘地址请参见【博客园总入口 】
3 使用vagrant导入Java开发环境
第一步,新建目录
E:\virtual\work
选择新建立的文件夹作,右键 —> 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
$ 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.box 是box镜像文件的文件名,这里是本地保存box的路径。也可以是可以下载box的网址,如果是网址的话,Vagrant会自动启动下载。 镜像文件,找尼恩获取哈。
添加之后,使用下面的命令,查看添加好了的镜像
查看镜像
$ vagrant box list
centos (virtualbox, 0)
springcloud-dev (virtualbox, 0)
删除镜像
vagrant add remove 删除 box,自动帮你生成vagrantfile
vagrant box remove springcloud-dev
第三步,初始化虚拟机
设置好box之后,在当前工作目录运行
$ vagrant init springcloud-dev
centos为初始化的时候需要指定box的名称。执行的结果如下:
$ vagrant init centos
AVagrantfile
has been placed in this directory. You are now
ready tovagrant 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"
重启虚拟机,这样我们就能用 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
第四步,启动虚拟机
使用如下命令:
# 启动全部虚拟机节点 , 一共启动 3个节点
$ vagrant up
# 或者,指定名字,启动部分虚拟机节点 , 启动 cdh1 节点
$ vagrant up cdh1 # 启动名字为cdh1的虚拟机节点
你会看到终端显示了启动过程,启动完成后,我们就可以用 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
网上的大部分的解决方案为:
在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,右键点安装即可。
然后再做第二步。应该可以完成了。
4 打包分发
如果要备份自己虚拟机镜像box文件,可以进行 打包。
后面可以把这个box文件,分发给其他人。
打包之前,退出并关闭虚拟机。
在终端里对开发环境进行打包:
$ vagrant package
打包完成后会在当前目录生成一个 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)
命令的具体说明:
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
guest: 80 表示虚拟机中的80端口, host: 8080 表示映射到宿主机的8080端口。
2、如果需要自己自由的访问虚拟机,但是别人不需要访问虚拟机,可以使用private_network,并为虚拟机设置IP ,在Vagrantfile中配置:
config.vm.network :private_network, ip: "192.168.1.104"
192.168.1.104 表示虚拟机的IP,多台虚拟机的话需要互相访问的话,设置在相同网段即可
3、如果需要将虚拟机作为当前局域网中的一台计算机,由局域网进行DHCP,那么在Vagrantfile中配置:
config.vm.network :public_network
目录映射:
默认的,vagrant将共享你的工作目录(即Vagrantfile所在的目录)到虚拟机中的/vagrant,所以一般不需配置即可,如你需要可配置:
Vagrant.configure("2") do |config|
config.vm.synced_folder "src/", "/srv/website"
end
"src/":物理机目录;"/srv/website"虚拟机目录
目录映射(文件夹)详细说明如下:
既然是开发环境,那么开发工作肯定还是需要在本地完成,而不是都要进到虚拟机中去完成,虚拟机就好好在后台运行服务就好了,不然就本末倒置了,所以这里就需要使用目录映射功能,将本地的目录映射到虚拟机的对应目录。
默认情况下,当前的工作目录,会被映射到虚拟机的 /vagrant 目录,当前目录下的文件可以直接在 /vagrant 下进行访问,当然也可以在通过 ln 创建软连接,如
ln -fs /vagrant/wwwroot /var/www
来进行目录映射,当然,从自动化配置的角度,能不进系统就不需要进系统,所以在Vagrant也可以进行目录映射的操作:
config.vm.synced_folder "wwwroot/", "/var/www"
前面的参数 “wwwroot/” 表示的是本地的路径,这里使用对于工作目录的相对路径,这里也可以使用绝对路径,比如: “d:/www/”
后面的参数 “/var/www” 表示虚拟机中对应映射的目录。
当在启动Vagrant后,对于虚拟机有进行过安装环境相关的配置,如果并不希望写在Vagrant的启动shell里面每次都重新安装配置一遍,可以将当前配置好的虚拟机打包成box,
注:如果网络模式中使用 private_network 的话,在打包之前需要清除一下private_network的设置,避免不必要的错误:
sudo rm -f /etc/udev/rule.d/70-persistent-net.rules
制作完成之后直接将box文件拿到其他计算机上配置即可使用。
更多信息可以参考官方文档:http://docs.vagrantup.com/v2/
启动的时自运行需要的shell命令或脚本
内部脚本:
Vagrant::Config.run do |config|
config.vm.provision :shell, :inline => "echo abc > /tmp/test"
end
外部脚本:
Vagrant.configure("2") do |config|
config.vm.provision :shell, :path => "script.sh" #脚本的路径相对于项目根,也可使用绝对路径
end
附:简单的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
6 vagrant 常用命令
官网文档:https://docs.vagrantup.com/v2/getting-started/index.html
vagrant init 初始化vagrantfile
vagrant add remove 删除 box,自动帮你生成vagrantfile
vagrant box remove springcloud-dev
vagrant add box 添加 box,自动帮你生成vagrantfile
vagrant box add springcloud-dev /e/virtual/workcluster/springcloud-dev-3.box
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
vagrant box list 首先查看已经添加的box:
$ vagrant box list
centos (virtualbox, 0)
vagrant destroy 销毁当前虚拟机,不需要的虚拟机最好销毁,释放存储空间
7 虚拟机集群
建立虚拟机目录
先建立一个目录: /e/virtual/workcluster,通过 Git Bash进入 /e/virtual/workcluster,然后
添加镜像到 Vagrant
把下载的镜像springcloud-dev.box放入目录,添加镜像到 Vagrant
vagrant box add springcloud-dev springcloud-dev.box
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
上面的文件中定义了三个虚拟机,三个虚拟机的名字和 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
- 设置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
....省略一大堆的输出
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`.
然后使用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.
可能关不了,因为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`.
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...
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
成功了
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
磁盘分区
使用fdisk /dev/sdb进入菜单项,m是列出菜单,p是列出分区表,n是增加分区,w是保存并推出。由于这里增加的磁盘只有5G,因此5G划为一个区。
fdisk /dev/sdb
选项说明
m打印菜单
n新建分区
p选择主分区
e选择扩展分区
1选择分区号
选择初始位置,默认为1
选择结束为止,默认为磁盘结尾
分区创建完成,可以列表查看,保存退出
p打印分区表
w写入分区表保存
q退出
过程的输出
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.
重新载入磁盘分区信息
无返回就是载入磁盘信息成功,针对磁盘进行操作
partprobe /dev/sdb
注意:
使用fdisk工具只是将分区信息写到磁盘,
在格式化分区值前需要使用partprobe让kernel重新读取分区信息,如果不成功则需要重启系统
对磁盘分区进行格式化
使用ext4文件系统
mkfs.ext4 /dev/sdb
过程的输出
[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
格式化完成后续优化配置,取消磁盘自检
tune2fs -c -1 /dev/sdb
分区挂载
挂载磁盘分区到指定目录
mkdir /var/lib/docker
mount /dev/sdb /var/lib/docker
配置开机自动挂载分区
编辑 /etc/fstab,开机自动挂载
/etc/fstab 增加一行
vim /etc/fstab
/dev/sdb /var/lib/docker ext4 errors=remount-ro 0 1
查看磁盘分区信息
[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
10 虚拟机起来了, mysql访问不了
(1) mysql 没有启动
刚刚导入的最新版本的虚拟机,好几个 中间件都没有启动, 可以进入到 下面的这个目录
/home/docker-compose/base-env
看到 msyql ,redis、zk 、kafka 的一键启动目录
进入各自的目录 ,通过下面的命令,一键启动
docker-compose up -d
(2)mysql 端口映射 外部无法访问问题
此时出现问题,在centos 虚拟机上部署msyql后,在centos 内能够访问3306端口服务,但是在宿主机windows却不能访问。
这应该是由于请求被拦截。
一、查看firewall-cmd --state
如果输出的是“not running”则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接的情况了。
如果输出的是“running”,表示当前FirewallD正在运行,需要再输入下面的命令查看现在开放了哪些端口和服务:
firewall-cmd --list-ports
firewall-cmd --list-services
解决方案有两种:
1.关闭FirewallD服务:
如果您不需要防火墙,那直接关掉FirewallD服务就好了
systemctl stop firewalld.service
2.添加策略对外打开指定的端口:
比如我们现在要打开对外5000/tcp端口,可以使用下面的命令:
firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload
如果只是临时打开端口,去掉第一行命令中的“--permanent”参数,那么当再次重启FirewallD服务时,本策略将失效。
二、ip转发没有打开
sysctl net.ipv4.ip_forward
显示net.ipv4.ip_forward=0则表示未打开。
三、service iptables打开并拦截了
可关闭service iptables
service iptables stop
若docker run时出现错误:
iptables: No chain/target/match by that name.
则只需重启docker服务即可
service docker restart
或者:
#设置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
清空docker添加的所有规则,而后添加规则
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
将所有来自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 #获取所有支持的服务
#区域相关
firewall-cmd --list-all-zones #查看所有区域信息
firewall-cmd --get-active-zones #查看活动区域信息
firewall-cmd --set-default-zone=public #设置public为默认区域
firewall-cmd --get-default-zone #查看默认区域信息
#接口相关
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所属区域
#端口控制
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)
最常用命令
firewalld-cmd --zone=public --add-ports=8080/tcp --permanent
命令解析
firwall-cmd:是Linux提供的操作firewall的一个工具(服务)命令
–zone #作用域
–add-port=8080/tcp #添加端口,格式为:端口/通讯协议 ;add表示添加,remove则对应移除
–permanent #永久生效,没有此参数重启后失效
(4)执行mysql 客户端命令
需要进入容器,才能执行mysql命令, 命令如下
docker exec -it mysql /bin/bash
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>
记录下原硬盘的uuid,之后会有用。
8417c868-11a2-48f1-819d-a8024543c533
制作扩容版硬盘
首先是将原硬盘进行克隆操作
vboxmanage clonehd "box-disk001.vmdk" "box-disk001-clone.vdi" --format vdi
这个vdi的uuid为
Clone medium created in format 'vdi'. UUID: 994f19ed-4792-4f4c-92eb-0fa2a295e311
P
将硬盘克隆成了vdi格式后,就可以开始下一步的扩容操作了:
首先扩容,再查看
vboxmanage modifyhd "box-disk001-clone.vdi" --resize 30720
vboxmanage showhdinfo box-disk001-clone.vdi
其中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
转回原来的格式
接下来将硬盘文件转回原来的格式(其实直接使用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
记录一下新vmdk文件的uuid信息。
到这一步,带有原数据和新尺寸的硬盘就制作完毕了。
将新硬盘载入使用
替换原硬盘文件
虽然说是替换,不过还是建议将原来的vmdk文件进行一个备份。
字面意思,替换原文件
windows:
ren box-disk001.vmdk box-disk001-backup.vmdk
ren resized-disk001.vmdk box-disk001.vmdk
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
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>
替换为新vmdk文件的uuid
旧的uuid
8417c868-11a2-48f1-819d-a8024543c533
新的
5f03bf70-a0c7-4f1b-a9fa-f4985f64cfab
其实替换完机子之后,还差最后一步:
-
修改.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
到,主硬盘现在已经扩大到了30G,再也不用担心空间不够用啦。
开始分区
fdisk /dev/sda
# m 帮助菜单 \ p 该整磁盘详细信息 \ d 删除分区 \ n 添加分区 \w保存变更
下一步,输入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
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
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
mount /dev/sda3 /home/docker-compose
[root@cdh2 ~]# mkdir /home/docker-compose
[root@cdh2 ~]# mount /dev/sda3 /home/docker-compose
设置开机自动挂载
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