一、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架构的更多相关文章

  1. Docker容器技术的核心原理

    目录 1 前言 2 docker容器技术 2.1 隔离:Namespace 2.2 限制:Cgroup 2.3 rootfs 2.4 镜像分层 3 docker容器与虚拟机的对比 1 前言 上图是百度 ...

  2. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...

  3. Prometheus 架构 - 每天5分钟玩转 Docker 容器技术(83)

    Prometheus 是一个非常优秀的监控工具.准确的说,应该是监控方案.Prometheus 提供了监控数据搜集.存储.处理.可视化和告警一套完整的解决方案. 让我们先来看看 Prometheus ...

  4. Kubernetes 架构(下)- 每天5分钟玩转 Docker 容器技术(121)

    上一节我们讨论了 Kubernetes 架构 Master 上运行的服务,本节讨论 Node 节点. Node 是 Pod 运行的地方,Kubernetes 支持 Docker.rkt 等容器 Run ...

  5. 通过例子理解 k8s 架构 - 每天5分钟玩转 Docker 容器技术(122)

    为了帮助大家更好地理解 Kubernetes 架构,我们部署一个应用来演示各个组件之间是如何协作的. 执行命令 kubectl run httpd-app --image=httpd --replic ...

  6. Helm 架构 - 每天5分钟玩转 Docker 容器技术(161)

    在实践之前,我们先来看看 Helm 的架构. Helm 有两个重要的概念:chart 和 release. chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板.参数定 ...

  7. Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)

    本节讨论 Prometheus Operator 的架构.因为 Prometheus Operator 是基于 Prometheus 的,我们需要先了解一下 Prometheus. Prometheu ...

  8. Docker容器技术的PaaS云平台架构设计***

    基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...

  9. 【转帖】一文看懂docker容器技术架构及其中的各个模块

    一文看懂docker容器技术架构及其中的各个模块 原创 波波说运维 2019-09-29 00:01:00 https://www.toutiao.com/a6740234030798602763/ ...

随机推荐

  1. 切比雪夫多项式(Chebyshev Polynomials)

    切比雪夫多项式在逼近理论中有重要的应用.这是因为第一类切比雪夫多项式的根(被称为切比雪夫节点)可以用于多项式插值.相应的插值多项式能最大限度地降低龙格现象,并且提供多项式在连续函数的最佳一致逼近. 参 ...

  2. Java 学习笔记及资源

    Spring框架入门HelloWorld :http://www.importnew.com/13246.html  (iteye 唐 博客,跟我学Sprint) Spring 框架下载地址:http ...

  3. git branch merge到master

    使用merge可以合并多个历史记录的流程. 如下图所示,bugfix分支是从master分支分叉出来的. 合并 bugfix分支到master分支时,如果master分支的状态没有被更改过,那么这个合 ...

  4. boot2docker里报"no space left on device" error的解决方法

    docker中pull远程image时:报 no space left on device virtualbox中调大虚拟内存即可.. 之前调的硬盘大小...

  5. ios 蓝牙相关

      ios蓝牙开发项目实战 -(附小米手环实例)   前言 最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文章实在太多了,成吨成吨的文章出现,但是很遗憾都只是一些皮 ...

  6. 在其他app里预览文档

    本文转载至 http://www.cocoachina.com/newbie/basic/2013/0515/6212.html iOS中的沙盒可以让平台更加的安全,这也是沙盒给用户带来的最主要好处. ...

  7. C++ 基础知识回顾(string基础、智能指针、迭代器、容器类)

    [1] string基础 [1.1] string 的构造 #include <iostream> #include <string> int main() { using n ...

  8. Cocos2d-x Lua中实例:帧动画使用

    下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画. 帧动画实例 下面我们再看看具体的程序代码,首 ...

  9. SharePoint服务器端对象模型 之 对象模型概述(Part 2)

    (三)Url 作为一个B/S体系,在SharePoint的属性.方法参数和返回值中,大量的涉及到了Url,总的来说,涉及到的Url可以分为如下四类: 绝对路径:完整的Url,包含了协议头(http或h ...

  10. IOS崩溃 异常处理(NSSetUncaughtExceptionHandler)

    iOS已发布应用中对异常信息捕获和处理 代码下载地址:http://download.csdn.net/detail/daiyelang/6740205 iOS开发中我们会遇到程序抛出异常退出的情况, ...