简单的docker学习 第2章 docker引擎

第2章docker引擎

2.1Docker 引擎发展历程

2.1.1 首发版本架构

Docker 在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)与 Docker Daemon。不过,该架构依赖于 LXC,使得 Docker 存在严重的问题:

  • 依赖于外部工具,对 Docker 来说,存在着巨大的生存风险

  • LXC 使得 Docker 无法实现跨平台

Docker Daemon 的"大而全"也带来了严重的问题:

  • 版本更新与功能扩展较难
  • 运行较慢,带来性能问题
  • Docker Daemon 运行出现问题,会直接影响容器的运行
  • 不符合软件哲学
2.1.2 Docker0.9 版本架构

​ 从 Docker0.8 版本开始,Docker 使用自研的 Libcontainer 工具替换了 LXC

2.1.3 Docker1.1 版本架构

​ 2017 年 7 月 OCI 基金会发布了两个规范(镜像规范与容器运行时规范)的 OCI1.0 版本。2016 年底发布的 Docker1.1 版本基本遵循了 OCI1.0 版本。从 Docker1.1 版本开始,Docker Daemon 中不再包含任何容器运行时代码,而是将容器运行时单独剥离了出来,形成了 Runc 项目。

2.2 Docker 引擎架构

Docker 引擎是用来运行和管理容器的核心软件,其现代架构由四部分主要组件构成:Docker Client,Dockerd、Containerd 与 Runc。

2.2.1 Docker Client

​ Docker 客户端,Docker 引擎提供的 CLI 工具,用于用户向 Docker 提交命令请求。

2.2.2 Dockerd

​ Dockerd,即 Docker Daemon。在现代 Dockerd 中的主要包含的功能有镜像构建、镜像管理、REST API、核心网络及编排等。其通过 gRPC 与 Containerd 进行通信

2.2.3 Containerd

​ Containerd,即 Container Daemon,该项目的主要功能是管理容器的生命周期。不过,其本身并不会去创建容器,而是调用 Runc 来完成容器的创建。Docker 公司后来将 Containerd 项目捐献给了 CNCF(云原生基金会)

2.2.4 Runc

​ Runc,Run Container,是 OCI(开放容器倡议基金会)容器运行时规范的实现,Runc 项目的目标之一就是与 OCI 规范保持一致。所以,Runc 所在层也称为 OCI 层。这使得 Docker Daemon 中不用再包含任何容器运行时的代码了,简化了 Docker Daemon。Runc 只有一个作用---创建容器,其本质是一个独立的容器运行时 CLI 工具。其在 fork出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc 会自动退出。

2.2.5 Shim

​ Shim(垫片)是实现"Daemonless Container(无 Docker Daemon 与 Container Daemon容器)"不可或缺的工具,使容器与 Docker Daemon 解耦,使得 Docker Daemon 的维护与升级不会影响到运行中的容器。每次创建容器时,Containerd 同时会 fork 出 Runc 进程与 Shim 进程。当 Runc 自动退出之前,会先将新容器进程的父进程指定为相应的 Shim 进程。

除了作为容器的父进程外,Shim 进程还具有两个重要功能:

  • 保持所有 STDIN 与 STDOUT 流的开启状态,从而使得当 Docker Daemon 重启时,容器不会因为 Pipe 的关闭而终止。
  • 将容器的退出状态反馈给 Docker Daemon。

2.3Docker 引擎分类

​ 在安装 Docker 之前需要先了解 Docker 官方对其版本的分类。Docker 的版本分为大版本与小版本。

2.3.1 大版本

​ Docker 从大版本来说,分为三类:Moby、社区版 Docker-CE(Community Edition)和企业版 Docker-EE(Enterprise Edition)。

2.3.2 小版本

​ 从 v1.13.1 之后,Docker 的发布计划发生了变更,每个大版本下都出现了两个小版本 Edge 月版与 Stable 季版。不过,现在的官网中一般只能看到 Stable 版本。

2.4Docker 引擎的安装

​ Docker 可以安装在 Windows、Linux、Mac 等系统中,但生产环境下,服务器使用 Linux中的 CentOS 居多,所以下面就以 Docker 在 CentOS7 中的安装为例来学习 Docker 的安装。官网 https://docs.docker.com/engine/install/centos/中可以看到具体安装方式与安装步骤。

2.4.1 系统要求

​ 我们这里要安装的是 Docker CE 版,且要安装到 CentOS 之中。不过,对于安装 Docker的系统环境还是有要求的。

​ 对于 CentOS 系统的安装主机,无论是传统架构还是 ARM 架构,要求处理器都是 64 位系统。

docker安装手顺地址 https://docs.docker.com/engine/install/centos/

​ 并且 CentOS 要求是 7 及其以上版本

2.4.2 克隆并配置主机
  • 修改主机名:/etc/hostname
  • 修改网络配置:/etc/sysconfig/network-scripts/ifcfg-ens33
  • 查看当前主机版本: cat /etc/redhat-release
  • 查看是否为64位系统: uname -r
