作者:宋宝华

blog.csdn.net/21cnbao/article/details/56275456

最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料。本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学习高级用法,深层原理,一轮轮迭代。坚决反对一上来就搞几百页厚的东西把人脑子弄乱。

Docker是什么?

KVM, Virtualbox, Vmware是虚拟出机器,让每个实例看到一个单独的机器;而Docker是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操作系统,而且彼此之间隔离。假设没有Docker,然后有进程1和进程2,它们的运行将类似下图,进程1和进程2共享kernel,它们是同一OS下2个进程,因此必须拥有不同PID,但是又共享网卡,共享IP地址,看到一样的根文件系统(不chroot的情况下)等,可以用Linux IPC手段进程间通信。

有Docker的情况下,假设进程1和进程2运行于不同的容器,那么进程1和进程2都觉得自己和对方没有半毛钱关系,都觉得自己拥有自己的根文件系统,自己的网卡等,然后进程1和进程2的PID还可以一样,比如假设2个都是100。但是,此100非彼100。

Virtualbox等虚拟机的思路则完全不一样,如果进程1和进程2运行于不同的虚拟机,则操作系统都是双份的,它们感觉自己在不同的虚拟电脑上面跑。

由于可见,Docker达到了类似虚拟机的效果,但是又没有虚拟机的开销,它虚拟的层次更加高。Docker不虚拟机器,仅仅虚拟应用的运行环境。

为什么Docker也可以“虚拟化”?

虚拟化,本质上一种虚幻,给你一种幻觉,让你觉得拥有的很多甚至拥有全世界,哪怕你实际是一只蝼蚁。

经过本人多年研究,虚拟化的技术分为2种,一种是虚拟一个世界,第二个是虚拟一个氛围。

比如我们在现实生活里面是个屌丝,但是在虚拟人生的游戏里面,我们可以是王思聪++,集美貌智慧财富正义于一生。虚拟人生的游戏,构建一个整个的新世界,这个世界,人人有房住,天下没有贼。那么这个就是硬件都变了,你的内核都变了。这个是Virtualbox,KVM这种虚拟出一个新世界的思路。

虚拟一个氛围,是Docker的做法。例如贵公司的Linux部门以前只有3,4个工程师,然后有一个manager,后来有30个人了,你就可以分什么内核组、驱动组、应用组等更多的组,然后又多出几个manager。这种组,类似于名称空间,在每一个单独名称空间的manager,都觉得自己是个manager,于是他会爽那么一点点。

最开始是这样的:

后来是这样的:

如果这样还不够,还可以搞声卡驱动组manager,网卡驱动组manager,反正可以不停地搞。大家在各自的Container里面占山为王。

Docker就是这样的名称空间让各自在同样的Linux平台上面各自暗爽,装到你自己的容器里面爽。

安装Docker

如果是Windows主机,可以下载docker-toolbox一路安装,安装过程中如果提示什么错,可以把360等类似软件关闭。Windows安装好Docker后,使用Docker Quickstart Terminal运行。

如果是Ubuntu,可以按照https://docs.docker.com/engine/installation/linux/ubuntu/网页进行安装。最简单的Ubuntu 16.04就是命令:sudo apt-get update&& apt-get install docker。

Ubuntu安装Docker后,可以把当前用户加到Docker用户组以便当前用户也有权限操作Docker client和host之间的通信socket(之后请重启Docker相关服务):

为了装逼需要,我们在Docker Hub网页注册一个用户名,我注册的用户名是21cnbao。这样以后,就可以自己提交自己的image了。

Docker的架构

Docker中可能涉及到3个机器或者更多机器,一个运行Docker命令的client, 一个包含images并以容器(container)形式运行image的主机,一个Docker的images仓库。client与Docker host上面的Docker daemon通信。当然Docker client和host可以运行于一台机器(我们做实验的时候是一台),默认的Docker仓库是Docker Hub。

一般的流程中,client发pull命令从仓库把image拉到Docker host,然后通过run命令指挥image到host上面弄一个container来跑这个image。

