(一)Docker---容器介绍,Namespace隔离,cgroup资源限制,管理工具

最后

针对以上面试题,小编已经把面试题+答案整理好了

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

面试专题

image

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

image

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 2. IPC Namespace

  • 3. UTS Namespace

  • 4. PID Namespace

  • 5. Net Namespace:

  • 6. User Namespace

  • 三. Linux control groups资源限制

    • 容器管理工具
    • 1. lxc
  • 2. docker

    • 3. pouch:
  • Docker 的优缺点

  • docker的核心技术

  • docker的依赖技术

什么是容器


容器是一种工具,指的是可以装下其它物品的工具,以方便人类归纳放置物品、存储和异地运输,具体来说比如人类使用的衣柜、行李箱、背包

可以成为容器,但今天我们所说的容器是一种 IT 技术。

容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术,容器技术提高了硬件资源利用率、方便了企业的业务快速横向扩容、实现了业务宕机自愈功能,因此未来数年会是一个容器愈发流行的时代,这是一个对于IT 行业来说非常有影响和价值的技术

容器技术最早出现在 freebsd 叫做 jail

一. Docker 简介

===============================================================================

首先 Docker 是一个在 2013 年开源的应用程序并且是一个基于 go 语言编写是一个开源的 pass 服务(Platform as a Service,平台即服务的缩写),

Docker 是基于 linux 内核实现,Docker 最早采用 LXC 技术(LinuX Container 的简写,LXC 是 Linux 原生支持的容器技术,可以提供轻量级的虚拟化,可以说 docker 就是基于 LXC 发展起来的,提供 LXC 的高级封装,发展标准的配置方法)

虚拟化技术 KVM(Kernel-based Virtual Machine) 基于模块实现,Docker 后改为自己研发并开源的 runc 技术运行容器。

Docker 相比虚拟机的交付速度更快,资源消耗更低,Docker 采用客户端/服务端架构,使用远程 API 来管理和创建 Docker 容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,

docker 的三大理念是 build(构建)、ship(运输)、 run(运行),Docker 遵从 apache 2.0 协议,并通过(namespace 及cgroup 等)来提供容器的资源隔离与安全保障等,所以 Docke 容器在运行时不需要类似虚拟机(空运行的虚拟机占用物理机 6-8%性能)的额外资源开销,因此可以大幅提高资源利用率,

Docker 是一种用了新颖方式实现的轻量级虚拟机.类似于 VM 但是在原理和应用上和 VM 的差别还是很大的,并且 docker的专业叫法是应用容器(Application Container)。

Docker 的组成


https://docs.docker.com/engine/docker-overview/

Docker 主机(Host):一个物理机或虚拟机,用于运行 Docker 服务进程和容器。

Docker 服务端(Server):Docker 守护进程,运行 docker 容器。

Docker 客户端(Client):客户端使用 docker 命令或其他工具调用 docker API。

Docker 仓库(Registry): 保存镜像的仓库,类似于 git 或 svn 这样的版本控制系

Docker 镜像(Images):镜像可以理解为创建实例使用的模板。

Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务。

官方仓库: https://hub.docker.com/

在这里插入图片描述

Docker 对比虚拟机


资源利用率更高一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机。

开销更小:不需要启动单独的虚拟机占用硬件资源。

启动速度更快:可以在数秒内完成启动

在这里插入图片描述

在这里插入图片描述

使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操作系统的虚拟机,但是通常一个虚拟机只运行一个服务,很明显资源利用率比较低且造成不必要的性能损耗,我们创建虚拟机的

目的是为了运行应用程序,比如 Nginx、PHP、Tomcat 等 web 程序,使用虚拟机无疑带来了一些不必要的资源开销,但是容器技术则基于减少中间运行环节带来较大的性能提升

在这里插入图片描述

但是,如上图一个宿主机运行了 N 个容器,多个容器带来的以下问题怎么解决:

  1. 怎么样保证每个容器都有不同的文件系统并且能互不影响

  2. 一个 docker 主进程内的各个容器都是其子进程,那么实现同一个主进程下不同类型的子进程?各个进程间通信能相互访问(内存数据)吗?

  3. 每个容器怎么解决 IP 及端口分配的问题?

  4. 多个容器的主机名能一样吗?

  5. 每个容器都要不要有 root 用户?怎么解决账户重名问题?

二. Linux Namespace 隔离技术

==========================================================================================

namespace 是 Linux 系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个 docker 容器运行在同一个 docker 主进程并且共用同一个宿主机系统内核,各docker 容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,主要通过以下技术实现容器运行空间的相互隔离

在这里插入图片描述

1. MNT Namespace

每个容器都要有独立的根文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是 ubuntu 的服务器,可以在里面启动一个 centos 运行环境的容器并且在容器里面启动一个 Nginx 服务,此 Nginx运行时使用的运行环境就是 centos 系统目录的运行环境,但是在容器里面是不能访问宿主机的资源,宿主机是使用了 chroot 技术把容器锁定到一个指定的运行目录里面。

例如:/var/lib/containerd/io.containerd.runtime.v1.linux/moby/容器 ID

启动三个容器用于以下验证过程

在这里插入图片描述

Debian 系统安装基础命令

在这里插入图片描述

验证容器的根文件系统

在这里插入图片描述

2. IPC Namespace

一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问,但是不能夸容器访问其他容器的数据

3. UTS Namespace

