docker最初的2小时docker从入门到入门.docx
- 文档编号:7384314
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:5
- 大小:19.38KB
docker最初的2小时docker从入门到入门.docx
《docker最初的2小时docker从入门到入门.docx》由会员分享,可在线阅读,更多相关《docker最初的2小时docker从入门到入门.docx(5页珍藏版)》请在冰豆网上搜索。
docker最初的2小时docker从入门到入门
Docker最初的2小时(Docker从入门到入门)
最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料。
本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学习高级用法,深层原理,一轮轮迭代。
坚决反对一上来就搞几百页厚的东西把人脑子弄乱。
Docker是什么?
KVM、Virtualbox、Vmware是虚拟出机器,让每个实例看到一个单独的机器;而Docker是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操作系统,而且彼此之间隔离。
假设没有Docker,然后有进程1和进程2,它们的运行将类似下图,进程1和进程2共享kernel,它们是同一OS下2个进程,因此必须拥有不同PID,但是又共享网卡,共享IP地址,看到一样的根文件系统(不chroot的情况下)等,可以用LinuxIPC手段进程间通信。
有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后,使用DockerQuickstartTerminal运行。
如果是Ubuntu,可以按照16.04就是命令:
sudoapt-getupdate&&apt-getinstalldocker。
Ubuntu安装Docker后,可以把当前用户加到Docker用户组以便当前用户也有权限操作Dockerclient和host之间的通信socket(之后请重启Docker相关服务):
sudousermod-aGdocker$USER为了装逼需要,我们在DockerHub网页注册一个用户名,我注册的用户名是21cnbao。
这样以后,就可以自己提交自己的image了。
Docker的架构Docker中可能涉及到3个机器或者更多机器,一个运行Docker命令的client,一个包含images并以容器(Container)形式运行image的主机,一个Docker的images仓库。
client与dockerhost上面的dockerdaemon通信。
当然dockerclient和host可以运行于一台机器(我们做实验的时候是一台),默认的Docker仓库是DockerHub。
一般的流程中,client发pull命令从仓库把image拉到dockerhost,然后通过run命令指挥image到host上面弄一个Container来跑这个image。
当然也可以是相反的流程,client通过build命令在host上面创建一个自己的image,然后通过push命令把image推到仓库。
之后这个image可以被别的人或者自己pull。
image到底是个什么鬼?
Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
image为特定目的而生,比如弄了个Nginx的image后,这个image就把Nginx的东西包罗万象了,无论是张三、王五、六麻子还是七癞子,无论它是什么电脑,什么操作系统,只要支持Docker,它把这个Nginx的image下载下来后,拿dockerrun命令就可以弄容器跑Nginx了。
这样,用户就不用装Nginx以及它依赖的一切包了(通常装一个软件弄依赖也能把你弄地烦躁死了)。
这样看起来,Docker实在是居家旅行,杀人越货之必备良器也!
镜像构建时,会一层层叠加,前一层是后一层的基础。
每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。
所以这个很类似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-
9fileschanged,115insertions(),6deletions(-)这些叠加的最后一层就是Container,所以你在Container里面改了文件,其实不会进image。
一次完整的Docker实作说了那么多后,我们必须亲自动手玩了。
下面把pull,run,build,push都玩一次,破除神秘感。
一个典型的运行流程如下:
1.client用pull命令从仓库把image拉到dockerhostdockerpull的格式是:
dockerpull[选项][DockerRegistry地址]<仓库名>:
<标签名>默认地址是DockerHub。
仓库名:
这里的仓库名是两段式名称,既/,“/”前面一般是用户名。
对于DockerHub,如果不给出用户名,则默认为library,也就是官方镜像。
下载Ubuntu14.04的image(以Ubuntu为例):
baohua@ubuntu:
~$dockerpullubuntu:
14.04
14.04:
Pullingfromlibrary/ubuntu
c60055a51d74:
Downloading[>]539.8kB/65.69MB
755da0cdb7d2:
Downloadcomplete
969d017f67e6:
Downloadcomplete
37c9a9113595:
Downloadcomplete
a3d9f8479786:
Downloadcomplete
…运行dockerimages命令看看下载的images:
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
ubuntuml14.04b969ab9f929b4weeksago188MB2.在dockerhost上面运行Ubuntu14.04于Containers我们现在运行Ubuntu14.04中的bashshell,因为docker运行image于容器时,需要指定主进程(本例的主进程为bash)。
在终端1上面运行:
dockerrun-it--rmubuntu:
14.04bash在终端2上面运行:
dockerrun-it--rmubuntu:
14.04bash这样我们就运行了Ubuntu14.04这个image的2次实例(得到2个容器),Linux下面的ps命令是看进程的,Docker下面就是看image的实例容器了。
$dockerps
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
e3a913872698ubuntu:
14.04'bash'11secondsagoUp10secondswizardly_elion
db1c25753e97ubuntu:
14.04'bash'21secondsagoUp21secondsadoring_shannonimage和container之间的关系类似程序与进程之间的关系,一个静若处子,一个动如脱兔。
比如程序QQ,运行一次就是1个QQ进程,再运行一个QQ就是第2个QQ进程。
同样道理,一个image也可以运行多份Container。
3.构建自己的image现在想在Ubuntu14.04中增加Vim和GCC,构建一个增量image,因为目前的Ubuntuimage里面没有这样的命令:
root@e3a913872698:
/#vim
bash:
vim:
commandnotfound于是在Ubuntu14.04这个image基础上面,叠加一层,然后把它提交到dockerhub的21cnbao的仓库。
我们需要在客户端电脑上面创建一个Dockerfile文件(该文件用于描述image),以实现在现有的Ubuntu14.04上面做增量的目的。
$mkdirmyubuntu
$cdmyubuntu/
$touchDockerfile用Vim编辑Dockerfile,添加如下内容:
#ubuntu14.04withvimandgcc
FROMubuntu:
14.04
MAINTAINERBarrySong<21cnbao@>
RUNapt-getupdate&&apt-getinstall–yvimgccRUN指令的含义是在指定在源image内执行一条命令,本例更新APT缓存,并且安装Vim和GCC以形成一个增量image。
下面build这个image:
$dockerbuild-t21cnbao/myubuntu:
14.04.
time='2017-02-21T06:
48:
0708:
00'level=infomsg='Unabletousesystemcertificatepool:
crypto/x509:
systemrootpoolisnotavailableonWindows'
SendingbuildcontexttoDockerdaemon2.048kB
Step1/3:
FROMubuntu:
14.04
--->b969ab9f929b
Step2/3:
MAINTAINERBarrySong<21cnbao@>
--->Runninginf1449746b58c
--->5dacd7a6ee5d
Removingintermediatecontainerf1449746b58c
Step3/3:
RUNapt-getupdate&&apt-getinstallvimgcc
--->Runninginb1469caf3509
IgntrustyInRelease
Get:
1trusty-updatesInRelease[65.9kB]
Get:
2trusty-securityInRelease[65.9kB]
Get:
3trustyRelease.gpg[933B]
Get:
4trustyRelease[58.5kB]
Get:
5trusty-updates/mainSources[485kB]
…下面运行21cnbao/myubuntu14.04这个镜像:
dockerrun-it--rm21cnbao/myubuntu:
14.04bash发现GCC和Vim都有了:
$dockerrun-it--rm21cnbao/myubuntu:
14.04bash
root@f33ee07caf43:
/#gcc
gcc:
fatalerror:
noinputfiles
compilationterminated.
root@f33ee07caf43:
/#4.通过dockerpush把image提交到仓库在DockerHub上面创建一个仓库myubuntu,该仓库创建后,全名将为21cnbao/myubuntu。
下面push这个image到DockerHub,之前我们需要登录到DockerHub:
$dockerlogin--username=21cnbao--email=21cnbao@
Flag--emailhasbeendeprecated,willberemovedin1.14.
Password:
LoginSucceeded下面开始push:
$dockerpush21cnbao/myubuntu
time='2017-02-21T07:
17:
5908:
00'level=infomsg='Unabletousesystemcertificatepool:
crypto/x509:
systemrootpoolisnotavailableonWindows'
Thepushreferstoarepository[docker.io/21cnbao/myubuntu]
87157b68b121:
Pushing[>]1.109MB/134.7MB
c9fc7024b484:
Pushing[==================================================>]3.072kB
ca893d4b83a6:
Pushing[==================================================>]4.608kB
153bd22a8e96:
Pushing7.168kB
83b575865dd1:
Pushing[==================================================>]209.9kB
918b1e79e358:
Waiting
…通过DockerHub进哥的仓库看一眼,发现大功告成了。
2小时结束,相信你已经爱上Docker。
相爱容易相处难,痛苦才刚刚开始。
人生若只如初见,何事秋风悲画扇。
等闲变却故人心,却道故人心易变。
后面如果有时间,再完成一个《Docker相处的8小时》。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- docker 最初 小时 入门