转载请注明源文章出处:http://www.cnblogs.com/lighten/p/6841677.html

1.前言

  docker的官网:这里。下一段摘自官网描述。

  docker是世界领先的软件容器平台。开发人员使用docker可以消除与同事的代码协作时产生的“在我机器上运行是正常的”等问题。运营商使用docker在独立的容器中运行和管理应用程序,以获得更好的计算密度。企业使用docker构建灵活的软件传送通道,可以更快,更安全地运行新功能,并且对于Linux和Windows Server应用程序都有信心。

  什么是容器。使用容器,使一切软件运行时所需的一切都被打包成隔离的容器。与VM不同,容器不捆绑完整的操作系统-只需要软件工作所需要的库和设置。这使得系统高效,轻便,自包含,并保证软件始终运行一致,无论它在哪里部署。

2. 结构

2.1 文件目录结构

  之前写过一篇在ubuntu下安装docker的教程:这里,目前有些过时了。这里介绍一下docker安装完成之后的相关目录结构,这里是centos的,其它的估计也大同小异。

1)docker安装目录:/var/lib/docker
2)docker日志文件:/var/log/messages
3)docker配置文件:/etc/sysconfig/docker
4)docker网络配置文件:/etc/sysconfig/docker-network
5)docker存储目录配置文件:/etc/sysconfig/docker-storage
6)docker pid目录:/run/docker.pid
7)docker命令:/usr/bin/docker

  docker的安装目录会包含容器和镜像,所以可以会非常大,如果需要改变其路径,有两种方法可以选择:

  1.使用参数-g来修改docker的存储文件夹

    ubuntu系统下:编辑/etc/default/docker文件,添加-g参数:

      DOCKER_OPTS="-g /路径"

    centos系统下:编辑/etc/sysconfig/docker文件:

      other_args="-g /路径"

    重启docker服务。

  2.使用链接方式

    停止docker->防止意外备份tar -zcC /var/lib/docker /xxx.tar.gz->移动文件夹mv /var/lib/docker /xxx->建立链接:ln -s /xxx /var/lib/docker->启动docker。

2.2 软件架构

  这里,这篇文章介绍的很详细,这里对其说的相关内容进行整理补充。

  docker使用Go语言进行开发,使用的是客户端/服务器(C/S)架构的模式。客户端会与docker的守护进程进行通讯,所发送的docker pull,run,...等命令都是客户端传递给docker的守护进程进行处理的。这两者可以在同一台机器上,也可以使用客户端连接远程的docker守护进程。两者之间采取socket或者是RESTful API进行通讯。

  docker主要包含三个东西:images、registeries、containers。

  ①images镜像就是容器的一个模板,只读。容器通过模块和一些可配置项构成,容器运行不会修改镜像的相关内容。每一个镜像都是由一系列层(layers)组成。docker使用unionFS将这些层联合成一个镜像。unionFS允许独立文件系统的文件及文件夹被透明覆盖,形成一个单独连贯的文件系统。当你改变了一个镜像,比如升级了其中一个程序,一个新的层将被创建,所以不需要替换整个镜像或重新建立,只是添加了一个新的层或升级了。层使得分发docker镜像变的快捷。

  ②registeries是镜像仓库,可以理解为github,docker的公有仓库就是docker hub。

  ③containers容器就像一个文件夹,包含所需的环境,由镜像创建。

  所给链接文章的整体架构图已经十分清晰了,这里简单复述一下。主要的模块有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container。docker客户端要运行一个容器会发送指令给docker的守护进程,守护进程将指令解析成一个个Engine层的job,先通过Driver层的graphdriver去Graph找镜像,没有就会去docker的Registry拉去镜像。Driver层有三块,另两块就是networkdriver和execdriver。这两块通过一个libcontainer来对容器container操作。

3.其它知识

  docker的容器技术和虚拟机技术有很大的不同。虚拟机需要一个完整的操作系统,及各类组件,比较重,而docker很轻,原因就在于其不需要那些内容,本质上还是使用操作系统的内核,比如一个centos镜像,大小不到200MB,可实际上操作系统是很大的。Linux系统主要由两部分组成:rootfs和bootfs。前者是用户空间,后者是内核空间kernel,docker是不需要内核空间的,其使用的是主机自身内核。而centos镜像就是rootfs,linux不同版本的区别也主要是rootfs的不同。/dev,/proc,/bin等目录都存在于用户空间。所以docker可以支持多种Linux镜像。这也就是与虚拟机的不同之处。

  之前讲过镜像是一层层够成的,比如底层使用centos,安装一个软件就往上加一层。这样的好处在于共享资源。centos镜像可以被很多个镜像共同使用。问题来了,如果其中有一个容器修改了centos镜像中的一个文件,其它所有的容器会被改变吗?答案是不会,之前也说过镜像是不可写的。容器启动的时候会在其所构建的镜像最上面添加一个可写层,这一层被称为容器层,其下面都是镜像层。所有的改动都只发生在容器层,镜像层是只读的。这里简单说下原理,比如镜像层有很多,如果每层都有一个相同路径的文件a,读取的时候是从上往下读的,先看容器层,先读到的为准。所以如果有改动,发生在最上层的容器层也就被最先使用,下面的镜像层只需只读就可以了。

