Docker虚拟化简介及两种平台的构建流程

一、Docker虚拟化的简介

1、虚拟化技术的概念
1)虚拟化技术主要是将物理的资源转变为逻辑上可以管理的资源,以打破物理资源结构之间的壁垒,让计算的元件运行在虚拟的基础上,而不是直接运行在物理的资源上。
2)虚拟化技术的底层是要进行虚拟的硬件设备物理机资源,通过虚拟化技术软件可以将物理机虚拟生成N台虚拟机,应用程序、软件服务(Nginx、MYSQL、Zabbix、Redis、Tomcat、Ansible)运行在虚拟机上,而不是直接运行在物理机资源上。

2、虚拟化技术的种类?

  • 完全虚拟化技术实际上是通过软件实现对操作系统的资源再分配,比较成熟,例如我们的KVM、VirtualBOX;

  • 半虚拟化技术则是通过代码修改已有的系统,形成一种新的可虚拟化的系统,调用硬件资源去安装多个系统,整体速度上相对高一点,代表产品有Xen。

  • 轻量级虚拟化,Docker虚拟化(介于完全虚拟化、半虚拟化之间),轻量级虚拟化;

现在存在的虚拟化技术有:

  • VMware ESXI;
  • XEN;
  • KVM;
  • Open-vz;
  • Hyper-v;
  • Docker。

3、Docker虚拟化的认识

  • Docker是众多虚拟化技术中的一种,是目前互联网IT企业使用最广泛的一种虚拟化技术,其特点:轻量级、高性能、安全、稳定、高效等,主要是用于解决企业级轻量级操作系统和应用容器资源而诞生的。
  • Docker虚拟化技术的产物是虚拟机,轻量级的虚拟机没有传统虚拟化-虚拟机的体积大,没有过多没有用的文件和数据,比较简洁、实用。
  • 在Docker虚拟化技术学习中,Docker虚拟机也被称为Docker容器,Docker容器跟集装箱机制是类似的,Docker容器中可以打包开发者软件包、依赖环境、库文件,可以轻松将容器移植到各个不同的Linux平台,而且在迁移过程中软件包、依赖环境、库文件不会有任何丢失,整体迁移。

4、Docker中的镜像、仓库、容器的辨析
辨析图解:
在这里插入图片描述
1、Docker镜像(Image)类似于虚拟机的镜像,可以将他理解为一个面向Docker引擎的只读模板,包含了文件系统。

例如:一个镜像可以完全包含了Ubuntu操作系统环境,可以把它称作一个Ubuntu镜像。镜像也可以安装了Apache应用程序(或其他软件),可以把它称为一个Apache镜像。
2、Docker容器(Container)类似于一个轻量级的沙箱子(因为Docker是基于Linux内核的虚拟技术,所以消耗资源十分少),Docker利用容器来运行和隔离应用。

(1)容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

(2)可以把每个容器看作一个简易版的Linux系统环境(包括了root用户权限、进程空间、用户空间和网络空间),以及与运行在其中的应用程序打包而成的应用盒子。

(3)镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。就像用ISO装系统之后,ISO并没有什么变化一样。

3、Docker仓库(Repository)类似与代码仓库,是Docker集中存放镜像文件的场所。
例如:像yum源仓库一样,Docker的仓库就是存储大量镜像的一个地方,安装了docker会有各种镜像到仓库索取的下载连接。通过连接到仓库我们就可以获取镜像了!

二、Docker虚拟化应用方式:启动应用容器

1、原理图

在这里插入图片描述注:启动服务容器这种方式,一个docker实例只能是一个服务,相当于说这个docker容器里面只能有一个服务(应用),可以说这个容器就是这个服务,这个服务就是这个容器,服务停,该docker实例也会停下来!

因此大家应该也能看出来这种方式是不可取的,这个方法企业用的也并不多!

2、实战步骤

(1)yum安装docker

yum install docker -y
systemctl restart docker
ps -ef|grep docker
docker version

(2)从docker仓库下载Nginx镜像

docker search nginx			#在Docker仓库中搜索Nginx镜像;
docker pull docker.io/nginx #从Docker仓库中下载Nginx镜像;
docker images				#查看已下载Nginx镜像和文件路径;

在这里插入图片描述注:STARS值越大,表示下载的次数越多,我们一般选择下载次数最多的下载。

在这里插入图片描述
(3)基于Nginx镜像启动Nginx应用容器

