Docker 诞生

https://www.docker.com/
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护
Docker 自开源后受到广泛的关注和讨论,以至于dotCloud 公司后来都改名为 Docker Inc。Redhat已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用

  1. [root@riyimei ~]# time docker container run ubuntu echo "hello world"
  2. hello world
  3. real 0m3.714s
  4. user 0m0.046s
  5. sys 0m0.038s
  6. [root@riyimei ~]#

Docker 三剑客

Compose

Machine

Swarm

Docker简介 - 图1

容器 OS

由于有容器 runtime,几乎所有的 Linux、MAC OS 和 Windows 都可以运行容器。但这不并没有妨碍容器 OS 的问世。
容器 OS 是专门运行容器的操作系统。与常规 OS 相比,容器 OS 通常体积更小,启动更快。因为是为容器定制的 OS,通常它们运行容器的效率会更高。目前已经存在不少容器 OS,CoreOS、atomic 和 ubuntu core 是其中的杰出代表

容器历史

1979年:Unix V7 chroot技术的引进开启了进程隔离的大门。
2000年:FreeBSD Jails将计算机分为多个独立的小型计算机系统。
2006年:Process Containers 进程的资源使用限制。
2008年:LXC 第一个完整的容器管理工具。
2013年:LMCTFY Libcontainer的重要组成。
2013年:Docker。

––
操作系统虚拟化最早出现在2000年,FreeBSD 4.0推出了Jail。Jail加强和改进了用于文件系统隔离的chroot环境。到了2004年,Sun公司发布了Solaris 10的Containers,包括Zones和Resource management两部分。Zones实现了命名空间隔离和安全访问控制,Resource management实现了资源分配控制。2007年,Control Groups(简称cgroups)进入Linux内核,可以限定和隔离一组进程所使用的资源(包括CPU、内存、I/O和网络等)。
2013年,Docker公司发布Docker开源项目,提供了一系列简便的工具链来使用容器。毫不夸张地说,Docker公司率先点燃了容器技术的火焰,拉开了云原生应用变革的帷幕,促进容器生态圈一日千里地发展。截至2020年,Docker Hub中的镜像累计下载了1300亿次,用户创建了约600万个容器镜像库。从这些数据可以看到,用户正在以惊人的速度从传统模式切换到基于容器的应用发布和运维模式。
–––《harbor权威指南》

为社么要使用容器
https://www.cnblogs.com/CloudMan6/p/6751516.html

容器技术

定义标准+服务应用

基础设施标准化—Docker Engine

当前所有的Linux系统均已支持Docker Engine,有了Docker Engine就可以使Docker容器运行起来。

应用交付标准化—Docker Image

提供了一套可以快速打包为轻量级Docker Image的方法。开发人员在代码完成以后,竟可以将其打包为镜像。运维人员也不在需要准备应用、准备系统、运行环境、组件和基础软件包。

运维管理标准化—Docker Container

运维将关注在这些标准的容器中,而不再是关注底层的复杂系统环境。

分发部署标准化—Docker Registry

指的是容器化以后,不同版本的应用镜像都存储在镜像仓库中,运维人员可以将镜像仓库中特定版本的镜像一键部署到开发环境,测试环境或者是生产环境中。也可以实现快速的版本升级,或者回退。

Docker的目标

通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用级别的一次封装,到处运行

Docker的优点

环境隔离
通过cgroups和namesapce进行实现资源隔离,实现一台机器运行多个容器互不影响
更快速的交付部署
使用docker,开发人员可以利用镜像快速构建一套标准的研发环境;开发完成后,测试和运维人员可以直接通过使用相同的环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,各个步骤都有明确的配置和操作,整个过程全程公司内文档说明,使团队更容易理解应用创建和工作的过程
更高效的资源利用
docker容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低
更易迁移扩展
docker容器几乎可以在任意的平台上运行,包括乌力吉、虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性让用户可以在不同平台之间轻松的迁移应用
更简单的更新管理
使用Dockerfile,只需要小小的配置修改,就可以替代以往的大量的更新工作。并且所有修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理

容器技术精髓

namespace

namespace 隔离的内容
UTS 主机名与域名
IPC 信号量、消息队列和共享内容
PID 进程编号
Network 网络设备、网络栈、端口
Mount 文件系统
User 用户和用户组

