本文目录导读:
《容器技术全解析:概念、架构、原理、工具与使用方法》
图片来源于网络,如有侵权联系删除
容器技术的概念
容器技术是一种轻量级的操作系统级虚拟化技术,它将应用程序及其依赖项打包成一个独立的、可移植的容器单元,使得应用程序可以在不同的计算环境中快速、一致地运行,与传统的虚拟机相比,容器共享宿主机的操作系统内核,不需要为每个容器单独安装操作系统,从而大大减少了资源开销。
一个基于Python开发的Web应用,它依赖于特定版本的Python库、Web服务器软件等,通过容器技术,可以将这个Web应用及其所有依赖项打包成一个容器,这个容器就像是一个独立的小盒子,里面包含了运行该应用所需的一切,并且可以在任何支持容器运行时的环境(如开发人员的本地机器、测试服务器、生产服务器等)中运行,而不用担心环境差异导致的兼容性问题。
容器技术的架构
1、镜像层(Image Layer)
- 容器镜像是容器技术的核心组成部分,它是一个只读的模板,包含了运行容器所需的文件系统、应用程序代码、运行时环境、系统工具等,镜像由多个层组成,每个层代表了一次对镜像的修改或添加操作,基础操作系统层、安装应用依赖库的层、部署应用代码的层等,这种分层结构的好处是可以有效地复用镜像层,当多个容器基于相同的基础镜像构建时,它们可以共享这些基础层,减少磁盘空间占用和镜像下载时间。
2、容器层(Container Layer)
- 容器是基于镜像创建的可运行实例,当创建一个容器时,会在镜像的基础上添加一个可写的容器层,这个容器层用于存储容器运行过程中产生的数据,如日志文件、应用程序运行时产生的临时文件等,容器层与镜像层是分离的,这样可以保证容器的可移植性,当容器被删除时,容器层的数据也会被删除,而镜像层仍然保留,方便下次创建相同或类似的容器。
3、容器运行时(Container Runtime)
- 容器运行时负责管理容器的生命周期,包括创建、启动、停止、删除容器等操作,常见的容器运行时有Docker Engine、rkt等,容器运行时与操作系统内核进行交互,为容器提供隔离的运行环境,它利用内核的命名空间(Namespace)和控制组(cgroup)等特性来实现容器之间的资源隔离和限制,通过命名空间技术,可以将容器的进程、网络、文件系统等资源与宿主机和其他容器隔离开来,使得每个容器都感觉自己是在一个独立的系统中运行;而控制组则可以对容器使用的CPU、内存、磁盘I/O等资源进行限制和分配,防止某个容器过度占用资源而影响其他容器或宿主机的性能。
容器技术的原理
1、命名空间(Namespace)
- 命名空间是Linux内核提供的一种资源隔离机制,在容器技术中,主要使用了以下几种命名空间:
PID命名空间:用于隔离进程ID,在一个PID命名空间内,进程ID是独立的,容器内的进程ID与宿主机和其他容器内的进程ID不会冲突,容器内的第一个进程(通常是init进程)在容器的PID命名空间内的ID为1,而在宿主机的PID命名空间内可能是一个较大的数字。
网络命名空间:隔离网络资源,每个容器可以有自己独立的网络配置,如IP地址、网络接口、路由表等,这使得容器可以像独立的主机一样进行网络通信,并且不会干扰宿主机和其他容器的网络,可以为一个容器分配一个私有IP地址,使其只能与特定的容器或网络进行通信。
文件系统命名空间:提供文件系统的隔离,容器有自己独立的根文件系统(rootfs),它是基于镜像构建的,容器内的文件系统操作只影响容器内部的文件系统,不会影响宿主机的文件系统,容器内可以创建、删除文件,而这些操作不会对宿主机的文件系统造成直接影响。
UTS命名空间:用于隔离主机名和域名,每个容器可以有自己独立的主机名和域名,这有助于在多容器环境中区分不同的容器。
2、控制组(cgroup)
- cgroup主要用于对容器使用的资源进行限制和统计,它可以限制容器使用的CPU、内存、磁盘I/O等资源,可以设置一个容器最多只能使用宿主机10%的CPU资源或者512MB的内存,通过cgroup,还可以对容器使用资源的情况进行监控和统计,如查看一个容器在一段时间内使用了多少CPU时间、多少内存等,这有助于在多容器共享资源的环境中,合理分配资源,确保系统的稳定性和性能。
容器技术的必要工具及使用方法
(一)Docker
1、安装
- 在不同的操作系统上安装Docker的方法有所不同。
在Ubuntu系统上:
- 首先更新系统的包索引:sudo apt - get update
。
- 然后安装Docker的依赖包:sudo apt - get install apt - transport - https ca - certificates curl software - properties - common
。
- 添加Docker的官方GPG密钥:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt - key add
。
- 将Docker的仓库添加到系统的源列表中:sudo add - apt - repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release - cs) stable"
。
- 最后安装Docker CE(社区版):sudo apt - get install docker - ce
。
在CentOS系统上:
- 首先安装yum - utils包:sudo yum install -y yum - utils
。
- 设置Docker的仓库:sudo yum - config - manager --add - repo https://download.docker.com/linux/centos/docker - ce.repo
。
图片来源于网络,如有侵权联系删除
- 安装Docker CE:sudo yum install docker - ce
。
- 安装完成后,可以通过docker version
命令来检查Docker是否安装成功,并查看Docker的版本信息。
2、镜像操作
拉取镜像(Pull Image):
- 可以使用docker pull
命令从Docker Hub(官方镜像仓库)或其他私有镜像仓库拉取镜像,要拉取官方的Ubuntu 18.04镜像,可以执行docker pull ubuntu:18.04
,这里的ubuntu
是镜像的名称,18.04
是镜像的标签,表示特定版本的Ubuntu镜像。
查看本地镜像(List Images):
- 使用docker images
命令可以查看本地已经下载的镜像,它会显示镜像的名称、标签、镜像ID、创建时间和大小等信息。
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 275d79972a86 2 weeks ago 64.2MB
删除镜像(Remove Image):
- 如果要删除本地的镜像,可以使用docker rmi
命令,要删除之前拉取的Ubuntu 18.04镜像(假设没有容器基于该镜像运行),可以执行docker rmi ubuntu:18.04
。
3、容器操作
创建容器(Create Container):
- 可以使用docker create
命令创建一个容器,要创建一个基于Ubuntu 18.04镜像的容器,可以执行docker create -it ubuntu:18.04
,这里的-it
参数表示以交互模式(interactive)和伪终端(tty)的方式创建容器,创建容器后,可以使用docker ps -a
命令查看所有的容器(包括已经停止的容器),会看到新创建的容器处于“Created”状态。
启动容器(Start Container):
- 使用docker start
命令启动已经创建的容器,如果之前创建的容器ID是abc123
,可以执行docker start abc123
,启动容器后,可以使用docker ps
命令查看正在运行的容器。
进入容器(Attach to Container):
- 当容器以交互模式启动后,可以使用docker attach
命令进入容器的交互终端,对于正在运行的容器abc123
,执行docker attach abc123
后,就可以在容器内部执行命令,就像在一个普通的Ubuntu系统中一样,也可以使用docker exec -it
命令在容器运行时进入容器并执行命令,这种方式更加灵活,不需要先使用docker attach
。docker exec -it abc123 bash
可以进入容器并启动一个bash shell。
停止容器(Stop Container):
- 使用docker stop
命令停止正在运行的容器。docker stop abc123
会向容器发送一个SIGTERM信号,容器在接收到信号后会正常关闭,如果容器在一段时间内没有停止,可以使用docker kill
命令强制停止容器,docker kill
命令会发送一个SIGKILL信号给容器。
删除容器(Remove Container):
- 可以使用docker rm
命令删除已经停止的容器。docker rm abc123
会删除容器及其相关的资源(容器层的数据等),如果要删除正在运行的容器,需要先停止容器再删除,也可以使用docker rm -f
命令强制删除容器,即使容器正在运行。
(二)Kubernetes
1、概念与架构
- Kubernetes(简称K8s)是一个开源的容器编排平台,用于管理容器化应用的部署、扩展和运维。
Master节点组件:
API Server:它是Kubernetes集群的前端接口,所有的资源操作(如创建、读取、更新、删除Pod、Service等资源)都要通过API Server进行,它负责验证和处理API请求,并将请求转发到相应的组件进行处理。
etcd:这是一个分布式键值存储系统,用于存储Kubernetes集群的所有配置数据和状态信息,Pod的定义、Service的信息、节点的状态等都存储在etcd中。
Controller Manager:包含多个控制器,如ReplicaSet控制器、Deployment控制器等,这些控制器负责监控集群的状态,并根据预定义的规则进行资源的管理和调整,ReplicaSet控制器会确保指定数量的Pod副本在集群中运行,如果某个Pod副本意外终止,它会自动创建一个新的Pod来维持副本数量。
Scheduler:负责将Pod调度到合适的节点上运行,它会根据节点的资源状况(如CPU、内存空闲情况)、节点的标签(如节点的角色、地理位置等标签)等因素来选择最合适的节点。
图片来源于网络,如有侵权联系删除
Node节点组件:
kubelet:运行在每个Node节点上,它负责与Master节点通信,接收Master节点发送的Pod创建、更新、删除等指令,并在本地节点上执行这些操作,它还负责监控容器的运行状态,并向Master节点报告。
kube - proxy:主要负责实现Kubernetes集群内的服务发现和负载均衡,它会在每个Node节点上监听Service的变化,并根据Service的定义来设置网络规则,使得集群内的Pod可以通过Service的虚拟IP(VIP)访问到对应的后端Pod。
容器运行时(如Docker):在Node节点上运行容器,Kubernetes支持多种容器运行时,其中Docker是最常用的一种,容器运行时负责实际创建、启动、停止和删除容器。
2、使用方法
安装Kubernetes:
- 可以使用多种方式安装Kubernetes,如使用kubeadm工具进行快速安装。
- 在所有节点(Master节点和Node节点)上安装必要的软件包,如apt - get install -y apt - transport - https ca - certificates curl
(在Ubuntu系统上)。
- 添加Kubernetes的官方GPG密钥和仓库,如curl -s https://packages.cloud.google.com/apt/doc/apt - key.gpg | apt - key add
和echo "deb https://apt.kubernetes.io/ kubernetes - x86_64 main" | tee /etc/apt/sources.list.d/kubernetes.list
(在Ubuntu系统上)。
- 安装kubeadm、kubelet和kubectl等核心组件,如apt - get install -y kubeadm kubelet kubectl
。
- 在Master节点上初始化Kubernetes集群,执行kubeadm init --pod - network - cidr = 10.244.0.0/16
(这里指定了Pod网络的CIDR范围)。
- 在Node节点上加入集群,通过在Node节点上执行kubeadm join
命令,并传入Master节点生成的加入令牌(token)和相关参数。
创建和管理Pod:
定义Pod:可以使用YAML文件来定义Pod的配置,下面是一个简单的Pod定义文件pod - example.yaml
:
apiVersion: v1 kind: Pod metadata: name: my - pod spec: containers: - name: my - container image: ubuntu:18.04 command: ["sleep", "3600"]
- 在这个定义中,apiVersion
表示Kubernetes API的版本,kind
表示资源的类型(这里是Pod),metadata
包含了Pod的元数据(如名称),spec
定义了Pod的具体规格,包括容器的信息(名称、镜像、启动命令等)。
创建Pod:可以使用kubectl create -f pod - example.yaml
命令根据上述YAML文件创建一个Pod。
查看Pod状态:使用kubectl get pods
命令可以查看集群中所有Pod的状态。
NAME READY STATUS RESTARTS AGE my - pod 1/1 Running 0 10s
删除Pod:使用kubectl delete -f pod - example.yaml
命令可以删除之前创建的Pod。
创建和管理Service:
定义Service:同样使用YAML文件来定义Service,下面是一个创建ClusterIP类型Service的YAML文件service - example.yaml
:
apiVersion: v1 kind: Service metadata: name: my - service spec: type: ClusterIP selector: app: my - app ports: - protocol: TCP port: 80 targetPort: 8080
- 在这个定义中,type
指定了Service的类型(这里是ClusterIP,表示在集群内部可访问的虚拟IP服务),selector
用于选择哪些Pod属于这个Service(这里选择带有app: my - app
标签的Pod),ports
定义了Service的端口映射(将Service的80端口映射到后端Pod的8080端口)。
创建Service:使用kubectl create -f service - example.yaml
命令创建Service。
查看Service:使用kubectl get services
命令查看集群中的Service。
NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE my - service ClusterIP 10.96.179.132 <none> 80/TCP 5s
访问Service:在集群内部的Pod可以通过Service的ClusterIP和端口来访问对应的后端Pod,在另一个Pod中,可以使用curl 10.96.179.132:80
来访问my - service
对应的后端Pod。
容器技术以其高效、灵活和可移植的特性,在现代软件开发和运维中发挥着越来越重要的作用,通过掌握容器技术的概念、架构、原理以及相关工具的使用方法,开发人员和运维人员能够更好地构建、部署和管理应用程序,提高应用的交付速度和质量,同时降低系统的运维成本。
评论列表