为了资源高效利用,计算机行业发展了很多技术。
从早期的物理机到虚拟机,然后再到容器技术;以及 CPU 从单任务到多任务,然后到多核处理器,主要就是在解决资源共享问题,以及资源共享后衍生出来的安全问题、性能损耗问题以及资源隔离问题。
在20世纪60年年代,虚拟化的概念就已经产生。1961年 IBM709 机实现了分时系统,将 CPU 占用切分为多个极短(1/100sec)时间片,每一个时间片都执行着不同的任务。通过对这些时间片的轮询,这样就可以高效利用单个CPU。
主流的虚拟化技术及软件,常见有:MWare workstation(VMWare)、VirtualBox(Oracle)、Hyper-V(Microsoft)、KVM(Redhat)、Xen、OpenStack等。
虚拟机目的都是在一台强性能的物理机上虚拟出多个互相之间完全独立的虚拟机。主要优势就是能大大提升物理资源利用率的同时,又能将不同的应用完全独立开来,能够进行资源的隔离,资源的共享。但缺点也比较明显,就是在进行虚拟化的同时会消耗大量的资源,这部分资源的消耗并没有产生任何业务价值。而容器技术刚好能够解决虚拟机的这个问题。
Docker 软件即服务产品由三个组件组成:
软件: Docker守护进程,称为dockerd,是一个管理 Docker 容器并处理容器对象的持久进程。该守护进程侦听通过 Docker 引擎 API 发送的请求。Docker 客户端程序,称为docker,提供了一个命令行界面(CLI),允许用户与 Docker 守护进程交互。
对象: Docker 对象是用于在 Docker 中组装应用程序的各种实体。Docker 对象的主要类别是镜像、容器和服务。
注册表: Docker 注册表是 Docker 镜像的存储库。Docker 客户端连接到注册表以下载(“拉取”)图像以供使用或上传(“推送”)它们已构建的图像。注册表可以是公共的或私有的。主要的公共注册表是 Docker Hub。Docker Hub 是 Docker 查找镜像的默认注册表。Docker 注册表还允许基于事件创建通知。
Docker Compose是一个用于定义和运行多容器 Docker 应用程序的工具。它使用YAML文件来配置应用程序的服务,并使用单个命令执行所有容器的创建和启动过程。CLIdocker-compose实用程序允许用户同时在多个容器上运行命令,例如构建映像、扩展容器、运行已停止的容器等。与图像操作或用户交互选项相关的命令与 Docker Compose 无关,因为它们针对的是一个容器。 docker -compose.yml文件用于定义应用程序的服务并包含各种配置选项。例如,该build选项定义了 Dockerfile 路径等配置选项,该command选项允许覆盖默认的 Docker 命令等等。Docker Compose 的第一个公开测试版(版本 0.0.1)于 2013 年 12 月 21 日发布。第一个生产就绪版本(1.0)于 2014 年 10 月 16 日发布。
Docker Swarm为 Docker 容器提供原生集群功能,将一组 Docker 引擎转变为单个虚拟 Docker 引擎。在 Docker 1.12 及更高版本中,Swarm 模式与 Docker Engine 集成。CLI 实用程序允许用户运行 Swarm 容器、创建发现令牌、列出集群中的节点等等docker swarm。CLI实用程序允许用户运行各种命令来管理群中的节点,例如列出群中的节点、更新节点以及从群中删除节点。Docker 使用Raft共识管理集群docker node 算法。根据 Raft 的说法,要执行更新,大多数 Swarm 节点需要就更新达成一致。
Docker Volume有利于数据的独立持久化,即使容器被删除或重新创建后,数据仍然保留。
支持容器技术的底层技术主要有 Cgroup、Namespace、UnionFS。
Linux CGroup 全称 Linux Control Group, 是 Linux 内核的一个功能,用来限制,控制与分离一个进程组群的资源(如 CPU、内存、磁盘输入输出等)。这个项目最早是由 Google 的工程师在2006年发起(主要是 Paul Menage 和 Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在 Linux 内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为 cgroup,并且被合并到2.6.24版的内核中去。
Linux CGroup 为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。您可以监控您配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置您的 cgroup。
主要提供了如下功能:
使用 cgroup,系统管理员可更具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。可更好地根据任务和用户分配硬件资源,提高总体效率。
Linux 的 Cgroup 具有不同功能的子系统:
Linux Namespaces机制提供一种资源隔离方案。PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都是透明的。要创建新的Namespace,只需要在调用clone时指定相应的flag。Linux Namespaces机制为实现基于容器的虚拟化技术提供了很好的基础,LXC(Linux containers)就是利用这一特性实现了资源的隔离。不同container内的进程属于不同的Namespace,彼此透明,互不干扰。
Linux 中使用多种 Namespace 进行系统资源的管理,目前支持:
分类 | 系统调用参数 | 相关内核版本 | 描述 |
---|---|---|---|
Mount namespaces | CLONE_NEWNS | Linux 2.4.19 | 隔离文件系统挂载点 |
UTS namespaces | CLONE_NEWUTS | Linux 2.6.19 | 隔离主机名和域名信息 |
IPC namespaces | CLONE_NEWIPC | Linux 2.6.19 | 隔离进程间通信 |
PID namespaces | CLONE_NEWPID | Linux 2.6.24 | 隔离进程的ID |
Network namespaces | CLONE_NEWNET | 始于Linux 2.6.24 完成于 Linux 2.6.29 | 隔离网络资源 |
User namespaces | CLONE_NEWUSER | 始于 Linux 2.6.23 完成于 Linux 3.8 | 隔离用户和用户组的ID |
UnionFS 是一种为 Linux,FreeBSD 和 NetBSD 操作系统设计的把其他文件系统联合到一个联合挂载点的文件系统服务。它使用 branch 把不同文件系统的文件和目录“透明地”覆盖,形成一个单一一致的文件系统。这些 branches 或者是 read-only 或者是 read-write 的,所以当对这个虚拟后的联合文件系统进行写操作的时候,系统是真正写到了一个新的文件中。看起来这个虚拟后的联合文件系统是可以对任何文件进行操作的,但是其实它并没有改变原来的文件,这是因为 unionfs 用到了一个重要的资管管理技术叫写时复制。
写时复制(copy-on-write,简称 CoW ),也叫隐式共享,是一种对可修改资源实现高效复制的资源管理技术。它的思想是,如果一个资源是重复的,但没有任何修改,这时候并不需要立即创建一个新的资源;这个资源可以被新旧实例共享。创建新资源发生在第一次写操作,也就是对资源进行修改的时候。通过这种资源共享的方式,可以显著地减少未修改资源复制带来的消耗,但是也会在进行资源修改的时候增减小部分的开销。
Docker 分为客户端和服务端两部分, docker 为客户端调用的命令, dockerd 为服务端调用的命令。
命令 | 描述 |
---|---|
info | 显示 Docker 详细的系统信息 |
version | 显示docker客户端和服务端版本信息 |
inspect | 查看容器或镜像的配置信息, 默认为json数据 |
events | 实时打印服务端执行的事件 |
docker search: 查找镜像
docker pull: 获取镜像
docker push: 推送镜像到仓库
docker login: 登录第三方仓库
docker logout: 退出第三方仓库
Docker 分为 Community Edition (CE) 和 Enterprise Edition (EE) 两个版本。
Docker Community Edition (CE) 又分为 Stable / Test / Nightly 三个版本。
2017 之前,docker的版本
Docker V1.7
Docker V1.8
Docker V1.9
Docker V1.10
Docker V1.11
Docker V1.12
Docker V1.13
2017 年 3月1号后,docker 的版本命名发生变化。
同时将将 docker 分为 DockerCE 版本与 DockerEE。
Docker 社区版(Docker CE):开源调度版本
Docker CE 17.03
Docker CE 17.09
Docker CE 18.03
Docker CE 18.08
Docker CE 19.03
Docker CE 19.09
Docker CE 20.03
Docker CE 20.09
Docker CE 21.03
Docker 企业版(Docker EE):提供企业服务支持
https://docs.docker.com/install/
docker import ubuntu-2004-arm-dds.tar u20:dds
1.停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)
如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)
2.查看当前有些什么images
docker images
3.删除images,通过image的id来指定删除谁
docker rmi
想要删除untagged images,也就是那些id为的image的话可以用
docker rmi $(docker images | grep “^” | awk “{print $3}”)
要删除全部image的话
docker rmi $(docker images -q)
docker inspect u20:dds | grep -i 'architecture'
#下载qemu-aarch64-static
wget https://github.com/multiarch/qemu-user-static/releases/download/v5.1.0-5/qemu-aarch64-static.tar.gz
#解压
tar xzvf qemu-aarch64-static.tar.gz
#配置可执行文件路径
sudo cp qemu-aarch64-static /usr/bin/
chmod +x /usr/bin/qemu-aarch64-static
单次运行
#x86环境运行一个arm镜像,将本地qemu-aarch64-static映射到容器内
docker run -it -v /home/bot/worth/qemu-aarch64-static:/usr/bin/qemu-aarch64-static u20:dds bash
一直运行
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker run -it -v .:/opt/worth u20:dds /bin/bash
1、wiki–Docker
2、Docker 公司
3、Docker 发展历史
4、Docker 文档–zhaowenyu
5、Docker常用命令大全(万字详解)
6、Docker的历史
7、Docker 入门教程–阮一峰
8、x86环境打包和运行arm镜像
9、【docker】x86主机在docker中运行arm64镜像