docker run -itd -p 80:80 docker.io/nginx

命令参数详解:

Run,创建一台新容器(虚拟机);
-i,interactive交互模式;
-t,tty打开终端;
-d,daemon后台启动;
-p,开启DNAT端口映射,将宿主机80端口(第一个)映射至容器的80端口;

(4)查看已启动的Nginx容器(虚拟机)

docker ps

在这里插入图片描述(5)查看该docker实例的ip

docker inspect 11b96939d2ff|grep -i ipaddr|tail -1|awk -F\" '{print $4}'
ifconfig

(6)进入Nginx容器终端

docker exec -it 11b96939d2ff /bin/bash
				容器ID(主机名)

(7)从宿主机上,重启Nginx容器中Nginx WEB服务

#将宿主机上index.html文件更新至Docker Nginx容器中;
docker cp index.html 430cf15e57d4:/usr/share/nginx/html/

docker exec 430cf15e57d4 nginx -s reload
#注意不能把nginx停止,停了nginx服务,该docker实例也会停!

三、Docker虚拟化应用方式:启动Guest OS(企业推荐)

1、原理图

在这里插入图片描述上面的图中有错,把Hypervisor改成docker Engine即可!
注:在云中,每个容器即是一个用户,这种方式下每个用户都有自己独立的操作系统,每个用户的服务都运行在自己的容器的Guest OS中!这种方式是当前的主流!

2、实战步骤

注:实现ssh可以连接docker Guest OS。

(1)安装、启动docker略
(2)查找centos,并下载
docker search centos
docker pull docker.io/jdeathe/centos-ssh

在这里插入图片描述

(3)启动docker容器
docker run -itd -p 6022:22 --privileged --name aliyun docker.io/jdeathe/centos-ssh 
--privileged  容器以特权模式(root)运行	
--name 指定主机名

重点: -p 这个参数必须指定,在启动应用容器方式中我们映射的是服务的端口(例如:-p 80:80),在用Guest OS方式中我们映射的ssh服务的端口;之所以必须指定-p,因为一般来说一台服务器都要虚拟很多个容器出来,容器之间端口不能冲突,也就是说映射的要是服务器的不同端口

–name的作用:
在这里插入图片描述–privileged的作用:
在这里插入图片描述注:提示没有root权限,我们在创建运行容器时,必须指定–privileged,才能解决这个报错

docker常用命令须知:

docker ps #可以看现在正在运行的容器有哪些
docker ps -a #列出所有已创建的容器(包括停止的和正在运行的)
docker ps -aq #列出所有已创建容器的容器ID
docker ps -aq|xargs docker rm -f {} #删除容器
docker rmi +镜像名称 #删除docker镜像
docker start|restart|stop +容器ID #启动、重启、停止一个docker容器
(4)安装ssh

注:若你下载的centos镜像有ssh这个服务,可忽略这一步

yum install openssh openssh-server -y
(5)修改ssh配置文件、root用户密码

修改ssh配置文件:

 vim /etc/ssh/sshd_config 
#把下面参数改成下面的值:
GSSAPIAuthentication no 
UseDNS no
PermitRootLogin yes
PasswordAuthentication yes

修改root用户密码:

echo "1"|passwd --stdin root

查看改容器的Guest OS的IP地址:

yum install net-tools -y
ifconfig #如果不安装net-tools软件包,就没有这个命令

注:这个IP是拿来ssh用的。

(6)将容器重启即可,解决systemctl启动报错

注:按理来说重启ssh服务就行了,但是我的ssh服务,重启会报错!
在这里插入图片描述这个是因为D-Bus服务没起,我们只能用/usr/sbin/sshd这种风格去启动ssh,如果想用systemctl这种风格去启动的话,启动容器时需要加下面这个参数:

docker run -itd --privileged c432b9da999c /usr/sbin/init
#把容器启动的入口命令变成/usr/sbin/init即可!

如果不想这么麻烦,那我们这里把容器重启也可以的!

docker restart +容器ID
(7)在宿主机上ssh即可

注意:在宿主机上ifconfig看到的docker0网卡的ip并不是docker容器的IP,而是对应docker容器的网关ip,要看docker容器的ip需要在docker容器中ifconfig
在这里插入图片描述ssh连接成功!

发布了188 篇原创文章 · 获赞 150 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44571270/article/details/104330671