虚拟机 & Docker

    1. Workstation

虚拟机CentOS卡死在开机滚动条

  1. 重启按e键进入grub菜单
  2. 选择要启动的版本,然后按e
  3. 选择带kernel的项,然后按e进入grub编辑页面

4)去掉rhgb quiet字样,按回车保存回到高亮带kernel的项

5)按b启动它就能看到启动过程了,系统卡住时会提示哪里出错了。

selinux设置错误导致系统不能启动卡死在开机滚动条

系统不能启动卡死在开机滚动条,重启按e按e按↓按e删除rhgb quiet字样按Enter按b检查启动原因,提示为Failed to load SELinux policy. Freezing...

错误原因:

配置关闭SELinux时配置错了

应修改配置文件/etc/selinux/config中的“SELINUX”参数值(值enforcing改为disabled)

但是误将“SELINUXTYPE”看成“SELINUX”,修改了SELINUXTYPE参数值(原值为targeted)

解决办法:

  1. 重启按e键进入grub菜单
  2. 选择要启动的版本,然后按e
  3. 选择带kernel的项,然后按e进入grub编辑页面
  4. 添加参数selinux=0或enforcing=0,按回车保存回到高亮选择的启动项
  5. 按b启动它就能进入系统了
  6. 修改selinux配置文件,SELINUXTYPE值改回targeted,SELINUX值改为disabled

虚拟机无法使用NAT模式上网解决方法

Windows服务中先停止VMware DHCP Service,再顺序开启VMware NAT Service和VMware DHCP Service。

桥接模式无法上网

  1. VMware菜单“编辑”-》虚拟网络编辑器-》更改设置-》选中类型为“桥接模式”的网络-》“已桥接至”选择物理网卡-》确定
  2. Linux中用route -n查看网关列有无物理网卡的默认网关地址,若无,添加到路由表:route add default gw 物理网卡的默认网关地址
  3. Linux重启网络服务:service network restart

解决虚拟机CentOS的IP只有127.0.0.1,无法联网及远程登录问题

ifconfig只能查到127.0.0.1的网卡,ifconfig -a发现多了个无ip的网卡,原因是该网卡未启用。解决方法:

1、首先确定连接必须设置为桥接的方式。

2、修改文件/etc/sysconfig/network-scripts/ifcfg-eth0(文件名因你网卡名称而异),将ONBOOT的值no改为yes

3、修改完成后service network restart重启网络配置,现在应该就可以上网了。

虚拟机克隆或复制没有IP

症状

a> 上不了网了
b> service network restart报错“bring up interface eth0: device eth0 does not seem to be present, delaying initialization”
c> ifconfig
lo        Link encap:Local Loopback
          ......
d> ifconfig -a
eth1       Link encap:Ethernet  HWaddr 00:0C:29::6B:21:A6
          ......

lo        Link encap:Local Loopback
          ......

分析

克隆或复制CentOS虚拟机后,VMWare为了避免网卡冲突又重新为新的CentOS虚拟机虚拟出来了一个网卡eth1,这就是为什么 ifconfig 时没有 eth0 了,虽然 VMWare 为新的 CentOS 虚拟机虚拟了一个新的网卡 eth1,但它并没有更改 /etc/sysconfig /network-scripts/ifcfg-eth0 的信息,因此错误就出现了。如果克隆多次还可能会有 eth2,eth3 等,这里不说了。

解决

a> ifconfig -a查询并记住网卡名(假设为eth1)和物理地址。

根据网卡名修改配置文件名:mv /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1

b> 修改配置文件内容:/etc/sysconfig/network-scripts/ifcfg-eth1中的

DEVICE="eth0"改为DEVICE="eth1"

HWADDR="XX:XX:XX:XX:XX:XX"改为eth1的物理地址