UTS namespace(UNIX Timesharing System 包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识,其中包含了 hostname 和域名domainname ,它使得一个容器拥有属于自己 hostname 标识,这个主机名标识独立于宿主机系统和其上的其他容器

在这里插入图片描述

4. PID Namespace

Linux 系统中,有一个 PID 为 1 的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通 PID namespace 进程隔离(比如 PID 编号重复、器内的主进程生成与回收子进程等)。

例如:下图是在一个容器内使用 top 命令看到的 PID 为 1 的进程是 nginx:

在这里插入图片描述

容器内的 Nginx 主进程与工作进程

在这里插入图片描述

那么宿主机的 PID 究竟与容器内的 PID 是什么关系?

容器 PID 追踪

查看宿主机上的 PID 信息

在这里插入图片描述

查看容器中的 PID 信息

在这里插入图片描述

5. Net Namespace:

每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP 协议栈等,

Docker 使用 network namespace 启动一个 vethX 接口,这样你的容器将拥有它自己的桥接 ip 地址,通常是 docker0,而 docker0 实质就是 Linux 的虚拟网桥,网桥是在 OSI 七层模型数据链路层的网络设备,通过 mac 地址对网络进行划分,并且在不同网络直接传递数据

查看宿主机的网卡信息

容器的网卡

在这里插入图片描述

查看宿主机桥接设备

通过 brctl show 命令查看桥接设备:需要安装包bridge-utlis

在这里插入图片描述

在这里插入图片描述

逻辑网络图

容器的网络接口与宿主机的一一对应

在这里插入图片描述

宿主机 iptables 规则

在这里插入图片描述

在这里插入图片描述

6. User Namespace

各个容器内可能会出现重名的用户和用户组名称,或重复的用户 UID 或者GID,那么怎么隔离各个容器内的用户空间呢?

User Namespace 允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户 UID 和 GID,只是会把用户的作用范围限制在每个容器内,即 A 容器和 B 容器可以有相同的用户名称和 ID 的账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离、互不影响、永不相见

在这里插入图片描述

三. Linux control groups资源限制

==============================================================================================

在一个容器,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码 bug 程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等,Linux Cgroups 的全称是 Linux Control Groups,它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作

验证系统 cgroups

Cgroups 在内核层默认已经开启,从 centos 和 ubuntu 对比结果来看,显然内核较新的 ubuntu 支持的功能更多

centos 7.6 cgroups

在这里插入图片描述

ubuntu cgroups

在这里插入图片描述

cgroups 具体实现

blkio:块设备 IO 限制。

cpu:使用调度程序为 cgroup 任务提供 cpu 的访问。

cpuacct:产生 cgroup 任务的 cpu 资源报告。

cpuset:如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存

devices:允许或拒绝 cgroup 任务对设备的访问。

freezer:暂停和恢复 cgroup 任务。

memory:设置每个 cgroup 的内存限制以及产生内存资源报告。

net_cls:标记每个网络包以供 cgroup 方便使用。

ns:命名空间子系统。

perf_event:增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所

有线程以及运行在特定 CPU 上的线程

查看系统 cgroups

ll /sys/fs/cgroup/

total 0

drwxr-xr-x 5 root root 0 Jun 30 18:12 blkio

lrwxrwxrwx 1 root root 11 Jun 30 18:12 cpu -> cpu,cpuacct

lrwxrwxrwx 1 root root 11 Jun 30 18:12 cpuacct -> cpu,cpuacct

drwxr-xr-x 5 root root 0 Jun 30 18:12 cpu,cpuacct

drwxr-xr-x 3 root root 0 Jun 30 18:12 cpuset

drwxr-xr-x 5 root root 0 Jun 30 18:12 devices

drwxr-xr-x 3 root root 0 Jun 30 18:12 freezer

drwxr-xr-x 3 root root 0 Jun 30 18:12 hugetlb

drwxr-xr-x 5 root root 0 Jun 30 18:12 memory

drwxr-xr-x 3 root root 0 Jun 30 18:12 net_cls

drwxr-xr-x 3 root root 0 Jun 30 18:12 perf_event

drwxr-xr-x 5 root root 0 Jun 30 18:12 systemd

有了以上的 chroot、namespace、cgroups 就具备了基础的容器运行环境,但是还需要有相应的容器创建与删除的管理工具、以及怎么样把容器运行起来、容器数据怎么处理、怎么进行启动与关闭等问题需要解决,于是容器管理技术出现了

容器管理工具


目前主要是使用 docker,早期有使用 lxc

1. lxc

LXC:LXC 为 Linux Container 的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,官方网站:https://linuxcontainers.org/

Ubuntu 安装 lxc:

lxc客户端

lxd服务端

root@s1:~# apt install lxc lxd

Reading package lists… Done

Building dependency tree

Reading state information… Done

lxd is already the newest version (3.0.3-0ubuntu1~18.04.1).

lxc is already the newest version (3.0.3-0ubuntu1~18.04.1).

root@s1:~# lxc-checkconfig #检查内核对 lcx 的支持状况,必须全部为 lcx

root@s1:~# lxc-create -t 模板名称 -n lcx-test

root@s1:~# lxc-create -t download --name alpine12 – --dist alpine –

release 3.9 --arch amd64

Setting up the GPG keyring

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

h amd64

Setting up the GPG keyring

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

[外链图片转存中…(img-ru0D6N6A-1715722162034)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值