Docker 最初的2小时(Docker从入门到入门)

2018 年 6 月 7 日 CSDN云计算

版权声明:本文为博主原创文章,未经博主允许不得转载。

作者博客地址:

https://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。相爱容易相处难,痛苦才刚刚开始。人生若只如初见,何事秋风悲画扇。等闲变却故人心,却道故人心易变。

登录查看更多
0

相关内容

Docker - An open platform for distributed applications for developers and sysadmins.
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
76+阅读 · 2020年4月24日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
179+阅读 · 2020年1月1日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
22+阅读 · 2019年11月7日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
【开源书】PyTorch深度学习起步,零基础入门(附pdf下载)
专知会员服务
110+阅读 · 2019年10月26日
分布式入门,怎样用PyTorch实现多GPU分布式训练
机器之心
7+阅读 · 2019年5月3日
深度学习这些“坑”你们有没有踩过(入门误区)
计算机视觉战队
5+阅读 · 2019年4月27日
一万小时贫穷定律
互联网er的早读课
5+阅读 · 2018年8月22日
各编程领域最好的入门书籍
程序猿
27+阅读 · 2018年7月29日
基于TensorFlow的深度学习实战
七月在线实验室
9+阅读 · 2018年4月25日
贝叶斯网络入门
论智
15+阅读 · 2017年11月19日
结束创业后,我如何用两个月时间入门AI
AI前线
3+阅读 · 2017年10月2日
TResNet: High Performance GPU-Dedicated Architecture
Arxiv
8+阅读 · 2020年3月30日
Real-time Scalable Dense Surfel Mapping
Arxiv
5+阅读 · 2019年9月10日
Arxiv
3+阅读 · 2018年10月8日
Arxiv
4+阅读 · 2018年9月25日
Arxiv
5+阅读 · 2017年4月12日
VIP会员
相关VIP内容
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
76+阅读 · 2020年4月24日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
179+阅读 · 2020年1月1日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
22+阅读 · 2019年11月7日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
【开源书】PyTorch深度学习起步,零基础入门(附pdf下载)
专知会员服务
110+阅读 · 2019年10月26日
相关资讯
分布式入门,怎样用PyTorch实现多GPU分布式训练
机器之心
7+阅读 · 2019年5月3日
深度学习这些“坑”你们有没有踩过(入门误区)
计算机视觉战队
5+阅读 · 2019年4月27日
一万小时贫穷定律
互联网er的早读课
5+阅读 · 2018年8月22日
各编程领域最好的入门书籍
程序猿
27+阅读 · 2018年7月29日
基于TensorFlow的深度学习实战
七月在线实验室
9+阅读 · 2018年4月25日
贝叶斯网络入门
论智
15+阅读 · 2017年11月19日
结束创业后,我如何用两个月时间入门AI
AI前线
3+阅读 · 2017年10月2日
相关论文
Top
微信扫码咨询专知VIP会员