当然也可以是相反的流程,client 通过build命令在host上面创建一个自己的image,然后通过push命令把image推到仓库。之后这个image可以被别的人或者自己pull。

image到底是个什么鬼?

Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。image为特定目的而生,比如弄了个nginx的image后,这个image就把nginx的东西包罗万象了,无论是张三、王五、六麻子还是七癞子,无论它是什么电脑,什么操作系统,只要支持Docker,它把这个nginx的image下载下来后,拿Docker run命令就可以弄容器跑nginx了。这样,用户就不用装nginx以及它依赖的一切包了(通常装一个软件弄依赖也能把你弄地烦躁死了)。这样看起来,Docker实在是居家旅行,杀人越货之必备良器也!

镜像构建时,会一层层叠加,前一层是后一层的基础。

每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。所以这个很类似Git里面这一次提交相对于上一次提交的diff:

这些叠加的最后一层就是container,所以你在container里面改了文件,其实不会进image。

一次完整的Docker实作

说了那么多后,我们必须亲自动手玩了。下面把pull,run,build,push都玩一次,破除神秘感。一个典型的运行流程如下:

1. client用pull命令从仓库把image拉到Docker host

docker pull的格式是:

docker pull[选项] [Docker Registry地址]  <仓库名>:<标签名>

默认地址是 DockerHub。仓库名:这里的仓库名是两段式名称,既 / ,“/”前面一般是用户名。对于 Docker Hub,如果不给出用户名,则默认为 library ,也就是官方镜像。

下载 Ubuntu14.04的image(以Ubuntu为例):

运行docker images命令看看下载的images:

2. 在Docker host上面运行Ubuntu 14.04于containers

我们现在运行Ubuntu14.04中的bash shell,因为Docker运行image于容器时,需要指定主进程(本例的主进程为bash)。

在终端1上面运行

在终端2上面运行

这样我们就运行了Ubuntu14.04这个image的2次实例(得到2个容器), Linux下面的ps命令是看进程的,Docker下面就是看image的实例容器了。

image和container之间的关系类似程序与进程之间的关系,一个静若处子,一个动如脱兔。比如程序QQ,运行一次就是1个QQ进程,再运行一个QQ就是第2个QQ进程。同样道理,一个image也可以运行多份container。

3. 构建自己的image


现在想在Ubuntu 14.04中增加vim和gcc,构建一个增量image,因为目前的Ubuntu image里面没有这样的命令:

于是在Ubuntu 14.04这个image基础上面,叠加一层,然后把它提交到Docker hub的21cnbao的仓库。

我们需要在客户端电脑上面创建一个Dockerfile文件(该文件用于描述image),以实现在现有的Ubuntu 14.04上面做增量的目的。

用vim编辑Dockerfile,添加如下内容:

RUN 指令的含义是在指定在源image内执行一条命令,本例更新APT 缓存,并且安装vim和 gcc以形成一个增量image。

下面build这个image:

下面运行21cnbao/myubuntu 14.04这个镜像:

发现gcc和vim都有了:

4. 通过docker push把image提交到仓库


在Docker hub上面创建一个仓库myubuntu,该仓库创建后,全名将为21cnbao/myubuntu。

下面push这个image到Docker Hub,之前我们需要登录到Docker Hub:

下面开始push:

通过Docker Hub进哥的仓库看一眼,发现大功告成了。

2小时结束,相信你已经爱上Docker。相爱容易相处难,痛苦才刚刚开始。人生若只如初见,何事秋风悲画扇。等闲变却故人心,却道故人心易变。

长按订阅更多精彩▼