2.4.3 安装需要的包
  1. 务必配置阿里的yum源,这样安装Docker的速度就不会太慢

    shell 复制代码
    # 关闭防火墙部分
    systemctl stop firewalld
    systemctl disable firewalld
    
    # 检查防火墙状态
    systemctl status firewalld
    
    # 1、备份备份官方的原yum源的配置
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    
    # 2、下载Centos-7.repo文件
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
    # 注意:部分小伙伴可能没有安装wget,需要先安装wget,或者用下面的命令下载repo文件
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
    # 3、清除yum缓存
    yum clean all
    
    # 4、缓存阿里云源
    yum makecache
    
    # 5、测试阿里云源 
    yum list
  2. 卸载旧版本的Docker,旧版本的Docker程序被称作Docker或者Docker-engine,如果之前在系统中安装过,那么就卸载掉,当然连同依赖一起卸载了!

    shell 复制代码
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-selinux \
    docker-logrotate \
    docker-engine-selinux\
    docker-engine
  3. 安装yum-utils,它提供了yum-config-manager,同时安装device-mapper-persistent-datalvm2,这些是Docker设备映射器(devicemapper)存储驱动程序所必需的。

    shell 复制代码
    yum install -y yum-utils device-mapper-persistent-data lvm2
  4. 使用一下命令来搭建稳定的仓库

    shell 复制代码
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. 安装 docker,以及 docker-cli,安装时间稍长,请耐心等待

    shell 复制代码
    yum install docker-ce docker-ce-cli containerd.io

    如果想安装特定版本的Docker CE,可以先列出所有可用的版本,然后选择特定版本进行安装:

    shell 复制代码
    yum list docker-ce --showduplicates | sort -r
    # 下载固定版本docker eg: yum install docker-ce-3:26.1.4-1.el7 docker-ce-cli-1:26.0.4-1.el7 containerd.io
    yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

    请将<VERSION_STRING>替换为你想安装的具体版本号。

  6. 查看安装版本信息

    shell 复制代码
    docker version

2.5 Docker 引擎的启停

2.5.1 启动docker

Docker 是以服务的形式运行在系统中,所以使用 systemctl 来对其进行各种操作。启动docker

shell 复制代码
systemctl start docker
2.5.2 启动成功测试

为了验证 Docker 安装启动成功,一般有两种方式:

  • docker version

  • 运行hello-world镜像,可以通过运行 hello-world 镜像来验证 Docker 的安装启动成功。当然,当前宿主机中是不存在 hello-world 镜像的,其会首先下载,然后才会运行。如果看到如下输出,则说明 Docker 已经安装启动成功了。如果看不到如下结果,一般都是因为下载超时,需要先完成以下"配置国内加速器"步骤。

    网络连接失败,后续配置国内加速器再进行尝试

2.5.3 Docker 重启
shell 复制代码
systemctl restart docker
2.5.4 查看 Docker 状态
shell 复制代码
systemctl status docker	
2.5.5 开机自启动 Docker

通过 systemctl start docker 命令仅可以开启 Docker 服务,但每次开机后,都需要开启。可以通过systemctl enalbe docker命令将Docker服务设置为开机自启动服务,即开机后Docker服务无需再开启,其本身就是开启状态。

shell 复制代码
systemctl enable docker

此时再查看 Docker 的状态,可以看到原来的 disabled 变为了 enabled,说明当前 Docker服务已经变为了开机自启动了

2.5.6 Docker 停止
shell 复制代码
systemctl stop docker
2.5.7 关闭开机自启动
shell 复制代码
systemctl disable docker

2.6配置国内加速器

国内镜像中心常用的为阿里云与网易云。在本地 Docker 中指定要使用的国内加速器地址后,就可以直接从国内镜像中心下载镜像了。

2.6.1 配置阿里云加速器

若要配置阿里云加速器,必须首先要有阿里云的账号。登录阿里云后,打开阿里云的容器镜像服务页面 https://cr.console.aliyun.com ,然后找到如下页面,执行相应的命令。

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

执行之后再次执行 docker run hello-world

网易云加速器,不用注册账号信息,直接修改registry-mirrrors地址即可

shell 复制代码
{
  "registry-mirrors": ["https://hub-mirror.c.163.com"]
}
2.6.2 配置境外镜像
shell 复制代码
# 使用难兄难弟俄罗斯镜像
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://docker.m.daocloud.io","https://huecker.io","https://dockerhub.timeweb.cloud","https://noohub.ru"]
}
EOF

systemctl daemon-reload
systemctl restart docker

2.7 Docker 引擎的卸载

对 Docker 的卸载分为三大步

  • yum 移除,通过 yum remove 移除 docker 安装的四个组件

    shell 复制代码
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-selinux \
    docker-logrotate \
    docker-engine-selinux\
    docker-engine
  • rm 两个目录

    通过 rm --rf 删除/var/lib 下的 docker 与 containerd 两个目录。这两个目录中存放着镜像、容器、数据卷,它们在前面删除时不能被自动删除,需要手动删除

    shell 复制代码
    rm -rf /var/lib/docker
    rm -rf /var/lib/containerd
  • 还有一些自己编辑、定义的配置文件,需要自己手工删除

相关推荐
丢爸1 小时前
网络学习-eNSP配置NAT
linux·网络·学习
YHPsophie2 小时前
AT3340-6T杭州中科微BDS定位授时板卡性能指标
经验分享·笔记·学习·车载系统·信息与通信
6230_2 小时前
关于HTTP通讯流程知识点补充—常见状态码及常见请求方式
前端·javascript·网络·网络协议·学习·http·html
别挡3 小时前
CentOS Stream 8中安装和使用 Docker
linux·docker·centos
日记成书4 小时前
【无线通信发展史⑨】1791年路易吉·伽伐尼-关于动物电的研究与1800年亚历山大·伏打伯爵-电池:伏打电池
网络·人工智能·学习·职场和发展·信息与通信
贾saisai4 小时前
Xilinx系FPGA学习笔记(四)VIO、ISSP(Altera)及串口学习
笔记·学习·fpga开发
月夕花晨3744 小时前
C++学习笔记(13)
c++·笔记·学习
probably1214 小时前
学习记录之Java学习笔记3
java·笔记·学习
愤怒的代码5 小时前
Centos使用阿里云镜像安装docker
linux·docker·centos
汪公子4925 小时前
使用docker部署考试系统
docker