docker学习(1)--基础概念
转载请注明源文章出处: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
关于unionFS的实现:这里。
全篇没有图理解起来较为困难,这些文章都有图文说明。接下来会详细说一下docker的相关命令,以及镜像的创建方式和踩过的一些坑。
docker学习(1)--基础概念的更多相关文章
- Docker学习之基本概念
Docker学习之基本概念 作为一个后端noder,不了解docker有点说不过去,这节开始,学习一些docker层面的东西. 什么是docker Docker最初是dotCloud公司创始人Solo ...
- docker学习(2)--基础命令
转载请注明源出处:http://www.cnblogs.com/lighten/p/6875355.html 1.基本命令 搭建好docker环境之后,使用docker help命令查看docker的 ...
- lua学习之基础概念篇
基础概念 程序块 (chunk) 定义 lua 中的每一个源代码文件或在交互模式(Cmd)中输入的一行代码都称之为程序块 一个程序块就是一连串语句或者命令 lua 中连续的语句不需要分隔符,但为了可读 ...
- Java基础学习之基础概念与环境搭建(1)
1.Java基础概念 1.1.Java语言的特点 Java语言是简单易学的 Java语言是面向对象(封装.继承和多态) Java语言是平台无关的(一次编译,到处运行) Java语言是可靠的.安全的(异 ...
- Docker学习1-基本概念
Docker Docker的基本概念 Docker是为开发人员和系统管理员而设计的以容器的形式开发.部署和运行应用程序的平台.使用Linux容器去部署应用程序称为容器化,利用容器部署应用程序方便简单. ...
- Kubernetes学习之基础概念
本文章目录 kubernetes特性 kubernetes集群架构与组件 一.kubernetes集群架构 二.集群组件 三.ubernetes集群术语 深入理解Pod对象 一.Pod容器分类 基础容 ...
- ---Docker学习随笔---基础管理部分---
docker是什么?提供快速.高效.轻量的微服务平台 1. 背景介绍突破虚拟机对资源占用高.启动时间长.镜像存储大.集群规模小等限制,摆脱操作系统级的隔离级别,实现进程级管理.主要专用名词: chro ...
- Docker学习笔记一 概念、安装、镜像加速
本文地址:https://www.cnblogs.com/veinyin/p/10406378.html Docker 是一个容器,可以想象成一个轻便的虚拟机,但不虚拟硬件和操作系统. 优点:启动快 ...
- MongoDB学习笔记-基础概念
mongodb中基本的概念 文档.集合.数据库 与关系数据库的概念对比更容易理解
随机推荐
- Spring学习之旅(五)极速创建Spring AOP java工程项目
编译工具:eclipse. 简单说一下,Spring AOP是干嘛的? 假设你创建了一群类:类A,类B,类C,类D.... 现在你想为每个类都增加一个新功能,那么该怎么办呢?是不是想到了为每个类增加 ...
- Android为TV端助力 修改videoview的宽度和高度
如果直接用android的videoview.他是不允许你随意的修改宽度和高度的,所以我们要重写videoview! package com.hysmarthotel.view; import and ...
- Android为TV端助力 切换fragment的两种方式
使用add方法切换时:载入Fragment1Fragment1 onCreateFragment1 onCreateViewFragment1 onStartFragment1 onResume用以下 ...
- 有效运维的 on-call 机制
[编者按]本文作者为云告警平台OneAlert负责人,著<云计算与OpenStack>,在IT运营管理.云计算方面从业10多年. 正文 互联网技术的发展,离不开运维支撑工作,没有零bug的 ...
- ERP承接新后台优惠规则问题
一.后台在哪配置优惠规则? 1.设置优惠时间段: 2.添加优惠活动: 关于自动和手动: 自动:创建后,ERP同步数据后即生效. 点餐,活动会自动生效,自动计算金额. 手动:创建后,ERP需要手 ...
- Scala实现树形结构
package graphx import java.util.ArrayList import java.util.List /** * Created by zhen on 2018/12/28. ...
- spring4笔记----spring生命周期属性
init-method : 指定bean的初始化方法-spring容器会在bean的依赖关系注入完成后调用该方法 destroy-method :指定bean销毁之前的方法-spring容器将会在销毁 ...
- 获取Bing每日图片API接口
bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...
- DAC连接
专用管理员连接是一种特殊的SQL Server服务器诊断性质的连接,用于在正常或者说标准连接形式无法连接SQL Server服务器的情况下连接到服务器进行服务器性能或者错误诊断.DAC同样支持安全加密 ...
- Java循环语句怎么用?经典排序算法见真知
Java中循环语句的使用,莫过于在排序算法中使用得最为经典. 排序算法非常的多,不过大体可以分为两种: 一种是比较排序,主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等. 另一种是非 ...