(c> 重启网络服务:service network restart

远程登录CentOS出现Network error: Connection refused解决方法

1、查看SSH服务有没有安装

# rpm -qa|grep ssh

2、查看SSH服务有没有开启

# /etc/init.d/sshd status

如果openssh-daemon is stopped,开启sshd服务:

# service sshd start

3、查看所有的端口

# netstat -tlnp

4、查看ssh使用的22号端口有没有enable

# netstat -an|grep 22

5、采用SSH能不能正常连接

# ssh root@192.168.1.100

6、把Linux防火墙都关闭

7、看ip是否冲突

Vagrant是Ruby语言开发的虚拟机构建和维护工具,是对传统虚拟机的一层封装,能够更方便的使用虚拟开发环境。

Vagrant支持VirtualBox、VMware、KVM、Docker等。

使用步骤

下载VirtualBox

下载地址:Downloads – Oracle VM VirtualBox

除了主程序(platform packages),还要把对应的扩展包程序(Extension Pack)也一并下载了。有些高级特性,比如USB 3.0等需要扩展包的支持。在安装完主程序后,直接双击扩展包文件即可安装扩展包。

下载安装Vagrant

下载地址:Install | Vagrant | HashiCorp Developer

Vagrant是没有图形界面的,所以安装完成后也没有快捷方式,安装程序会自动把安装路径加入到PATH环境变量,所以,安装完后可以通过命令vagrant -v检查是否安装成功。

配置 VirtualBox

启动VirtualBox后,通过菜单 管理->全局设定->常规(或者快捷键 Ctrl+g),修改 默认虚拟电脑位置,指定一个容量较大的磁盘目录。

配置Vagrant

使用Vagrant创建虚拟机时,需要指定镜像文件(.box),Vagrant会先从网上下载镜像文件,然后缓存在本地目录中,默认存储在用户目录下的.vagrant.d目录下,由于镜像文件较大,我们可以通过设置环境变量VAGRANT_HOME来改变存储目录。

下载虚拟机镜像

Vagrant 有一个镜像网站,里面列出了都有哪些镜像可以用,并且提供了操作文档:Discover Vagrant Boxes - Vagrant Cloud

如果官方镜像网站下载慢,可从其它地方下载到基础镜像,然后按照自己的需要重置:

CentOS 的镜像下载网站是:CentOS Cloud images

对应版本子目录中找到vagrant目录,里面是专门为vagrant构建的镜像。选择其中的.box后缀的文件下载即可。

这里我们选择下载的是 CentOS 7 的最新版本:

http://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7.box

Ubuntu 的镜像下载网站是:Ubuntu Cloud Images - the official Ubuntu images for public clouds, Openstack, KVM and LXD

选择vagrant目录进入,寻找目标的版本的.box文件即可。

还可以从 清华大学的镜像站 下载:

Index of /ubuntu-cloud-images/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

本例以CentOS7为例。

添加box

查看box列表:

$ vagrant box list

提示现在还没有 box。如果这是第一次运行,此时 VAGRANT_HOME 目录下会自动生成若干的文件和文件夹,其中有一个 boxes 文件夹,这就是要存放 box 文件的地方。

添加box:

$ vagrant box add e:\Downloads\CentOS-7.box --name centos-7

命令后面跟着的是下载的文件路径,并且通过 --name centos-7 为这个 box 指定一个名字。

后面创建虚拟机都需要指定这个名字,所以尽量把名字取得简短一点,同时也要能标识出这个镜像的信息(我们后面会定制自己的基础镜像,所以这里可以简单点)。

再次查询,可以看到有了一个 box:

$ vagrant box list

创建虚拟机

$ mkdir demo

$ cd demo

$ vagrant init centos-7

创建每个虚拟机都要在各自的单独文件夹下。

其中的 centos-7 就是我们要使用的 box 名字。

这个命令只是为我们生成一个 Vagrantfile,所以,这里的名字没指定或者写错了都没关系,后面会介绍如何编辑这个 Vagrantfile 来修改。

启动虚拟机

vagrant up

最后一行打印Rsyncing folder说明启动成功,这时候打开 VirtualBox,可以看到VirtualBox自动添加了创建的虚拟机并且在运行中。

注意打印的信息:

虚拟机名称:demo_default_1588406874156_65036(想改?最后有提)

网卡:Adapter 1: nat,第一块网卡,NAT 模式,这是固定的

端口转发:22 (guest) => 2222 (host) (adapter 1),把虚拟机的22端口映射到宿主机的2222端口上,这样就可以通过127.0.0.1:2222访问虚拟机了

SSH 用户名:vagrant,这里使用 private key 登录,密码也是 vagrant,但是密码方式仅供直接登录,是不能通过 SSH 登录的。

查看虚拟机状态

查看当前目录虚拟机状态(需在Vagrantfile所在目录中运行):

$ vagrant status

查看所有虚拟机状态:

$ vagrant global-status

连接虚拟机

$ vagrant ssh

将以 vagrant 用户直接登入虚拟机中,root 用户没有默认密码,也不能直接登录。

我们也可以在VirtualBox终端或其他SSH连接工具上登录系统,默认的登录用户名和密码都是 vagrant。

但是这里默认网卡使用的是 NAT 模式,没有指定 IP,实际应用并不方便,我们在后面介绍网络配置时再详细介绍如何连接虚拟机。

停止虚拟机

$ vagrant halt

或者直接在 VirtualBox 上关闭虚拟机,或者直接在虚拟机内部执行poweroff命令

暂停虚拟机

$ vagrant suspend

恢复虚拟机

$ vagrant resume

或者vagrant up

重载虚拟机

$ vagrant reload

这将重新加载Vagrantfile配置信息并且重启虚拟机。

删除当前虚拟机

vagrant destroy

配置Vagrantfile

这是一个 Ruby语法的文件,刨除注释,这个文件的实际生效内容实际只有 3 行:

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

  config.vm.box = "centos-7"

end

首尾两行组成一个代码块结构,不要去动它,除非你知道自己在干什么。我们平常只需要编辑这其中的配置项。

这里的 config.vm.box 对应的就是虚拟机的镜像,也就是 box 文件,这是唯一必填的配置项。

配置端口转发

...

...

...

剩余内容查看:超详细的 Vagrant 上手指南 - 知乎

或者:超详细 Vagrant 入门指南,建议收藏_davycloud的博客-CSDN博客

    1. 简介

Docker是什么

Docker是一个Go语言实现的开源应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上。一个完整的Docker有以下几个部分组成:

DockerClient客户端

Docker Daemon守护进程

Docker Image镜像

Docker镜像就是一个只读的模板,用来创建容器,一个镜像可以创建很多容器。镜像与容器的关系类似于类与对象。

它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。

Docker Container容器

容器是用镜像创建的运行实例,一个虚拟化的运行环境,应用程序或服务就运行在容器中。每个容器都是相互隔离的。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

Docker Repository仓库

仓库是集中存放镜像文件的场所,类似于Maven仓库是存放各种jar包的地方,github仓库是存放各种git项目的地方。

仓库分为公开仓库(Public)和私有仓库(Private),最大的公开仓库是Docker公司提供的官方registry仓库Docker Hub:https://hub.docker.com/

国内的公开仓库包括阿里云、网易云等。

与传统虚拟机对比

Virtual Machine

Docker

传统虚拟机是操作系统(包括文件系统)隔离,Docker是文件系统隔离。

传统的虚拟技术,在将物理硬件虚拟成多套硬件后,在每套虚拟硬件上都部署一个操作系统,接着在这些操作系统上各自独立运行相应的应用程序。而Docker没有进行硬件虚拟,各个容器也没有自己的系统内核,容器内的应用程序直接运行于宿主机的内核上。Docker实质上是在运行的Linux中制造一个隔离的文件系统,因此它的执行效率几乎等同于所部署的Linux主机。Docker必须部署在Linux内核的系统上,如果其他系统要部署Docker就必须安装一个虚拟Linux环境。

App A

App B

Bins/Libs

Bins/Libs

Guest OS

Guest OS

Hypervisor

Host OS

Server

App A

App B

Bins/Libs

Bins/Libs

Docker Engine

Host OS

Server

优势

更高效的计算资源利用(无操作系统虚拟化开销)

更快速的应用交付和部署(一个镜像文件即可)

更便捷的升级和扩容(增量分发、秒级启动速度)

更简单的系统运维(一次镜像,到处运行(Build, Ship and Run Any App, Anywhere)。DevOps开发运维合二为一)

官网

Docker官网:Docker: Accelerated Container Application Development

DockerHub官网:https://hub.docker.com/

Docker运行的基本流程:

1、用户使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者。

2、Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client 的请求。

3、Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在。

4、Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graphdriver 将下载镜像以 Graph 的形式存储。

5、当需要为 Docker 创建网络环境时,通过网络管理驱动 Networkdriver 创建并配置 Docker容器网络环境。

6、当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成。

7、Libcontainer 是一项独立的容器管理包,Networkdriver 以及 Execdriver 都是通过 Libcontainer 来实现具体对容器进行的操作。

Docker Client「发起请求」

1、Docker Client 是 和 Docker Daemon 建立通信的客户端。用户使用的可执行文件为 docker(一个命令行可执行文件),docker 命令使用后接参数的形式来实现一个完整的请求命令(例如:docker images,docker 为命令不可变,images 为参数可变)。

2、Docker Client 可以通过以下三种方式和 Docker Daemon 建立通信:tcp://host:port、unix://pathtosocket 和 fd://socketfd

3、Docker Client 发送容器管理请求后,由 Docker Daemon 接受并处理请求,当 Docker Client 接收到返回的请求相应并简单处理后,Docker Client 一次完整的生命周期就结束了。(一次完整的请求:发送请求→处理请求→返回结果),

Docker Engine

Docker Engine 是 Docker 架构中的运行引擎,同时也 Docker 运行的核心模块。它扮演 Docker Container 存储仓库的角色,并且通过执行 Job 的方式来操纵管理这些容器。

Job

一个 Job 可以认为是 Docker 架构中 Docker Engine 内部最基本的工作执行单元。Docker 可以做的每一项工作,都可以抽象为一个 Job。例如:在容器内部运行一个进程,这是一个 Job;创建一个新的容器,这是一个 Job。Docker Server 的运行过程也是一个 Job,名为 ServeApi。

Docker Registry(镜像注册中心)

Docker Registry 是一个存储容器镜像的仓库(注册中心),可理解为云端镜像仓库。按 Repository 来分类,docker pull 按照 [repository]:[tag] 来精确定义一个具体的 Image。

Graph 「Docker 内部数据库」

Repository

已下载镜像的保管者(包括下载的镜像和通过 Dockerfile 构建的镜像)。

一个 Repository 表示某类镜像的仓库(例如:Ubuntu),同一个 Repository 内的镜像用 Tag 来区分(表示同一类镜像的不同标签或版本)。一个 Registry 包含多个Repository,一个 Repository 包含同类型的多个 Image。

镜像的存储类型有 Aufs、Devicemapper、Btrfs、Vfs等。其中 CentOS 系统 7.x 以下版本使用 Devicemapper 的存储类型。

Driver 「执行部分」

Driver 是 Docker 架构中的驱动模块。通过 Driver 驱动,Docker 可以实现对 Docker 容器执行环境的定制。即 Graph 负责镜像的存储,Driver 负责容器的执行。

Graphdriver

Graphdriver 主要用于完成容器镜像的管理,包括存储与获取。

存储:docker pull 下载的镜像由 Graphdriver 存储到本地的指定目录( Graph 中 )。

获取:docker run(create)用镜像来创建容器的时候由 Graphdriver 到本地 Graph中获取镜像。

Networkdriver 的用途是完成 Docker 容器网络环境的配置,其中包括:

Docker 启动时为 Docker 环境创建网桥。Docker 容器创建时为其创建专属虚拟网卡设备。Docker 容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。

Docker Container( Docker 容器 )是 Docker 架构中服务交付的最终体现形式。

Docker 按照用户的需求与指令,订制相应的 Docker 容器:

    用户通过指定容器镜像,使得 Docker 容器可以自定义 rootfs 等文件系统。

    用户通过指定计算资源的配额,使得 Docker 容器使用指定的计算资源。

    用户通过配置网络及其安全策略,使得 Docker 容器拥有独立且安全的网络环境。

    用户通过指定运行的命令,使得 Docker 容器执行指定的工作。

Docker可以运行在Windows、Mac、CentOS、Ubuntu等操作系统上

常用命令:docker | Docker Docs

CentOS7安装Docker

安装手册:Install Docker Engine on CentOS | Docker Docs(CE-社区版)

前提条件

Docker支持以下的CentOS版本:

CentOS 7 (64-bit)

CentOS 6.5 (64-bit) 或更高的版本

目前CentOS仅发行版本中的内核支持Docker

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。

Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

切换root用户

su

查看CentOS版本

cat /etc/redhat-release

查看系统内核

uname -r

卸载旧Docker

yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-engine

安装依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

软件包yy -utils提供了yy-config-manager相关功能,device-mapper-persistent-data和lvm2是设备映射器驱动程序所需要的。

设置docker下载镜像

官方的:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

或者阿里云的:

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yum软件包索引

我们在更新或配置yum源之后,通常都会使用yum makecache生成缓存,这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度

yum makecache fast

安装docker ce以及docker-cli、containerd.io

yum install -y docker-ce docker-ce-cli containerd.io

启动docker

systemctl start docker

版本验证

docker version

设置开机启动

#查看服务是否自动启动(是:enabled | 否:disabled)

systemctl list-unit-files|grep docker.service

#设置开机启动(若非enabled):

systemctl enable docker

配置Docker容器镜像加速

Docker客户端版本大于1.10.0的,可通过修改配置文件/etc/docker/daemon.json来使用阿里云容器镜像加速器

#创建目录

sudo mkdir -p /etc/docker

#写入镜像配置

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]

}

