转载请注明源文章出处: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. 1)docker安装目录:/var/lib/docker
  2. 2)docker日志文件:/var/log/messages
  3. 3)docker配置文件:/etc/sysconfig/docker
  4. 4)docker网络配置文件:/etc/sysconfig/docker-network
  5. 5)docker存储目录配置文件:/etc/sysconfig/docker-storage
  6. 6)docker pid目录:/run/docker.pid
  7. 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. Spring学习之旅(五)极速创建Spring AOP java工程项目

    编译工具:eclipse. 简单说一下,Spring  AOP是干嘛的? 假设你创建了一群类:类A,类B,类C,类D.... 现在你想为每个类都增加一个新功能,那么该怎么办呢?是不是想到了为每个类增加 ...

  2. Android为TV端助力 修改videoview的宽度和高度

    如果直接用android的videoview.他是不允许你随意的修改宽度和高度的,所以我们要重写videoview! package com.hysmarthotel.view; import and ...

  3. Android为TV端助力 切换fragment的两种方式

    使用add方法切换时:载入Fragment1Fragment1 onCreateFragment1 onCreateViewFragment1 onStartFragment1 onResume用以下 ...

  4. 有效运维的 on-call 机制

    [编者按]本文作者为云告警平台OneAlert负责人,著<云计算与OpenStack>,在IT运营管理.云计算方面从业10多年. 正文 互联网技术的发展,离不开运维支撑工作,没有零bug的 ...

  5. ERP承接新后台优惠规则问题

    一.后台在哪配置优惠规则? 1.设置优惠时间段: 2.添加优惠活动: 关于自动和手动: 自动:创建后,ERP同步数据后即生效.     点餐,活动会自动生效,自动计算金额. 手动:创建后,ERP需要手 ...

  6. Scala实现树形结构

    package graphx import java.util.ArrayList import java.util.List /** * Created by zhen on 2018/12/28. ...

  7. spring4笔记----spring生命周期属性

    init-method : 指定bean的初始化方法-spring容器会在bean的依赖关系注入完成后调用该方法 destroy-method :指定bean销毁之前的方法-spring容器将会在销毁 ...

  8. 获取Bing每日图片API接口

    bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...

  9. DAC连接

    专用管理员连接是一种特殊的SQL Server服务器诊断性质的连接,用于在正常或者说标准连接形式无法连接SQL Server服务器的情况下连接到服务器进行服务器性能或者错误诊断.DAC同样支持安全加密 ...

  10. Java循环语句怎么用?经典排序算法见真知

    Java中循环语句的使用,莫过于在排序算法中使用得最为经典. 排序算法非常的多,不过大体可以分为两种: 一种是比较排序,主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等. 另一种是非 ...