云计算涌现出很多改变传统IT架构和运维方式的新技术,比如虚拟机、容器、微服务、Serverless(无服务),无论这些技术应用在哪些场景,降低成本、提升效率是云服务永恒的主题。
Bare Metal(裸金属):运行物理机,也称为裸金属
Virual machines(虚拟机):可以在一台物理机上创建多个虚拟机,并把物理配置分发成多个虚拟配置
缺点:性能损耗大,大约损耗50%
虚拟机常用软件:VMware workstation(windows、vm Sphere+ESXI (Windows server)、KVM(linux内核))
Containers(容器):容器内部自身有一个小型操作系统
常用软件:docker、podman、rocket、container
functions函数(函数化、代码化)
(1)Docker 是一个开源的应用容器引擎,基于go 语言开发并遵循了apache2.0 协议开源
(2)Docker 是在Linux 容器里运行应用的开源工具,是一种轻量级的“虚拟机”
(3)Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器。
Docker 的Logo设计为蓝色鲸鱼,拖着许多集装箱,鲸鱼可以看作为宿主机,集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序
容器化越来越受欢迎,因为容器是:
(1)灵活:即使是最复杂的应用也可以集装箱化。
(2)轻量级:容器利用并共享主机内核。
(3)可互换:可以即时部署更新和升级。
(4)便携式:可以在本地构建,部署到云,并在任何地方运行。
(5)可扩展:可以增加并白动分发容器副本。
(6)可堆叠:可以垂直和即时堆叠服务。
容器是在linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
(1)隔离共享
虚拟机通过添加Hypervisor层(虚拟化中间层),虚拟出网卡、内存、CPU等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。而Docker容器则是通过隔离(namesapce)的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限、CPU资源等进行控制(cgroup),最终让容器之间互不影响,容器无法影响宿主机。
(2)性能与损耗
与虚拟机相比,容器资源损耗要少。
同样的宿主机下,能够建立容器的数量要比虚拟机多。
虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破 Hypervisor层,这是极其困难的,而docker容器与宿主机共享内核、文件系统等资源,更有可能对其他容器、宿主机产生影响。
镜像:包含了各种环境或者服务(tomcat redis nginx)的一个模板。运行容器的基础,包含运行应
用程序所需的所有内容。
容器:是镜像运行起来之后的一个实例,可以把容器看做是一个简易版的linux环境容器就是集装箱
从镜像创建的叫做运行实例。
仓库:存放镜像的场所,最大的公开库是docker。私有仓库harboor。
寄据架构 :
本机(真实操作系统)–> 虚拟化产品–> 虚拟化操作系统或软件
原生架构:
裸金属之上 服务器 --> 虚拟化产品
虚拟化产品 vmware kvm/openstack linux虚拟环境 私有云环境
docker 本质就是宿主机的一个进程,docker 通过namespace 实现资源隔离,通过==cgroups ==实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘。比如分配500G,并不是实际占用物理磁盘500g,而是随着使用扩展)。
打包应用部署简单、适合做微服务部署、适合持续集成和持续交付、提高开发效率、快速部署。
[root@localhost ~]#setenforce 0
[root@localhost ~]#systemctl disable --now firewalld
[root@localhost yum.repos.d]#yum install -y yum-utils device-mapper-persistent-data lvm2
[root@localhost yum.repos.d]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost yum.repos.d]#yum install -y docker-ce docker-ce-cli containerd.io
#安装docker
[root@localhost yum.repos.d]#systemctl start docker.service #启动并设置开机自启
[root@localhost yum.repos.d]#systemctl enable docker.service
[root@localhost yum.repos.d]#docker version
[root@localhost yum.repos.d]#docker info
搜索镜像
格式:docker search 关键字
获取镜像(下载)
格式:docker pull 仓库名称[:标签]
浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
[root@localhost ~]#vim /etc/docker/daemon.json
添加自己的加速器地址,如下图
[root@localhost ~]#systemctl daemon-reload #重新加载配置
[root@localhost ~]#systemctl restart docker #重启服务
[root@localhost ~]#docker images
------------------------------------------------------------------------------------
#注释:
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;
------------------------------------------------------------------------------------
#镜像下载后存放在 /var/lib/docker
#查看下载的镜像文件信息
cat /var/lib/docker/image/overlay2/repositories.json
格式:docker inspect 镜像ID号/容器ID #根据镜像的唯一标识 ID 号,获取镜像详细信息
[root@localhost ~]#docker inspect 605c77e624dd
添加镜像后,镜像的ID并不会改变
格式:docker tag 名称:[标签] [仓库名/]名称:[新标签]
例:
docker tag nginx:latest nginx:web #为nginx镜像添加web标签
docker tag nginx:latest 仓库名/nginx:web #为镜像添加库标识,方便上传到官方仓库,因为上传镜像时必须指定仓库
docker images | grep nginx
注:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像
格式:
docker rmi 镜像名:标签 #删除指定标签
docker rmi 镜像ID -f #删除指定镜像
docker rmi nginx:web #删除nginx镜像的web标签
docker rmi ac826143758d #删除镜像,该镜像只有单个标签的情况下
docker rmi 55f4b40fe486 -f #删除镜像,镜像有多个标签时需要加-f
docker images #查看本地所有镜像
docker images -q #查看本地有哪些镜像,只显示镜像ID
docker rmi $(docker images -q) -f #批量删除本地所有镜像
将镜像保存为本地文件
将镜像保存到本地文件,实际上就是把镜像打包成一个tar包
格式:docker save -o 存储文件名 存储的镜像
[root@localhost ~]#docker save -o mynginx.tar nginx:latest #打包镜像命名为mynginx.tar存在当前目录下
[root@localhost ~]#ls
将镜像文件导入镜像库中
格式:
docker load < 存出的文件
或者
docker load -i 存出的文件
#主机A通过scp命令将打包好镜像文件传给主机B,主机B将镜像文件导入到docker本地
scp ~/mynginx.tar 192.168.192.15:/root/
#主机B将镜像文件导入到镜像库中
docker load < mynginx.tar 或者 docker load -i mynginx.tar
Docker是什么?能干什么?
Docker是基于go语言开发的开源容器引擎,可以在任何主机上运行容器应用,并且每个容器都是一个轻量级的虚拟机。实现 “一次封装,到处运行” 的目的。
三大核心概念:镜像 容器 仓库。还有一些所用到的操作命令。