目前裸机(物理机)、虚拟机、容器是云计算提供计算服务的三种主流形式。那么如何判断一个虚拟shell环境到底是物理机、虚拟机还是容器呢?
更进一步,如果是物理机,这个物理机厂商是什么,虚拟机到底是KVM还是XEN,容器是Docker还是rkt、lxc等?
更进一步,如果是虚拟机,是否可以判断这个虚拟机是运行在AWS还是阿里或者OpenStack,是否能够获取虚拟机的UUID、instance-type、vpc-id、安全组等信息
如果使用了systemd,则可以直接通过 systemd-detect-virt 命令判断是否物理机:
如上可以看出这台是物理机,厂商为LENOVO,型号为ThinkServer RD640,序列号为NC01711670
当然如果是虚拟机,如上命令会执行失败。另外也可以通过其他命令查看物理信息,如 lshw 命令。
其实前面已经提到了,如果使用了systemd,则可以直接通过 systemd-detect-virt 命令判断是否虚拟机:
如果是虚拟机,则会输出虚拟机类型,如kvm、oracle(virtualbox)、xen等。
参考物理机的获取方式,我们可以通过dmidecode命令获取更多的虚拟机信息。比如我在一台KVM虚拟机运行如下命令:
如上Product Name为KVM,说明运行在KVM平台,而UUID即虚拟机的UUID。
XEN上的一台虚拟机输出为:
如上Manufacturer为XEN,说明运行在XEN平台,而UUID即虚拟机的UUID。
腾讯云的虚拟机如下:
华为云的虚拟机如下:
如上Manufacturer为 OpenStack Foundation ,说明运行在OpenStack平台,而UUID即虚拟机的UUID。
可见虽然可以从system信息中获取云厂商的线索,但其实虚拟机的system信息并没有统一的标准,有的在version中体现,有的在Product Name中表现,完全取决于云厂商自己的配置。
目前还没有什么方法能够100%准确判断虚拟环境是否是容器
如果环境有 systemd-detect-virt 命令,则可以直接通过 systemd-detect-virt -c 命令判断,如果输出为 none 则不是容器,否则会输出容器类型,比如lxc。目前很少容器里面放 systemd 的,我见过的就只有LXD的 ubuntu 镜像,因此这种方法适用性不广。
1查看目前默认的启动默认
2设置为图形界面模式
3设置为命令行模式
svm - Secure virtual machine, AMD的虚拟化技术AMD-V
vmx - Intel的虚拟化技术Intel-VT
所谓编排是指:当你一个应用被分成几个Container运行时候,这些Container需要协同,这就是所谓的编排功能。Orchestration 需要有个框架完成Container间的通信、容器如何连接的配置、容器创建、监控的调度,还有扩展性问题。市面上有容器编排的平台,比如Mesos和Kubernetes,但是Docker本身也提供了编排功能。
Docker Compose可以定义容器间的关系,它是一个client-side工具;Docker Swarm 则在编排系统中用于管理跨多主机的容器。
在网络级别,Docker creates a bridge network on your host A bridge network gives every container its own IP address , and it allows communication between containers and also between containers and the host
我们创建一个网络并让容器加入它
我们可以用下面这个命令查看容器被分配的IP地址:
上图命令dig是域信息搜索器的简称(Domain Information Groper),其执行结果含义如下:
当然我们也可以通过docker network inspect查看相关信息:
当业务比较复杂(involved)时,我们需要掌握依赖关系,这样才便于部署,其中一种方法是使用Docker Compose。它是一个独立的client工具,采用YAML文件定义你的解决方案架构, 并通过一个单一命令来管理整个容器集合。
在UNIX环境下,Docker Compose需要单独安装(Window环境下则是和Docker一起被安装的)
也支持使用--scale参数生成多个Nginx containers(需要指出在docker-composeyml中配置的容器名称)
可以查看生成的网络:
1、在Docker容器中运行的应用程序需要绑定到宿主机上的一个端口,以便其他计算机可以通过该端口访问该应用程序。可以使用dockerrun命令的-p选项来指定要绑定的端口。
2、确保Docker容器和其他计算机都连接到同一个外部三层交换机,并且都在同一个子网中。这样,其他计算机才能够通过交换机访问到Docker容器。
3、配置交换机的路由表,将其他网段内网的流量路由到与Docker容器所在子网相连的端口上。可以使用命令行或者图形化工具来完成这一步骤。
4、如果使用的是Linux *** 作系统,需要打开Docker容器的防火墙端口。
以上就是关于教你探测虚拟环境是物理机、虚拟机还是容器全部的内容,包括:教你探测虚拟环境是物理机、虚拟机还是容器、六. 使用Docker来编排系统(Networks、Compose)、外部三层交换机其他网段内网如何访问docker等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)