Docker 介绍
- 1 介绍
- 1.1 概述
- 1.2 资源高效利用
- 1.3 发展历程
- 1.4 组件
- 1.5 工具
- 1.6 对环境部署和虚拟化的影响
- 1.7 优点
- 1.8 容器技术核心
- Cgroup
- Namespace
- UnionFS
- 2 命令
- 信息、状态、配置
- info命令用于显示当前系统信息、docker容器、镜像个数、设置等信息
- 镜像
- 容器
- 资源
- 3 安装
- 3.1 版本介绍
- 3.2 官方安装说明
- 3.3 配置文件
- 4 使用
- 加载镜像
- container 处理
- 架构
- 运行arm镜像
- 本地文件夹映射到镜像中
- 参考
1 介绍
1.1 概述
- Docker是一组平台即服务(PaaS) 产品,它使用操作系统级虚拟化以称为容器的包形式交付软件。该服务有免费和高级两种级别。托管容器的软件称为Docker Engine。它于 2013 年首次启动,由Docker, Inc.开发。
- Docker是一种用于在轻量级容器中自动化部署应用程序的工具,使应用程序能够在不同的环境中隔离高效地工作。
- 容器之间相互隔离,并捆绑自己的软件、库和配置文件;他们可以通过明确的渠道相互沟通。由于所有容器共享单个操作系统内核的服务,因此它们使用的资源比虚拟机少。
- Docker 可以将应用程序及其依赖项打包在可以在任何 Linux、Windows 或 macOS 计算机上运行的虚拟容器中。
- 由于 Docker 容器是轻量级的,因此单个服务器或虚拟机可以同时运行多个容器。
- Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
- Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
- Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
- Docker 是一个用于开发,交付和运行应用程序的开放平台。
- Docker 是容器的一种技术实现,常见的容器运行时有:
Containerd (Docker)、cri-o、kata、lxd、lxc、runC - Docker 使得容器技术变得好用,从而普及了容器技术。(容器技术解决了虚拟化本身的损耗问题,但因为难用,很长一段时间没有成为主流。)
1.2 资源高效利用
为了资源高效利用,计算机行业发展了很多技术。
从早期的物理机到虚拟机,然后再到容器技术;以及 CPU 从单任务到多任务,然后到多核处理器,主要就是在解决资源共享问题,以及资源共享后衍生出来的安全问题、性能损耗问题以及资源隔离问题。
在20世纪60年年代,虚拟化的概念就已经产生。1961年 IBM709 机实现了分时系统,将 CPU 占用切分为多个极短(1/100sec)时间片,每一个时间片都执行着不同的任务。通过对这些时间片的轮询,这样就可以高效利用单个CPU。
主流的虚拟化技术及软件,常见有:MWare workstation(VMWare)、VirtualBox(Oracle)、Hyper-V(Microsoft)、KVM(Redhat)、Xen、OpenStack等。
虚拟机目的都是在一台强性能的物理机上虚拟出多个互相之间完全独立的虚拟机。主要优势就是能大大提升物理资源利用率的同时,又能将不同的应用完全独立开来,能够进行资源的隔离,资源的共享。但缺点也比较明显,就是在进行虚拟化的同时会消耗大量的资源,这部分资源的消耗并没有产生任何业务价值。而容器技术刚好能够解决虚拟机的这个问题。
1.3 发展历程
- 2010年,Kamel Founadi、Solomon Hykes 和 Sebastien Pahl 三人创立的项目 DotCloud 获得了创业孵化器 Y Combinator 的支持,并开始吸引到一些真正的投资,在接下来的3年中,dotCloud 内部孵化了一款名为 Docker 的产品。
- 2013 年,Docker在圣克拉拉的PyCon上向公众首次亮相。它于 2013 年 3 月作为开源发布。当时,它使用LXC作为默认执行环境。一年后,随着 0.9 版本的发布,Docker 用自己的组件libcontainer取代了 LXC,该组件是用Go编程语言编写的。
- 2013 年 9 月 19 日:红帽和 Docker 宣布围绕Fedora、红帽企业 Linux (RHEL) 和OpenShift开展合作。
- 2014 年 10 月 15 日:微软宣布将 Docker 引擎集成到Windows Server中,并原生支持 Windows 中的 Docker 客户端角色。
- 2014 年 11 月:宣布为Amazon Elastic Compute Cloud (EC2) 提供 Docker 容器服务。
- 2014 年 11 月 10 日:Docker 宣布与Stratoscale建立合作伙伴关系。
- 2014 年 12 月 4 日:IBM宣布与 Docker 建立战略合作伙伴关系,使 Docker 能够与 IBM Cloud 更紧密地集成。
- 2015 年 6 月 22 日:Docker 和其他几家公司宣布他们正在为软件容器制定一个新的供应商和独立于操作系统的标准。
- 2015 年 12 月:Oracle Cloud在收购 Docker 容器初创公司StackEngine后添加了 Docker 容器支持。
- 2016 年 4 月:独立软件供应商Windocks向 Windows 发布了 Docker 开源项目的端口,支持 Windows Server 2012 R2 和 Server 2016,以及 SQL Server 2008 及以后的所有版本。
- 2016 年 5 月:分析显示以下组织是 Docker 的主要贡献者:Docker 团队、思科、谷歌、华为、IBM、微软和红帽。
- 2016 年 6 月 8 日:微软宣布 Docker 现在可以在Windows 10上原生使用。
- 2017 年 1 月:对LinkedIn个人资料提及的分析显示 Docker 的存在在 2016 年增长了 160%。
- 2017 年 4 月,Docker 公司将 Docker 项目重命名为 Moby。
- 2019 年 5 月 6 日:微软宣布推出第二版Windows Subsystem for Linux (WSL)。Docker, Inc. 宣布已开始开发在 WSL 2 上运行的 Docker for Windows 版本。特别是,这意味着 Docker 可以在 Windows 10 Home 上运行(之前仅限于 Windows Pro 和 Enterprise,因为它使用 Hyper-V)。
- 2020 年 8 月:微软宣布将 WSL2 向后移植到 Windows 10 版本 1903 和 1909(之前 WSL2 仅在版本 2004 上可用),并且 Docker 开发人员宣布 Docker 可用于这些平台。
- 2021 年 8 月:适用于 Windows 和 MacOS 的 Docker Desktop 不再对企业用户免费。Docker 结束了对大型企业客户的免费 Docker Desktop 使用,并将其免费计划替换为个人计划。Linux 发行版上的 Docker 不受影响。
1.4 组件
Docker 软件即服务产品由三个组件组成:
软件: Docker守护进程,称为dockerd,是一个管理 Docker 容器并处理容器对象的持久进程。该守护进程侦听通过 Docker 引擎 API 发送的请求。Docker 客户端程序,称为docker,提供了一个命令行界面(CLI),允许用户与 Docker 守护进程交互。
对象: Docker 对象是用于在 Docker 中组装应用程序的各种实体。Docker 对象的主要类别是镜像、容器和服务。
- Docker 容器是运行应用程序的标准化封装环境。容器是使用 Docker API 或CLI进行管理的。
- Docker 镜像是用于构建容器的只读模板。图像用于存储和传送应用程序。
- Docker 服务允许容器在多个 Docker 守护进程之间进行扩展。结果被称为swarm,一组通过 Docker API 进行通信的协作守护进程。
注册表: Docker 注册表是 Docker 镜像的存储库。Docker 客户端连接到注册表以下载(“拉取”)图像以供使用或上传(“推送”)它们已构建的图像。注册表可以是公共的或私有的。主要的公共注册表是 Docker Hub。Docker Hub 是 Docker 查找镜像的默认注册表。Docker 注册表还允许基于事件创建通知。
1.5 工具
-
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有利于数据的独立持久化,即使容器被删除或重新创建后,数据仍然保留。
1.6 对环境部署和虚拟化的影响
1.7 优点
- 统一开发测试运行环境
Docker 使得不同工程师之间配置统一。
- 更高效的利用系统资源
Docker 在应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。 - 更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。 - 一致的运行环境
Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。 - 持续交付和部署
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。 - 更轻松的迁移
Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。 - 更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
1.8 容器技术核心
支持容器技术的底层技术主要有 Cgroup、Namespace、UnionFS。
Cgroup
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。
主要提供了如下功能:
- Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
- Prioritization: 优先级控制,比如:CPU 利用和磁盘 IO 吞吐。
- Accounting: 一些审计或一些统计,主要目的是为了计费。
- Control: 挂起进程,恢复执行进程。
使用 cgroup,系统管理员可更具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。可更好地根据任务和用户分配硬件资源,提高总体效率。
Linux 的 Cgroup 具有不同功能的子系统:
- cpu 子系统,主要限制进程的 cpu 使用率。
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- memory 子系统,可以限制进程的 memory 使用量。
- blkio 子系统,可以限制进程的块设备 io。
- devices 子系统,可以控制进程能够访问某些设备。
- net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
- freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
- ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。
Namespace
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
UnionFS 是一种为 Linux,FreeBSD 和 NetBSD 操作系统设计的把其他文件系统联合到一个联合挂载点的文件系统服务。它使用 branch 把不同文件系统的文件和目录“透明地”覆盖,形成一个单一一致的文件系统。这些 branches 或者是 read-only 或者是 read-write 的,所以当对这个虚拟后的联合文件系统进行写操作的时候,系统是真正写到了一个新的文件中。看起来这个虚拟后的联合文件系统是可以对任何文件进行操作的,但是其实它并没有改变原来的文件,这是因为 unionfs 用到了一个重要的资管管理技术叫写时复制。
写时复制(copy-on-write,简称 CoW ),也叫隐式共享,是一种对可修改资源实现高效复制的资源管理技术。它的思想是,如果一个资源是重复的,但没有任何修改,这时候并不需要立即创建一个新的资源;这个资源可以被新旧实例共享。创建新资源发生在第一次写操作,也就是对资源进行修改的时候。通过这种资源共享的方式,可以显著地减少未修改资源复制带来的消耗,但是也会在进行资源修改的时候增减小部分的开销。
2 命令
Docker 分为客户端和服务端两部分, docker 为客户端调用的命令, dockerd 为服务端调用的命令。
信息、状态、配置
命令 | 描述 |
---|---|
info | 显示 Docker 详细的系统信息 |
version | 显示docker客户端和服务端版本信息 |
inspect | 查看容器或镜像的配置信息, 默认为json数据 |
events | 实时打印服务端执行的事件 |
info命令用于显示当前系统信息、docker容器、镜像个数、设置等信息
镜像
docker search: 查找镜像
docker pull: 获取镜像
docker push: 推送镜像到仓库
docker login: 登录第三方仓库
docker logout: 退出第三方仓库
容器
资源
3 安装
3.1 版本介绍
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):提供企业服务支持
3.2 官方安装说明
https://docs.docker.com/install/
3.3 配置文件
4 使用
加载镜像
docker import ubuntu-2004-arm-dds.tar u20:dds
container 处理
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'
运行arm镜像
#下载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镜像