Linux Namespaces(Linux2.6.24后引入):命名空间用于进程(PID)、网络(NET)、挂载点(MNT)、UTS、IPC等隔离技术

cgroups

参考:
https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
https://www.infoq.cn/article/docker-resource-management-cgroups/

通过Cgroups可以实现为容器设置系统资源的限额、包括CPU,内存,I/O等等
cgroups(Control Groups)最初叫Process Container,由Google工程师(Paul Menage和Rohit Seth)于2006年提出,后来因为Container有多重含义容易引起误解,就在2007年更名为Control Groups,并被整合进Linux内核。顾名思义就是把进程放到一个组里面统一加以控制,cgroups可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。

/sys/fs/cgroup

image.png

blkio
cpuacct
cpuset
freezer
memory
net_cls,net_prio
perf_event s
cpu
cpu,cpuacct
devices
hugetlb
net_cls
net_prio
pids

  1. [root@docker memory]# ls
  2. cgroup.clone_children memory.kmem.slabinfo memory.memsw.limit_in_bytes memory.swappiness
  3. cgroup.event_control memory.kmem.tcp.failcnt memory.memsw.max_usage_in_bytes memory.usage_in_bytes
  4. cgroup.procs memory.kmem.tcp.limit_in_bytes memory.memsw.usage_in_bytes memory.use_hierarchy
  5. cgroup.sane_behavior memory.kmem.tcp.max_usage_in_bytes memory.move_charge_at_immigrate notify_on_release
  6. memory.failcnt memory.kmem.tcp.usage_in_bytes memory.numa_stat release_agent
  7. memory.force_empty memory.kmem.usage_in_bytes memory.oom_control system.slice
  8. memory.kmem.failcnt memory.limit_in_bytes memory.pressure_level tasks
  9. memory.kmem.limit_in_bytes memory.max_usage_in_bytes memory.soft_limit_in_bytes user.slice
  10. memory.kmem.max_usage_in_bytes memory.memsw.failcnt memory.stat
  11. [root@docker memory]#

Linux Kernel技术

  • selinux和apparmor可以增强对容器的访问控制。
  • capabilitise的主要实现在于将超级用户root的主要权限分割成各种不同的capabilities。

    1. 从而更严格的控制容器的权限。
  • netlink技术可以完成Docker容器的网络环境配置和创建

image.png

Lxc是第一个完整意义上的容器管理技术,通过Lxc可以方便的创建、启动和停止一个容器。还可以通过它来操作容器中的应用,也可以查看容器的运行状态。

Libcontainer用于容器管理的包,管理namespaces、cgroups、capabilities以及文件系统来对容器控制。可用Libcontainer创建容器,并对容器进行管理。pivot_root 用于改变进程的根目录,可以将进程控制在rootfs中。如果rootfs是基于ramfs的(不支持pivot_root),那会在mount时使用MS_MOVE标志位加上chroot来顶替。

Libcontainer通过接口的方式定义了一系列容器管理的操作,包括处理容器的创建(Factory)、容器生命周期管理(Container)、进程生命周期管理(Process)等一系列接口

引用:
https://blog.csdn.net/qq_38265137/article/details/80330514

容器技术规范

Docker简介 - 图4
自1.11版本起,Docker全面调整模块架构,成为了第一个符合OCI规范的容器运行时。具体来说,Docker Engine目前是基于containerd和runc构建的。下面详细介绍相关OCI规范、runC、containerd。

什么是OCI规范

OCI(Open Container Initiative)致力于建立一个容器运行时和镜像格式的规范,其核心目的在于避免容器生态的分化,确保在不同容器引擎上构建的容器可以相互兼容。这是容器可移植性的根本保证。虽然Docker目前是容器的事实规范,但随着时间的推移,会不断涌现一些其他的容器引擎,这个时候就很有必要来定义一下“什么是一个容器”,保证不同的实现遵循一些共同的东西。这既是OCI期望做的事情

什么是runC

在早期的Docker Engine中,主要用LXC工具来运行和管理容器;后来采用自研的libcontainer来做这类事情,libcontainer直接使用Linux内核提供的相关隔离技术,比如cgroups、namespace等等。
runC是一个轻量级的工具,做且只做一件事情,那就是运行一个容器。由libcontainer演变而来,并且由Docker捐献给Linux基金会,作为OCI的参考实现。

什么是containerd