EOF

#重新加载服务配置

systemctl daemon-reload

或者重启Docker服务

systemctl restart docker

要禁止开启启动

#禁止开机自启

systemctl disable docker

#重新加载服务配置

systemctl daemon-reload

如要卸载

systemctl stop docker

yum remove -y docker-ce

rm -rf /var/lib/docker

    1. 奇技淫巧

Docker实现多IP

在同一主机上运行多个Docker容器,并让它们共享同一个端口。在这种情况下,需要为每个容器分配一个IP地址,以便它们可以与外界通信。

docker run -p 192.168.1.100:80:80 --name webserver1 -d nginx

docker run -p 192.168.1.101:80:80 --name webserver2 -d nginx

docker run -p 192.168.1.102:80:80 --name webserver3 -d nginx

在上面的代码中,我们启动了三个容器,每个容器都分配了一个唯一的IP地址,并在端口80上监听。

在主机上ping这些IP地址,你应该能够看到响应:

ping 192.168.1.100

ping 192.168.1.101

ping 192.168.1.102

使用Docker的网络功能,可以在主机上的浏览器中通过IP地址访问这些服务。

docker network create my-network

docker run --network my-network --ip 192.168.1.100 -p 80:80 --name webserver1 -d nginx

docker run --network my-network --ip 192.168.1.101 -p 80:80 --name webserver2 -d nginx

docker run --network my-network --ip 192.168.1.102 -p 80:80 --name webserver3 -d nginx

通过指定一个网络,并为每个容器分配一个IP地址,我们可以将这些服务的端口映射到主机上的端口80。

在主机上的浏览器中通过IP地址访问这些服务:

http://192.168.1.100

http://192.168.1.101

http://192.168.1.102

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值