docker学习 - docker run

docker run流程

创建容器

  • 通过用户指定的镜像名和tag,在TagStore中查找image_id,获取image对象(本地的image json文件里有镜像信息)
  • 检查镜像layer数(不超过127),镜像层数太多会造成性能问题
  • 将runconfig.Config和image.Config合并
  • 创建{Container.ID}-init和Container.ID镜像的目录,在init layer创建.dockerinit、/etc/hosts、/etc/hostname等, Container.ID镜像是read-write layer
  • 将Container对象持久化到path.Join(Container.ID, “config.json”)
  • 在Daemon.idIndex中注册Container.ID,在Daemon.contStore中记录Container.ID和Container对象的映射关系

启动容器

  • 通过Container.ID从Daemon.contStore中获取Container对象
  • 配置容器的dns地址/etc/resolv.conf
  • 将所有祖先镜像挂载到path.Join(graphdriver.root, “mnt”, Container.ID)
  • 初始化容器的hosts文件/etc/hosts
  • 检查主机是否开启cgroup内存限制、swap内存限制、ipv4转发
  • 将容器内挂在目录和宿主机目录的映射关系存入container.Volume
  • 将容器的link信息存入graphdb中,基于sqllite的图模型的数据库
  • 通过iptables开启link容器间的通信,并env化
  • 获取容器运行的当前目录,获取用户指定的环境变量
  • 构建execdriver的Command对象,包括进程命令、Network、Mount、Resources、WorkingDir,用于容器的启动和配置
  • 将Command对象持久化到path.Join(config.root, “execdriver/native/container.json”)
  • 通过execdriver.Run启动Command对象

启动dockerinit

dockerinit是daemon启动容器运行的第一个进程,类似linux的init进程
初始化容器的Network资源、Mount资源、设置用户、设置环境变量等在daemon进程中做不到事情
Daemon执行流程

  • 创建syncPipe用于跨namespace的通信
  • execdriver.Run创建一个exec.Cmd对象来执行dockerinit命令
  • exec.Cmd.Args代表dockerinit的执行参数,native表示execdriver类型,pipe表示同步管道的文件描述符,root表示容器- 配置文件container.json和state.json所在目录,args表示用户指定的命令
  • Exec.Cmd.SysProcAttr携带需要为进程创建新namespace参数Cloneflags,包括NEWNS、NEWUTS、NEWIPC、NEWPID、NEWNET
  • 调用exec.Cmd.Start()启动dockerinit进程
  • 调用namespaces.SetupCgroups为dockerinit配置cgroup(cpu、iops、memory、freezer)
  • 调用namespaces.InitializeNetworking为dockerinit创建网络栈
  • 调用syncPipe.SendToChild(networkState)将需要dockerinit完成的剩余网络配置发给dockerinit
  • 调用syncPipe.ReadFromChild与dockerinit同步

    Daemon执行流程

  • 创建syncPipe用于跨namespace的通信
  • execdriver.Run创建一个exec.Cmd对象来执行dockerinit命令
  • exec.Cmd.Args代表dockerinit的执行参数,native表示execdriver类型,pipe表示同步管道的文件描述符,root表示容器- 配置文件container.json和state.json所在目录,args表示用户指定的命令
  • Exec.Cmd.SysProcAttr携带需要为进程创建新namespace参数Cloneflags,包括NEWNS、NEWUTS、NEWIPC、NEWPID、NEWNET
  • 调用exec.Cmd.Start()启动dockerinit进程
  • 调用namespaces.SetupCgroups为dockerinit配置cgroup(cpu、iops、memory、freezer)
  • 调用namespaces.InitializeNetworking为dockerinit创建网络栈
  • 调用syncPipe.SendToChild(networkState)将需要dockerinit完成的剩余网络配置发给dockerinit
  • 调用syncPipe.ReadFromChild与dockerinit同步

    Dockerinit执行流程

  • 从参数中读取root配置文件所在目录
  • 从path.Join(root, “container.json”)中读取daemon传过来的execdriver.Command对象,获取容器的配置信息
  • 调用mount.InitializeMountNamespace完成挂载资源的初始化,包括rootfs根文件系统,挂载点Volume,设备文件
  • 调用namespaces.FinalizeNamespace完成剩余的配置,包括关闭除0/1/2以外的文件句柄,为容器创建新的用户ID、组ID,切换到工作目录
  • 调用syscall.Exec将容器主进程的执行权交给用户程序
时间: 2024-09-11 20:27:15

docker学习 - docker run的相关文章

docker学习 - docker启动和镜像