4.后记

  上面简单的介绍了一下docker的一个基本结构。由client发出指令,守护进程接收处理。docker镜像的构成和容器运行的过程,以及docker比较重要的三个部分:images,containers,registries。参考了一些比较优秀的文章,这里记录一下,没看明白的可以去看看这些文章(此文章也是这些的归纳总结而已):

  http://www.cnblogs.com/shanheyongmu/category/994426.html

  Docker源码分析(一):Docker架构

  非常详细的 Docker 学习笔记

  关于unionFS的实现:这里

  全篇没有图理解起来较为困难,这些文章都有图文说明。接下来会详细说一下docker的相关命令,以及镜像的创建方式和踩过的一些坑。

docker学习(1)--基础概念的更多相关文章

  1. Docker学习之基本概念

    Docker学习之基本概念 作为一个后端noder,不了解docker有点说不过去,这节开始,学习一些docker层面的东西. 什么是docker Docker最初是dotCloud公司创始人Solo ...

  2. docker学习(2)--基础命令

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6875355.html 1.基本命令 搭建好docker环境之后,使用docker help命令查看docker的 ...

  3. lua学习之基础概念篇

    基础概念 程序块 (chunk) 定义 lua 中的每一个源代码文件或在交互模式(Cmd)中输入的一行代码都称之为程序块 一个程序块就是一连串语句或者命令 lua 中连续的语句不需要分隔符,但为了可读 ...

  4. Java基础学习之基础概念与环境搭建(1)

    1.Java基础概念 1.1.Java语言的特点 Java语言是简单易学的 Java语言是面向对象(封装.继承和多态) Java语言是平台无关的(一次编译,到处运行) Java语言是可靠的.安全的(异 ...

  5. Docker学习1-基本概念

    Docker Docker的基本概念 Docker是为开发人员和系统管理员而设计的以容器的形式开发.部署和运行应用程序的平台.使用Linux容器去部署应用程序称为容器化,利用容器部署应用程序方便简单. ...

  6. Kubernetes学习之基础概念

    本文章目录 kubernetes特性 kubernetes集群架构与组件 一.kubernetes集群架构 二.集群组件 三.ubernetes集群术语 深入理解Pod对象 一.Pod容器分类 基础容 ...

  7. ---Docker学习随笔---基础管理部分---

    docker是什么?提供快速.高效.轻量的微服务平台 1. 背景介绍突破虚拟机对资源占用高.启动时间长.镜像存储大.集群规模小等限制,摆脱操作系统级的隔离级别,实现进程级管理.主要专用名词: chro ...

  8. Docker学习笔记一 概念、安装、镜像加速

    本文地址:https://www.cnblogs.com/veinyin/p/10406378.html  Docker 是一个容器,可以想象成一个轻便的虚拟机,但不虚拟硬件和操作系统. 优点:启动快 ...

  9. MongoDB学习笔记-基础概念

    mongodb中基本的概念 文档.集合.数据库 与关系数据库的概念对比更容易理解

随机推荐

  1. Android为TV端助力 转载:内存泄露与内存溢出的区别

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...

  2. python安装小结

    一.python下载地址:http://www.activestate.com/activepython/downloads 二.1.没有安装request会出一下错误: 2.解决办法:pip ins ...

  3. How do I install Daydream on my phone?

    Google's philosophy with their newest VR platform is simple. In order to offer the best possible exp ...

  4. Android SurfaceView实现跟随手指移动的光标

    实例 public class DragSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable{ priv ...

  5. Android绘制优化(二)布局优化

    前言 我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升.当然这只是布局优化的一方面,那么如何来进行布局的分析和优化呢?本篇文章会给你一个满意 ...

  6. Testlink1.9.17使用方法(第八章 测试执行/报告BUG)

    第八章 测试执行/报告BUG QQ群交流:585499566 把他们放到一起,是因为报告bug是在执行的过程中同步进行的——即执行用例的过程中一旦发现bug我们需要立即把其报告到我们的bug管理系统r ...

  7. 自动化测试基础篇--Selenium中JS处理滚动条

    摘自https://www.cnblogs.com/sanzangTst/p/7692285.html 前言 什么是JS? JS就是JavaScript: JavaScript 是世界上最流行的脚本语 ...

  8. c/c++ 标准库 map set 删除

    标准库 map set 删除 删除操作 有map如下: map<int, size_t> cnt{{2,22}, {3,33}, {1,11}, {4,44}; 删除方法: 删除操作种类 ...

  9. php获取ip地址所在的地理位置的实现

    1,通过腾讯或者新浪提供的接口来获取(新浪和腾讯类似) <?php     function getIPLocation($queryIP){      $url = 'http://ip.qq ...

  10. C# -- 使用XmlDocument或XDocument创建xml文件

    使用XmlDocument或XDocument创建xml文件 需引用:System.Xml; System.Xml.Linq; 1.使用XmlDocument创建xml(入门案例) static vo ...