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

本文系转载,著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。

作者: 宋宝华

来源: 微信公众号linux阅码场(id: linuxdev)


最初的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相关服务):

sudo usermod -aG docker $USER

为了装逼需要,我们在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:

$git diff
 layout/book_index_template.html                    |    8 ++-
 text/05_Installing_Git/0_Source.markdown           |  14 ++++++
 text/05_Installing_Git/1_Linux.markdown            |  17 +++++++
 text/05_Installing_Git/2_Mac_104.markdown          |  11 +++++
 text/05_Installing_Git/3_Mac_105.markdown          |   8 ++++
 text/05_Installing_Git/4_Windows.markdown          |   7 +++
 .../1_Getting_a_Git_Repo.markdown                  |    7 +++-
 .../0_Comparing_Commits_Git_Diff.markdown        |   45 +++++++++++++++++++-
 .../0_Hosting_Git_gitweb_repoorcz_github.markdown |   4 +-
 9files changed, 115 insertions(+), 6 deletions(-)

一次完整的docker实作

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

一、client用pull命令从仓库把image拉到docker host

docker pull的格式是:

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

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

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

baohua@ubuntu:~$docker pull ubuntu:14.04
14.04:Pulling from library/ubuntu
c60055a51d74:Downloading [>                                                 ] 539.8 kB/65.69 MB
755da0cdb7d2:Download complete
969d017f67e6:Download complete
37c9a9113595:Download complete
a3d9f8479786:Download complete                                                                
…

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

$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu            ml 14.04              b969ab9f929b        4 weeksago         188 MB

二、在docker host上面运行Ubuntu 14.04于containers

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

在终端1上面运行

docker run -it --rm ubuntu:14.04 bash

在终端2上面运行

docker run -it --rm ubuntu:14.04 bash

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

$ docker ps
CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e3a913872698       ubuntu:14.04       "bash"              11seconds ago      Up 10 seconds                           wizardly_elion
db1c25753e97       ubuntu:14.04       "bash"              21seconds ago      Up 21 seconds                           adori

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

三、构建自己的image

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

root@e3a913872698:/# vim
bash: vim: command not found

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

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

$ mkdir myubuntu
$ cd myubuntu/
$ touch Dockerfile

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

# ubuntu 14.04 with vim and gcc
FROM ubuntu:14.04
MAINTAINER Barry Song<21cnbao@gmail.com>
RUN apt-get update && apt-getinstall –y vim gcc

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

下面build这个image:

$ docker build -t 21cnbao/myubuntu:14.04 .
time="2017-02-21T06:48:07+08:00"level=info msg="Unable to use system certificate pool: crypto/x509: systemroot pool is not available on Windows"
Sending build context to Docker daemon2.048 kB
Step 1/3 : FROM ubuntu:14.04
 ---> b969ab9f929b
Step 2/3 : MAINTAINER Barry Song<21cnbao@gmail.com>
 ---> Running in f1449746b58c
 ---> 5dacd7a6ee5d
Removing intermediate containerf1449746b58c
Step 3/3 : RUN apt-get update &&apt-get install vim gcc
 ---> Running in b1469caf3509
Ign http://archive.ubuntu.com trustyInRelease
Get:1 http://archive.ubuntu.comtrusty-updates InRelease [65.9 kB]
Get:2 http://archive.ubuntu.comtrusty-security InRelease [65.9 kB]
Get:3 http://archive.ubuntu.com trustyRelease.gpg [933 B]
Get:4 http://archive.ubuntu.com trustyRelease [58.5 kB]
Get:5 http://archive.ubuntu.comtrusty-updates/main Sources [485 kB]
…

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

docker run -it --rm 21cnbao/myubuntu:14.04 bash

发现gcc和vim都有了:

$ docker run -it --rm 21cnbao/myubuntu:14.04 bash
root@f33ee07caf43:/#gcc
gcc: fatal error: no input files
compilation terminated.
root@f33ee07caf43:/#

四、通过docker push把image提交到仓库

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

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

$ docker login --username=21cnbao --email=21cnbao@gmail.com
Flag--email has been deprecated, will be removed in 1.14.
Password:
Login Succeeded

下面开始push:

$ docker push 21cnbao/myubuntu
time="2017-02-21T07:17:59+08:00"level=info msg="Unable to use system certificate pool: crypto/x509: systemroot pool is not available on Windows"
The pushrefers to a repository [docker.io/21cnbao/myubuntu]
87157b68b121:Pushing [>                                                 ] 1.109 MB/134.7 MB
c9fc7024b484:Pushing [==================================================>] 3.072 kB
ca893d4b83a6:Pushing [==================================================>] 4.608 kB
153bd22a8e96:Pushing 7.168 kB
83b575865dd1:Pushing [==================================================>] 209.9 kB
918b1e79e358:Waiting
…

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

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

更多精彩更新中……欢迎关注账号:linux阅码场(id: linuxdev)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 《Docker从入门到实践》阅读笔记 原书地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo阅读 11,352评论 1 39
  • 最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料。本人反对暴风骤雨...
    景岳阅读 585评论 1 18
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,377评论 0 27
  • 基本概念 镜像Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器 容器容器是从镜像创建的运...
    巨子联盟阅读 7,541评论 0 3
  • 结束了衣食无忧,伸手钱就来到的在校学习生活之后,作为一名刚踏入社会的应届毕业生,我们抗拒,心浮气躁。 说工作压力大...
    漂流的小萍子阅读 391评论 1 4