2016年12月14日,Docker公司宣布将containerd从Docker Engine中分离,并捐赠到一个新的开源社区独立发展和运营,”一个工业标准的容器运行时,注重简单、 健壮性、可移植性”。containerd可以作为daemon程序运行在Linux和Windows上,管理机器上所有容器的生命周期。
Docker 1.11的Docker Engine里就包含了containerd,而现在则是把containerd从Docker Engine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在Docker Engine里containerd相比,独立的containerd将具有更多的功能,可以涵盖整个容器运行时管理的所有需求。

containerd并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如Swarm, Kubernetes, Mesos等容器编排系统。containerd以Daemon的形式运行在系统上,通过unix domain docket暴露很低层的gRPC API,上层系统可以通过这些API管理机器上的容器。每个containerd只负责一台机器,Pull镜像,对容器的操作(启动、停止等),网络,存储都是由containerd完成。具体运行容器由runC负责,实际上只要是符合OCI规范的容器都可以支持。

Docker简介 - 图5

docker目前被分成了4个独立部分,engine管理镜像,通过containerd,containerd调用containerd-shim,containerd-shim调用runc启动容器。containerd只与容器打交道

Containerd 是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。Containerd 可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。
详细点说,Containerd 负责干下面这些事情:

  • 管理容器的生命周期(从创建容器到销毁容器)
  • 拉取/推送容器镜像
  • 存储管理(管理镜像及容器数据的存储)
  • 调用 runC 运行容器(与 runC 等容器运行时交互)
  • 管理容器网络接口及网络

引用
https://www.jianshu.com/p/453021b7c1ff
RunC简介
https://www.cnblogs.com/sparkdev/p/9032209.html
Containerd简介
https://www.cnblogs.com/sparkdev/p/9063042.html

Docker 核心概念

1、docker

docker 的命令行工具,是给用户和 docker daemon 建立通信的客户端。

2、dockerd

dockerd 是 docker 架构中一个常驻在后台的系统进程,称为 docker daemon,dockerd 实际调用的还是 containerd 的 api 接口(rpc 方式实现),docker daemon 的作用主要有以下两方面:

  • 接收并处理 docker client 发送的请求
  • 管理所有的 docker 容器

有了 containerd 之后,dockerd 可以独立升级,以此避免之前 dockerd 升级会导致所有容器不可用的问题。

3、containerd

containerd 是 dockerd 和 runc 之间的一个中间交流组件,docker 对容器的管理和操作基本都是通过 containerd 完成的。containerd 的主要功能有:

  • 容器生命周期管理
  • 日志管理
  • 镜像管理
  • 存储管理
  • 容器网络接口及网络管理

    4、containerd-shim

    containerd-shim 是一个真实运行容器的载体,每启动一个容器都会起一个新的containerd-shim的一个进程, 它直接通过指定的三个参数:容器id,boundle目录(containerd 对应某个容器生成的目录,一般位于:/var/run/docker/libcontainerd/containerID,其中包括了容器配置和标准输入、标准输出、标准错误三个管道文件),运行时二进制(默认为runC)来调用 runc 的 api 创建一个容器,上面的 docker 进程图中可以直观的显示。其主要作用是:

  • 它允许容器运行时(即 runC)在启动容器之后退出,简单说就是不必为每个容器一直运行一个容器运行时(runC)

  • 即使在 containerd 和 dockerd 都挂掉的情况下,容器的标准 IO 和其它的文件描述符也都是可用的
  • 向 containerd 报告容器的退出状态

有了它就可以在不中断容器运行的情况下升级或重启 dockerd,对于生产环境来说意义重大。

5、runC

runC 是 Docker 公司按照 OCI 标准规范编写的一个操作容器的命令行工具,其前身是 libcontainer 项目演化而来,runC 实际上就是 libcontainer 配上了一个轻型的客户端,是一个命令行工具端,根据 OCI(开放容器组织)的标准来创建和运行容器,实现了容器启停、资源隔离等功能。

Docker主要组件

引用
https://www.cnblogs.com/sparkdev/p/9129334.html

Docker 架构

image.png

Docker简介 - 图7

  • Docker daemon( Docker守护进程):Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。
  • Client( Docker客户端):Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build等都是 Docker的相关命令。
  • Images( Docker镜像):Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序。
  • Container(容器):容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API或者 CLI命令来启停、移动、删除容器。
  • Registry:Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助Docker Registry来避免镜像的手动复制。一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。这跟 Maven的仓库有点类似,如果把 Docker Registry比作Maven仓库的话,那么 Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。Docker Registry可分为公有Docker Registry和私有Docker Registry。 最常用的DockerRegistry莫过于官网的Docker Hub, 这也是默认的Docker Registry。 Docker Hub上存放着大量优秀的镜像

