社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

如何用两个小时入门 Docker?

马哥Linux运维 • 6 年前 • 794 次点击  

来源:CSDN

ID:CSDNnews

最初的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 相处的8小时》。


【书籍推荐】

 

Docker技术入门与实战(第2版)

ISBN978-7-111-55582-7

作者:杨保华 戴王剑 曹亚仑 编著

定价:69.00

学习Docker的第一本入门书,畅销书全面升级。基于Docker 1.12及以上版本。

 

循序渐进学Docker

ISBN978-7-111-54854-6

作者:李金榜 尹烨 刘天斯 陈纯著

定价:59.00

腾讯Docker应用与实践经验分享。腾讯官方Docker核心技术团队4位专家撰写,总结腾讯大规模应用Docker的技术心得

Docker源码分析

ISBN978-7-111-51072-7

作者:孙宏亮

定价:59.00

国内首部Docker源码分析著作;从源码角度全面解析Docker设计与实现;填补Docker理论与实践之间的鸿沟



《Linux云计算及运维架构师高薪实战班》2018年07月16日即将开课中,120天冲击Linux运维年薪30万,改变速约~~~~

    *声明:推送内容及图片来源于网络,部分内容会有所改动,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

    - END -



    更多Linux好文请点击【阅读原文】

    ↓↓↓


    今天看啥 - 高品质阅读平台
    本文地址:http://www.jintiankansha.me/t/JX7AmhHW0t
    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/13988
     
    794 次点击