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中基本的概念 文档.集合.数据库 与关系数据库的概念对比更容易理解
随机推荐
- Vue 组件之间传值
一.父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据. 子组件部分: 这是 header.vue 的 HTML 部分,logo 是在 data 中定义的变量. 如果需要从 ...
- Javascript数组系列三之迭代方法2
今天我们来继续 Javascript 数组系列的文章,上文 <Javascript数组系列二之迭代方法1> 我们说到一些数组的迭代方法,我们在开发项目实战的过程中熟练的使用可以大大提高我们 ...
- ELK的sentinl告警配置详解
背景 sentinl的监控&告警是通过watch实现的. 一.Watch Execution 执行开始的时候, watcher为watch创建watch执行上下文. 执行上下文提供脚本和模板, ...
- SQL Server Replication的分发服务器的快照文件夹位置查找
SQL Server分发服务器配置中,需要配置快照文件夹(Snapshot Folder),用于存储发布的数据和架构文件的工作目录,那么如何查找当前SQL Server数据库服务器的分发服务器的快照文 ...
- SQL Server如何用触发器捕获DML操作的会话信息
需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数 ...
- oracle 分组函数执行分析
先上例了: select job as "JOB1", avg(sal) as "avg sal" from scott.emp group by " ...
- IL范围不正确
一.昨晚在改过一个bug之后在本机测试没问题,于是提交代码在测试服务器上发布之后测试的也没问题. 既然测试的都没问题,那就要往正式环境中发布咯,然而,发布到正式环境中就报错:IL范围不正确,这个错是打 ...
- Linux: yum配置说明
下面是利用 man yum.conf 命令获取到的有关yum配置的说明: yum.conf(5) yum configuration file yum.conf(5) NAME yum.conf - ...
- js中图片上传,多次上传同一张不生效
在做图片上传的功能时, 使用删除功能删除了一张图片, 然后想重新上传原来删除的图片, 结果预览不显示, 也不能上传成功 解决办法, 在删除方法里置空input $("#id").f ...
- Iframe框架+table布局 +div布局实例
<td colspan="2" style="width: 80%"> <iframe src="http://www.baidu. ...