《容器技术系列》一1.4 Docker运行案例分析

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本节书摘来华章计算机《容器技术系列》一书中的第1章 ,第1.4节,孙宏亮 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.4 Docker运行案例分析 1.3节着重介绍了Docker架构中各个模块的功能,学完后我们可以对Docker的架构有一个宏观的认识。

本节书摘来华章计算机《容器技术系列》一书中的第1章 ,第1.4节,孙宏亮 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.4 Docker运行案例分析

1.3节着重介绍了Docker架构中各个模块的功能,学完后我们可以对Docker的架构有一个宏观的认识。熟悉一款软件,研究一个系统,从静态的角度认识架构的各个模块,仅仅是第一步;从动态的角度,掌握软件或者系统的运行原理,即熟知架构中模块间的通信逻辑,无疑会让自己对软件或系统的理解更上一层楼。本节将从实际的Docker运行案例出发,串联Docker各模块,从而学习Docker的运行流程。分析原型为Docker中的docker pull与docker run两个命令。

1.4.1 docker pull

1.3节中我们提到,用户可以为容器指定镜像,作为容器运行时的rootfs,既然如此,镜像从何而来则成为一个关键。答案很简单,一切都归功于docker pull命令。
docker pull命令的作用是:Docker Daemon从Docker Registry下载指定的容器镜像,并将镜像存储在本地的Graph中,以备后续创建Docker容器时使用。docker pull命令的执行流程如图1-10所示。
图1-10中有编号的箭头表示docker pull命令在发起后,Docker架构中相应模块所做的一系列运行操作。下面我们逐一分析这些步骤。
1)Docker Client处理用户发起的docker pull命令,解析完请求以及参数之后,发送一个HTTP请求给Docker Server,HTTP请求方法为POST,请求URL为"/images/create?"+"xxx",实际意义为下载相应的镜像。
2)Docker Server接收以上HTTP请求,并交给mux.Router,mux.Router通过URL以及请求方法类型来确定执行该请求的具体handler。
3)mux.Router将请求路由分发至相应的handler,具体为PostImagesCreate。
4)在PostImageCreate这个handler之中,创建并初始化一个名为"pull"的Job,之后触发执行该Job。
5)名为"pull"的Job在执行过程中执行pullRepository操作,即从Docker Registry中下载相应的一个或者多个Docker镜像。
6)名为"pull"的Job将下载的Docker镜像交给graphdriver管理。
7)graphdriver负责存储Docker镜像,一方面将实际镜像存储至本地文件系统中,另一方面为镜像创建对象,由Docker Daemon统一管理。

image

1.4.2 docker run

docker run命令的作用是创建一个全新的Docker容器,并在容器内部运行指定命令。Docker Daemon处理用户发起的这条命令时,所做工作可以分为两部分:第一,创建Docker容器对象,并为容器准备所需的rootfs;第二,创建容器的运行环境,如网络环境、资源限制等,最终真正运行用户指令。因此,在dockerrun命令的完整执行流程中,Docker Client给Docker Server发送了两次HTTP请求,第二次请求的发起取决于第一次请求的返回状态。docker run命令执行流程如图1-11所示。


image

图1-11中有编号的箭头表示dockerrun命令在发起后,Docker架构中相应模块所做的一系列运行。下面我们逐一分析这些步骤:
1)Docker Client处理用户发起的docker run命令,解析完请求与参数之后,向Docker Server发送一个HTTP请求,HTTP请求方法为POST,请求URL为"/containers/create?"+"xxx",实际意义为创建一个容器对象,即Docker Daemon程序逻辑中的容器对象,并非实际运行的容器。
2)Docker Server接收以上HTTP请求,并交给mux.Router,mux.Router通过URL以及请求方法来确定执行该请求的具体handler。
3)mux.Router将请求路由分发至相应的handler,具体为PostContainersCreate。
4)在PostContainersCreate这个handler之中,创建并初始化一个名为"create"的Job,之后触发执行该Job。
5)名为"create"的Job在运行过程中执行Container.Create操作,该操作需要获取容器镜像来为Docker容器准备rootfs,通过graphdriver完成。
6)graphdriver从Graph中获取创建Docker容器rootfs所需要的所有镜像。
7)graphdriver将rootfs的所有镜像通过某种联合文件系统的方式加载至Docker容器指定的文件目录下。
8)若以上操作全部正常执行,没有返回错误或异常,则Docker Client收到Docker Server返回状态之后,发起第二次HTTP请求。请求方法为"POST",请求URL为"/containers/"+container_ID+"/start",实际意义为启动时才创建完毕的容器对象,实现物理容器的真正运行。
9)Docker Server接收以上HTTP请求,并交给mux.Router,mux.Router通过URL以及请求方法来确定执行该请求的具体handler。
10)mux.Router将请求路由分发至相应的handler,具体为PostContainersStart。
11)在PostContainersStart这个handler之中,创建并初始化名为"start"的Job,之后触发执行该Job。
12)名为"start"的Job执行需要完成一系列与Docker容器相关的配置工作,其中之一是为Docker容器网络环境分配网络资源,如IP资源等,通过调用networkdriver完成。
13)networkdriver为指定的Docker容器分配网络资源,其中有IP、port等,另外为容器设置防火墙规则。
14)返回名为"start"的Job,执行完一些辅助性操作后,Job开始执行用户指令,调用execdriver。
15)execdriver被调用,开始初始化Docker容器内部的运行环境,如命名空间、资源控制与隔离,以及用户命令的执行,相应的操作转交至libcontainer来完成。
16)libcontainer被调用,完成Docker容器内部的运行环境初始化,并最终执行用户要求启动的命令。

相关文章
|
6天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
11 0
|
9天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
15天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
13 0
|
15天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
26 0
|
15天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
27 0
|
23天前
|
Kubernetes 网络协议 Docker
Docker 容器的DNS
Docker 容器的DNS
28 1
|
26天前
|
Kubernetes API 调度
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
52 0
|
26天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
47 1
|
27天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
204 1
|
28天前
|
运维 监控 云计算
构建高效稳定的Docker容器监控体系
随着微服务架构的普及,Docker容器作为其核心承载单元,在系统运维中扮演着日益重要的角色。本文旨在探讨如何构建一个高效且稳定的Docker容器监控体系,以确保容器运行的可靠性和系统的高可用性。文章首先分析了容器监控的必要性,接着详细介绍了监控体系的设计理念和组件选择,最后提供了实施过程中的关键步骤与最佳实践。通过本文,读者将掌握构建和维护Docker容器监控体系的有效方法。