docker daemon启动 载体为daemon,调度管理engine,任务执行靠jobEngine是map[string]Handler,type Handler func(*Job) Status Daemon的启动流程: 注册serve job.pull job.create job.start job等 构建serveapi job,并执行ServeApi handler,创建支持多种协议请求(tcp/socker fd/默认unix socket)的http Server,支持TLS

Docker学习路线图 (持续更新中)

Docker学习路线图 Docker基础 101 学习Docker基本概念 Docker容器 Docker镜像 Dockerfile初步概念 练习 安装Docker Toolbox或Docker Engine Docker Toolbox 阿里云镜像源 Docker Engine 阿里云镜像源 配置本地Docker环境 利用Docker Machine创建本地Docker Environment 配置阿里云Docker镜像加速器 管理容器的生命周期与配置 创建.删除.检查.启动.停止容器 ...

docker学习笔记

docker学习笔记 一.更新内核,升级内核至3.x 二.安装docker: rpm --import/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 yum -y install docker-io 三.启动docker: service docker start chkconfig docker on 四.下载基础镜像: docker pull centos:latest 五.查看本地镜像: docker images 六.添加运行文件:(以javaSE为例) Dock

docker学习(1) 安装

docker是啥就不多讲了,简言之就是更轻量.更牛叉的新一代虚拟机技术.下面是安装步骤: 一.mac/windows平台的安装 docker是在linux内核基础上发展而来的,无法直接运行在mac/windows上,需要借助docker-machine工具,先在mac/windows上建一个linux的虚拟机,然后才能继续玩下去.默认内置的虚拟机引擎是Oracle的免费软件VirtualBox,可支持vmware fusion之类的商业软件. 1.1 下载docker toolbox 下载地址:

Docker学习总结之Docker与Vagrant之间的特点比较

Docker学习总结之Docker与Vagrant之间的特点比较 以下内容均出自Vagrant作者(Mitchell Hashimoto)与Docker作者(Solomon Hykes)在stackoverflow上面一个问题讨论.在这个问题中,双方阐述了vagrant和docker的特点和使用范围,对于深入理解vagrant和docker很有意义,因此笔者翻译出来,以供大家讨论学习. Mitchell作为vagrant的作者,其在DevOps的世界里面沉浸多年,接触了很多类似docker的虚拟

Docker学习笔记之docker入门_docker

学习的一些疑问 如何热更新镜像(images)?(你可以快速启动或者销毁容器.这种时间几乎是实时的) 如何热更新游戏服? 好处在于各个应用之间环境相互独立,即使某一个容器崩溃也不会影响到其它容器: 每个容器使用端口如何维护?(方法1写在Dockerfile里面,不灵活:方法2在run的时候-p指定): 那这样的话,会存在好多linux用户,相当于每一个容器就要维护一个物理机(虚拟): 需要一套工具来管理维护镜像.容器的操作和状态: 目前主流使用docker都是应用到哪些场景中? 1. docke

Docker学习(一)

今天公司请到了惠普的厂家人员来讲解Kubernetes 学习Kubernetes 当然要学习docker 那么从安装到简单的命令来一遍吧,我实在自己的虚拟机上(VM+CentOS) 刚开始怎么也连不上外网,后来发现有一个服务没有启动,不知道你会不会遇见这样的情况: VMware DHCP Service 这个服务要启动 安装Docker: wget -qO- https://get.docker.com/ | sh 拉取MySQL镜像: docker pull mysql:5.6 运行: doc

学习Docker容器网络模型 - 搭建分布式Zookeeper集群

ZooKeeper是一个流行的分布式协调服务.它提供了两种不同的部署方式:单机模式和分布式模式.其中单机模式的部署非常简单,网上也有很多资料,我们今天会利用Docker搭建分布式Zookeeper集群,并来帮助大家熟悉Docker中容器网络模型的使用. ZooKeeper集群中所有的节点作为一个整体对分布式应用提供服务.节点中有两个的角色:Leader和Follower.在整个集群运行过程中,只有一个Leader,其他节点的都是Follower,如果ZK集群在运行过程中Leader出了问题,系统

docker学习(2) mac中docker-machine使用vmware fusion以及配置国内镜像加速

一.前言 先回顾下上一节创建docker-machine的过程,默认情况下docker toolbox中的docker-machine使用virtual box创建虚拟机,KI首次启动时创建虚拟机的过程,大致相当于下面这条命令: docker-machine create --driver virtualbox default 输出如下: Running pre-create checks... Creating machine... (default) Copying /Users/yjmyz