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中基本的概念 文档.集合.数据库 与关系数据库的概念对比更容易理解
随机推荐
- [Python][小知识][NO.3] Python 使用系统默认浏览器打开指定URL的网址
1.前言 一般用到的地方: GUI交互界面下,单击某个按钮实现打开指定网址. 某帮助菜单项目,需要跳转网页显示时. O.O 某XX程序,需要植入网页弹窗广告时... 2.方法 调用 webbrowse ...
- 页面间固定参数,通过cookie传值
最后在做的页面,比如用户数据(用户头像,名称,年龄)这些信息,因为大部分页面都要用,之前是通过url地址传,另一页面接收.考虑到这样做会让url过长,因此,尝试使用cookie,把固定的值保存在coo ...
- (转)Android 之生成图形验证码
import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; impor ...
- 2步安装1个hive docker运行环境[centos7]
1 构建基础容器 基于centos环境docker环境快速搭建,执行步骤 docker build -t cenosbase7 . 执行此步骤就可以构建1个基础的centos基础运行环境 相关的文件如 ...
- Angular的MVC理解--节自Adam Free的Pro angularv2
1. 定义 Angular的核心是采用MVC模式,即Model-View-Controller,也即MVW,Model-View-Whatever. 如下图所示,借助于ASP.NET的MVC模式来描述 ...
- 自动化测试基础篇--Selenium发送测试报告邮件
来自:https://www.cnblogs.com/sanzangTst/p/8377870.html 发邮件需要用到python两个模块,smtplib和email,这俩模块是python自带的, ...
- Android开发--Service和Activity通过广播传递消息
Android的Service也运行在主线程,但是在服务里面是没法直接调用更改UI,如果需要服务传递消息给Activity,通过广播是其中的一种方法: 一.在服务里面发送广播 通过intent传送数据 ...
- c/c++拷贝构造函数和关键字explicit
c/c++拷贝构造函数和关键字explicit 关键字explicit 修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象:不加就可以隐式初始化对象: 下面的代码是可以正常编译执行的,但 ...
- Win10家庭版-添加[组策略]
win10家庭版有很多功能都不能用,这一次就碰到了一个找不到‘组策略’的问题,在网上搜索到了一个方法,记录一下: 新建一个txt,将下面内容复制到文本中: =====分隔符====== @echo o ...
- March 05th, 2018 Week 10th Monday
Fortune favors the bold. 勇者天佑. It has been increasingly apparent that courage is the main quality we ...