Docker容器技术-Docker架构
一、Docker系统架构
1.Docker基础架构

1)Docker守护进程
负责容器的创建、运行和监控,以及镜像的构建和存储。
docker daemon
2)Docker客户端
通过HTTP与Docker守护进程通信。
默认使用Unix域套接字(Unix domain socket)实现,但为了支持远程客户端也可以使用TCP socket。
Docker客户端和守护进程是由同一个二进制文件发布的。
3)Docker寄存服务
负责存储和发布镜像。(Docker Hub)
当Docker守护进程收到docker pull请求后,便会从寄存服务器下载镜像;当遇到docker run请求或Dockerfile中的FROM指令时,若本地没有所需的镜像,Docker守护进程会自动从服务器下载镜像。
2.底层技术
Docker守护进程通过执行驱动程序(execution driver)来创建容器,它的runc驱动程序与内核功能密不可分。
- cgroups:负责管理容器使用的资源,冻结和解冻容器这两个docker pause命令所需的功能;
- Namespaces:负责容器之间的隔离,确保系统的其他部分与容器的文件系统、主机名、用户、网络和进程分开;
- 联合文件系统(Union File System,UFS):负责储存容器的镜像层;
3.周边技术
Swarm:集群方案
Compose:负责构建和运行由多个容器所组成的应用程序工具(用于开发和测试);
Machine:在本地或远程资源上安装和配置Docker主机,配置Docker客户端,切换环境;
Kitematic:Mac OS和Windows上的GUI,用于运行和管理Dokcer;
Docker Trusted Registry:用于存储和管理Docker镜像,Docker Hub的本地版本,与企业的安全架构集成;
网络连接:Weave、Project Calico、Overlay
网络解决方案:Consul、Registrator、SkyDNS、etcd
服务编排及集群管理:Kubernetes、Marathon、Fleet、Swarm
存储系统集成:volume plugin、Flocker、GlusterFS
二、镜像是如何生成的
1.构建环境的上下文
docker build命令需要Dockerfile和构建环境的上下文(build context)。
上下文是一组本地文件和目录,它被Dockerfile的ADD或COPY指令所引用,通常以目录路径的形式指定。
docker build -t test/cowsay-dockerfile .
其中“.”就是上下文,即当前目录,该目录下的所有文件和目录形成构建环境的上下文,并在生成镜像的过程中传递给Docker守护进程。
若没有指定上下文则被视为空。
注意:不要用“/”作为构建环境的上下文
说明:由于构建环境的上下文会被放进一个tar文件,然后传递给Docker守护进程,因此不要使用一个含有大量文件的目录,因为客户端需要把所有文件归档,交给守护进程(/home/user、downloads),这将花费大量时间处理。
其他方式的上下文:
A.URL以http或https开头
它会被假定为直接指向Dockerfile的链接,不会与任何上下文关联
B.git仓库
Docker客户端会把仓库和任何子模组(submodule)复制(clone)至另一个临时目录,并把它传给Docker守护进程作为构建环境的上下文。
以github.com/、git@、git://开头的路径被视为git仓库。
C.STDIN输入
在提供上下文参数处使用“-”,可以不包含上下文的Dockerfile,或是一个包含上下文及Dockerfile的归档文件。(tar.gz、xz、bzip2)
.dockerignore文件
从构建环境的上下文中排出不必要的文件,不支持完整的正则([A-Z]*)
.git   (.git会被排除,但dir1/.git不会)
*/.git  (dir1/.git会被排除,但.git和dir1/dir2/.git不会)
*/*/.git   (dir1/dir2/.git会被排除,但.git和dir1/.git不会)
*.sw?   (所有以sw后任一字符为后缀的文件会被排除,但dir1/test.swp不会)
2.镜像层
Dockerfile中的每个指令执行后都会产生一个新的镜像层,这个镜像层可以用来启动容器,一个新的镜像层的建立,是用上一层的镜像启动容器,然后执行Dockerfile的指令后,把它保存为一个新的镜像。
当Dockerfile指令成功执行后,中间使用过的容器将被删除,除非使用--rm=false参数。
注意:
虽然可以在RUN指令中执行持久的进程(SSH、MYSQL),但到下个指令或启动容器时,就不再运行了,除非使用ENTRYPOINT或CMD指令启动。
查看所有镜像层

当构建失败时,可以将失败前的那个层启动起来
FROM busybox:latest
RUN echo "This should work"
RUN /bin/bash -c echo "This won't"
之后开始构建镜像:
docker build -t echotest .
分析:
1)Docker为了执行指令而创建一个临时容器,分配容器ID
2)分配该容器所建立的镜像ID
3)将临时容器删除
3.缓存
Docker为了加速镜像构建速度,会将每一个镜像层缓存下来。
但是想要使用缓存,指令必须满足以下条件:
- 上一个指令能够在缓存中找到
- 缓存中存在一个镜像层,而它的指令和你的指令一模一样,父层也完全相同
- 在使用COPY和ADD指令时,如果他们引用文件的校验和或元数据发生变化,缓存也将失效
缓存失效
docker build --no-cache
4.基础镜像
当创建自己的镜像时,你需要决定从哪个基础镜像开始。
注意:
不同镜像会共享相同的基础镜像层,比如你已经有了ubuntu:14:04镜像,然后从Hub又下载一个基于它的镜像,那么你只会得到它在基础镜像之上改变过的部分,而非整个镜像。
重建镜像
当执行docker build时,Docker会查看FROM指令所指定的镜像,若本地没有则下载,若本地有则使用,而不会先检查有没有更新的版本。
这意味着必须对所有被依赖的父镜像显式地执行docker pull或删除,使build命令下载最新版。
5.Dockerfile指令
Exec:需要一个JSON数组,如[“executable”,“param1”,“param2”]
Shell:自由形式的字符串,字符串会传递给/bin/sh -c执行
可用指令集:
ADD
从构建环境上下文或远程URL复制文件至镜像。
CMD
当容器启动时执行指定的指令。多个CMD只有最后一个生效。
COPY
与ADD作用相同。不能指定上下文以外的src路径
COPY src dest
COPY ["src","dest"]
ENTRYPOINT
设置一个容器启动时运行的可执行文件以及默认参数。
常用于提供“启动”脚本,目的是在解析参数前,对变量和服务进行初始化。
ENV
设置镜像内的环境变量。可被随后的指令引用。
EXPOSE
向Docker表示该容器将会有一个进程监听所指定的端口。
FROM
设置Dockerfile使用的基础镜像。
MAINTAIER
把镜像中的作者元数据设定为指定的字符串。
ONBUILD
指定当镜像被用作另一个镜像的基础镜像时会执行的指令。
例如:把代码从一个已选定的目录中复制出来,并在执行构建脚本时使用它。
RUN
在容器内执行指定的指令,并把结果保存下来。
USER
设置任何后续的RUN、CMD或ENTRYPOINT指令执行时所用的用户。
注意:UID在主机和容器中时相同的,但用户名则可能被分配到不同的UID。
VOLUME
指定为数据卷的文件或目录。
WORKDIR
对任何后续的RUN、CMD、ENTRYPOINT、ADD或COPY指令设置工作目录。
Docker容器技术-Docker架构的更多相关文章
- Docker容器技术的核心原理
		目录 1 前言 2 docker容器技术 2.1 隔离:Namespace 2.2 限制:Cgroup 2.3 rootfs 2.4 镜像分层 3 docker容器与虚拟机的对比 1 前言 上图是百度 ... 
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
		版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ... 
- Prometheus 架构 - 每天5分钟玩转 Docker 容器技术(83)
		Prometheus 是一个非常优秀的监控工具.准确的说,应该是监控方案.Prometheus 提供了监控数据搜集.存储.处理.可视化和告警一套完整的解决方案. 让我们先来看看 Prometheus ... 
- Kubernetes 架构(下)- 每天5分钟玩转 Docker 容器技术(121)
		上一节我们讨论了 Kubernetes 架构 Master 上运行的服务,本节讨论 Node 节点. Node 是 Pod 运行的地方,Kubernetes 支持 Docker.rkt 等容器 Run ... 
- 通过例子理解 k8s 架构 - 每天5分钟玩转 Docker 容器技术(122)
		为了帮助大家更好地理解 Kubernetes 架构,我们部署一个应用来演示各个组件之间是如何协作的. 执行命令 kubectl run httpd-app --image=httpd --replic ... 
- Helm 架构 - 每天5分钟玩转 Docker 容器技术(161)
		在实践之前,我们先来看看 Helm 的架构. Helm 有两个重要的概念:chart 和 release. chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板.参数定 ... 
- Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)
		本节讨论 Prometheus Operator 的架构.因为 Prometheus Operator 是基于 Prometheus 的,我们需要先了解一下 Prometheus. Prometheu ... 
- Docker容器技术的PaaS云平台架构设计***
		基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ... 
- 【转帖】一文看懂docker容器技术架构及其中的各个模块
		一文看懂docker容器技术架构及其中的各个模块 原创 波波说运维 2019-09-29 00:01:00 https://www.toutiao.com/a6740234030798602763/ ... 
随机推荐
- MAC信息摘要
			MAC(Message Authentication Code ,消息认证码算法)是含有密钥散列函数算法,兼容MD和SHA算法的特性,并在此基础上加入了密钥.因此,MAC也称为HMAC. ... 
- 如何居中div?
			如何居中div? 水平居中 1 //给div设置一个宽度,然后添加margin:0 auto属性 2 3 div{ 4 width:200px; 5 margin:0 auto; 6 } 让绝对定位的 ... 
- bat遍历当前目录下的文件,批量重命名
			@echo off setlocal enabledelayedexpansion for %%x in (*) do ( if not "%%x"=="demo.bat ... 
- js创建对象的最佳方式
			1.对象的定义 ECMAScript中,对象是一个无序属性集,这里的“属性”可以是基本值.对象或者函数 2.数据属性与访问器属性 数据属性即有值的属性,可以设置属性只读.不可删除.不可枚举等等 访问器 ... 
- SQL.Cookbook 读书笔记5 元数据查询
			第五章 元数据查询 查询数据库本身信息 表结构 索引等 5.1 查询test库下的所有表信息 MYSQL SELECT * from information_schema.`TABLES` WHERE ... 
- IOS时间与日期处理
			本文转载至 http://blog.sina.com.cn/s/blog_9cd1705d0102v5x4.html 主要有以下类: NSDate -- 表示一个绝对的时间点NSTimeZone ... 
- No image!使用border-color属性来制作小三角形
			border属性在项目中使用的还是蛮频繁的.例如页签.按钮这样的. border简写属性是按照如下属性设置的: border:border-width/border-style/border-colo ... 
- 【BZOJ4325】NOIP2015 斗地主 搜索+剪枝
			[BZOJ4325]NOIP2015 斗地主 Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗 ... 
- 【BZOJ3083/3306】遥远的国度/树 树链剖分+线段树
			[BZOJ3083]遥远的国度 Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了 ... 
- 《从零开始学Swift》学习笔记(Day 35)——会使用下标吗?
			原创文章,欢迎转载.转载请注明:关东升的博客 看下面的示例代码是不是使用过: var studentList: String[] = ["张三","李四",&q ... 
