全方位讲解Docker

本文深入探讨了Docker虚拟化技术,包括半虚拟化与完全虚拟化的区别,Docker与VMware的对比,以及Docker的核心特点。内容涵盖了Docker镜像的分层原理、Docker与LXC、runc的关系,以及Docker网络模式和文件系统。此外,还介绍了Docker常用命令、资源限制和容器技术比较,如Podman和Rocket,并分享了一个Docker内存告警的故障案例分析。
摘要由CSDN通过智能技术生成

1.虚拟化技术简介
1.1完全拟化技术
实际上是通过软件实现对操作系统的资源再分配,比较成熟,例如我们的KVM、VirtualBOX;VM等;
特点:实现内核隔离;即虚拟出来的操作系统内核和宿主机可以不一样;支持跨平台创建虚拟机。
1.2 半虚拟化技术
半虚拟化技术则是通过代码修改已有的系统,形成一种新的可虚拟化的系统,调用硬件资源去安装多个系统,整体速度上相对高一点,代表产品有Docker 、podman。
特点:与宿主机共享内核;无法实现跨平台资源创建
问题:怎么理解docker 是一种半虚拟化技术?
docker exec -it test /bin/bash
uname -a查看发现容器内核版本和操作系统版本内核一样。
1.3 vmware和docker比较

在这里插入图片描述
在这里插入图片描述

1.4 Docker虚拟化特点

操作启动快
轻量级虚拟化
开源免费
1.5 docker优势
更快速的交付和部署
高效的部署和扩容
更高的资源利用率

2.Docker实现原理
2.1 Docker的本质
docker容器本质上是宿主机的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
容器是一个“单进程”模型。由于一个容器的本质就是一个进程,用户的应用进程实际上就是容器里 PID=1 的进程,也是其他后续创建的所有进程的父进程。这就意味着,在一个容器中,你没办法同时运行两个不同的应用一个docker容器只跑一个进程;容器里是可以跑多个进程的,但是官方不推荐这样做,而且给我的感觉是极不推荐,因为在制作docker镜像的时候,直接使用run命令或者cmd命令,都无法启动多个进程,必须运行shell脚本,在shell脚本中的命令后面使用&,表示后台运行,这样可以运行多个进程,但值得注意的是,最后一个命令不能加&,因为这样会导致docker中检测不到运行的进程,从而导致k8s创建pod失败。
不是只能跑一个进程,而是建议最好只跑这一个进程,这是最佳实践,不是必须的。
所以,若想跑多个进程,就要解决这个进程管理的问题,可以使用supervisor管理容器的进程。
说明:
1.容器需要有一个前台运行的进程才能保持容器的运行;容器启动后,如果容器内没有前台运行的进程,将自动退出停止。
2.程序在容器内要前台运行,容器在宿主机内要后台运行。

2.2 Docker常见组件

Docker虚拟化有三个组件,分别镜像、容器、仓库。
镜像:Docker的镜像其实就是模板,跟我们常见的ISO镜像类似,是一个样板。
容器:使用镜像常见的应用或者系统,我们称之为一个容器。
仓库:仓库是存放镜像的地方,分为公开仓库(Public)和私有仓库(Private)两种形式。
常用的docker仓库有Harbor和registry、nexus三种
2.3 Docker引擎架构
docker引擎是一个C/S结构的应用,组件如图所示:
在这里插入图片描述

Server是一个常驻进程;
REST API 实现了client和server间的交互协议;
CLI 实现容器和镜像的管理,为用户提供统一的操作界面。
Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群。

Dockerd守护进程启动选项
-H tcp://host:port
unix:///path/to/socket,

类似于mysql,docker也可以使用ip+port方式登录。
2.4 Docker镜像原理
(docker history aaca1ab3bbe6)

一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker容器运行过程中主要提供文件系统数据支撑。Docker镜像作为docker中最基本的概念,有以下几个特性:
镜像分层,每个镜像都由一个或多个镜像层组成;可通过在某个镜像加上一定的镜像层得到新镜像(此过程可通过编写dockerfile或基于容器Commit实现);
每个镜像层拥有唯一镜像ID;
镜像在存储和使用时共享相同的镜像层(根据ID),所以在pull镜像时,已有的镜像层会自动跳过下载;
底层镜像都是只读,即使启动成容器,也无法对其真正的修改,最上层的容器层可以修改;
在这里插入图片描述

Docker 在镜像的设计中,引入了层(layer)的概念。也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量 rootfs。当然,这个想法不是凭空臆造出来的,而是用到了一种叫作联合文件系统(Union File System)的能力。Union File System 也叫 UnionFS,最主要的功能是将多个不同位置的目录联合挂载(union mount)到同一个目录下
在这里插入图片描述

这些修改往往只对当前的容器有效,我们并不希望执行 docker commit 时,把这些信息连同可读写层一起提交掉。所以,Docker 做法是,在修改了这些文件之后,以一个单独的层挂载了出来。而用户执行 docker commit 只会提交可读写层,所以是不包含这些内容的。最终,这 7 个层都被联合挂载到 /var/lib/docker/aufs/mnt 目录下,表现为一个完整的 Ubuntu 操作系统供容器使用。
 镜像里面是没有内核的,镜像在被启动为容器后将直接使用宿主机的内核,而镜像本身则只提供相应的rootfs,即系统正常运行所必须的用户空间的文件系统,比如: /dev/,/proc,/bin,/etc等目录,容器当中/boot目录是空的,而/boot当中保存的就是与内核相关的文件和目录。

问题:
1.dockerfile 制作镜像的时候为什么合并指令?
每个指令的执行会生成一个新的镜像层,为了减少分层和镜像大小,尽可能将多条指令合并成一条指令
2.docker底层其实是一个简版的操作系统

2.5 Docker核心技术
2.5.1 OCI技术规范
Docker设计遵循OCI规范;OCI 由 docker、coreos 以及其他容器相

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈工大-凌梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值