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/ ...
随机推荐
- OpenCV中的SURF算法介绍
SURF:speed up robust feature,翻译为快速鲁棒特征.首先就其中涉及到的特征点和描述符做一些简单的介绍: 特征点和描述符 特征点分为两类:狭义特征点和广义特征点.狭义特征点的位 ...
- Fibonacci数列的幂和 zoj 3774
题目大意: 求斐波那契数列前n项的k次幂和 Mod 1000000009. n<=1e18, k<=1e5 这题的k比较大,所以不能用矩阵乘法来递推.学到了新姿势... http ...
- window linux IPC ftok BY_HANDLE_FILE_INFORMATION
看这题目就很乱,心情当然也是不怎么美好了.前一段时间做了一个项目,AIX(Unix的一种)中的一个系统向WINDOWS移植,开发环境由IBM的C/C++(叫什么忘记了,好像是xlC)变为VC++. 这 ...
- android自定义View_2——Making the View Interactive
前言:绘制出一个view只是自定义view的一个部分,还需要自定义一些view的行为,来反馈用户的使用操作,反馈的 行为要合理性,就像真是的物理世界一样,不要太玄幻哦. 可以将view的行为封装到in ...
- 一个智障安装了一天的python和graphlab的血泪史
大概的过程是这样的: 先装了python3.6.1.,然后发现搞错了Σ(  ̄□ ̄||),是32 bit的,卸了重装python 3.6.1 (64bit). 然后装easy_install.pip.i ...
- node c++ addon注意事项
The module_name needs to match the filename of the final binary (minus the .node suffix).
- 求出10000以内所有的完全数-python
题目: 如何用python去求出下一个(大于28的)完全数? (求出10000以内所有的完全数) 分析: 如果一个数恰好等于它的因子之和,则称该数为"完全数".各个小于它的约数(真 ...
- ubuntu在vmware下使用问题
问题1: 在vmware虚拟机下安装的ubuntu系统,为了在windows和ubuntu之间拷贝数据方便,所以在vmware上安装了vmware tools.在安装了vmware tool之后会在u ...
- IOS开发UI篇之──自定义加载等待框(MBProgressHUD)
本文转载至 http://blog.csdn.net/xunyn/article/details/8064984 原文地址http://www.189works.com/article-89289 ...
- java随手记
javaagent可以hook字节码处理 java -javaagent:jebloader.jar -jar xxx.jar 结合javassist,可以动态替换方法内容 import java.i ...