Docker简介 - 图8

参考:
https://www.jianshu.com/p/de3184ad0800
2015 年 6 月 ,docker 公司将 libcontainer 捐出并改名为 runC 项目,交由一个完全中立的基金会管理,然后以 runC 为依据,大家共同制定一套容器和镜像的标准和规范 OCI。
2016 年 4 月,docker 1.11 版本之后开始引入了 containerd 和 runC,Docker 开始依赖于 containerd 和 runC 来管理容器,containerd 也可以操作满足 OCI 标准规范的其他容器工具,之后只要是按照 OCI 标准规范开发的容器工具,都可以被 containerd 使用起来。
从 2017 年开始,Docker 公司先是将 Docker项目的容器运行时部分 Containerd 捐赠给CNCF 社区,紧接着,Docker 公司宣布将 Docker 项目改名为 Moby

Moby

moby 的仓库地址:
https://github.com/moby/moby.git
**

  • moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品
  • docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品
  • docker-ee是docker公司维护的闭源产品,是docker公司的商业产品

**

  1. [root@riyimei ~]#ps -f $(pgrep docker)
  2. UID PID PPID C STIME TTY STAT TIME CMD
  3. root 10885 1 0 Apr03 ? Ssl 10:08 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.so
  4. [root@riyimei ~]#ps -f $(pgrep containerd)
  5. UID PID PPID C STIME TTY STAT TIME CMD
  6. root 10710 1 0 Apr03 ? Ssl 14:56 /usr/bin/containerd
  7. [root@riyimei ~]#
  1. [root@riyimei ~]# ls -l $(which docker runc)
  2. -rwxr-xr-x 1 root root 89216320 Mar 4 09:25 /usr/bin/docker
  3. -rwxr-xr-x 1 root root 12890296 Feb 28 12:07 /usr/bin/runc
  4. [root@riyimei ~]#

Docker官网注册

注册一个docker账号:https://hub.docker.com/
image.png

Docker 版本:
https://docs.docker.com/install/linux/docker-ce/centos/

环境
操作系统:CentOS7
Docker版本:
版本新功能:
https://github.com/moby/moby/blob/master/CHANGELOG.md

[root@riyimei ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@riyimei yum.repos.d]# yum-config-manager —add-repo https://download.docker.com/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@riyimei yum.repos.d]#

[root@riyimei ~]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

  • base: mirrors.aliyun.com
  • extras: mirrors.aliyun.com
  • updates: mirrors.aliyun.com
    repo id repo name status
    base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com 10,097
    docker-ce-stable/x86_64 Docker CE Stable - x86_64 65
    epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 13,192
    extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com 323
    updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com 1,465
    repolist: 25,142
    [root@riyimei ~]#

    Linux内核要求

    内核3.1以上

Docker安装

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y yum-utils device-mapper-persistent-data lvm2

添加官方源:
yum-config-manager \
—add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

卸载旧版本
yum -y remove docker docker-common docker-selinux docker-engine docker-engine-selinux container-selinux docker-ce
存储驱动
yum install -y device-mapper-persistent-data lvm2

查看版本
yum list docker-ce —showduplicates|sort -r
yum install docker-ce-19.03.6-3.el7 -y

docker-ce-3:18.09.9-3.el7.x86_64

image.png

Docker加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://0[bb06s1q.mirror.aliyuncs.com](http://bb06s1q.mirror.aliyuncs.com/)”]
}
EOF

修改默认存储位置
vim /etc/docker/daemon.json

  1. {
  2. "graph": "/new-path/docker"
  3. }

阿里云控制台申请docker加速
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

image.png

systemctl daemon-reload && systemctl start docker && systemctl enable docker.service
**
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成

live-restore

https://docs.docker.com/config/containers/live-restore/

  1. {
  2. "live-restore": true
  3. }



http://www.json.org/json-zh.html

https://www.cnblogs.com/edisonchou/p/docker_monitor_introduction_part1.html

https://blog.csdn.net/weixin_40461281/article/details/92787622

image.png

Docker简介 - 图13