Docker 最初的2小时(Docker从入门到入门)相关推荐

  1. 宋宝华:Docker 最初的2小时(Docker从入门到入门)

    最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料.本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学 ...

  2. 宋宝华- KVM最初的2小时(KVM从入门到入不了门)

    接着<Docker最初的2小时(Docker从入门到入门)>继续聊,再花10个小时写出<KVM最初的2小时(KVM从入门到入不了门)>.坦白讲,由于KVM远远比Docker要复 ...

  3. devops和docker_通过免费的2小时Docker课程学习DevOps基础知识

    devops和docker Docker is a powerful DevOps tool for putting your apps into "containers." Do ...

  4. 一小时Docker教程

    cSphere.cn – 国内首个docker管理平台 Menu 一小时Docker教程 Docker基础 这篇基础文章是方便用户在使用cSphere平台之前,了解docker基础知识. 针对已经有一 ...

  5. Docker教程(1)Docker 入门

    这里只是业余爱好,浅浅的研究了一下Docker,更详细的资料请参考:<Docker中文文档>.<Docker入门教程> 博文整理自阮一峰老师的网络日志 2013年发布至今, D ...

  6. Docker 入门系列(2)- Docker 镜像, 免 sudo 使用 docker 命令、获取查看、修改镜像标签、查找删除创建镜像、导入导出镜像

    1. 免 sudo 使用 docker 命令 如果还没有 docker group 就添加一个 sudo groupadd docker 将用户加入该 group 内 sudo gpasswd -a ...

  7. 【Docker系列教程之一】docker入门

    我们在理解 docker 之前,首先我们得先区分清楚两个概念,容器和虚拟机. 我们用的传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系 ...

  8. docker数据圈_《Docker从入门到跑路》之镜像和容器的基本操作

    一.获取镜像 官方提供了一个公共镜像仓库Docker Hub,默认是从这上面获取镜像的. 搜素镜像使用docker search 命令: # docker search --help Usage:do ...

  9. Docker:从入门到入门

    Content 一.Docker的安装 1.1 环境查看 1.2 安装 1.3 卸载镜像 1.4 阿里云镜像加速 1.4 底层原理 1.4.1 Docker是怎么工作的? 1.4.2 Docker V ...

最新文章

  1. 自然语言处理中的预训练技术发展史
  2. 【拾贝】版本控制-git 建立Team项目
  3. icon-font与svg
  4. 判断字符为空_49. 把字符串转换成整数(剑指offer)
  5. HDU4622(后缀自动机)
  6. Chapter 1. Introduce
  7. 基础数学落后与高端人才流失
  8. java不显示图片_Java图片显示不出来,怎么解决
  9. CCF大专委2018年大数据发展趋势预测
  10. 2020年领导最满意的可视化工具!分分钟做好数据报表,吊打python
  11. 记Ubuntu20.04搭建jekyll博客+github环境踩坑-终结版
  12. sqlite3 判断数据库和表的状态
  13. web前端简历个人技能该怎么写?
  14. FbinstTools制作多系统启动U盘(Windows+Linux)
  15. oracle卸载报错,oracle卸载
  16. python 普通克里金(Kriging)法
  17. A* operator/(A*, A*)‘ must have an argument of class or enumerated type
  18. Salesforce 解决chatter简档删除不掉记录类型问题
  19. 关于Keil debug 出现cannot access target shutting down debug session 错误提示
  20. TOY++美私奢玩:TEAx正茶链盟 +雅贡臻品登陆台北!跨界斜杠派展

热门文章

  1. HDU1285拓扑排序模版题
  2. 线段树 ---- 牛客多校4 ETree Xor 区间异或分段
  3. 差分约束问题 ---- 2019ccpc哈尔滨A. Artful Paintings[二分+差分约束+建图剪枝]
  4. vivo是安卓手机吗_vivo手机更新安卓9.0!4款产品尝鲜:有你的吗?
  5. python画画代码大全_太赞了,微软正式推出 Python 零基础教程!
  6. @RequestBody映射
  7. oracle scott用户
  8. vector大小为1,如果直接输出它-2,为何不是-1?
  9. linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...
  10. java实现模拟考试系统,基于jsp的驾照模拟考试系统a-JavaEE实现驾照模拟考试系统a - java项目源码...