本文共 8386 字,大约阅读时间需要 27 分钟。
Docker is an open-source engine that automates the deployment of any application as a lightweight, portable, self-sufficient container that will run virtually anywhere.
是 PaaS 提供商开源的一个基于 LXC 的高级容器引擎, 托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。Docker近期非常火热,无论是从 GitHub 上的代码活跃度,还是Redhat宣布在,都给业界一个信号,这是一项创新型的技术解决方案。就连 Google 公司的 Compute Engine 也支持 docker 在其之上运行,国内“BAT”先锋企业百度Baidu App Engine(BAE)平台也是。
Docker产生的目的就是为了解决以下问题:
Docker的主要特性如下:
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式(xen、kvm、vmware)相比具有众多的优势。
首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
- 更快速的交付和部署 对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
对比传统虚拟机总结:
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker以Linux容器LXC为基础,实现轻量级的操作系统虚拟化解决方案。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便,具体改进有:
Docker作为一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker可以自动化打包和部署任何应用、创建一个轻量级私有PaaS云、搭建开发测试环境、部署可扩展的Web应用等。这决定了它在企业中的应用场景是有限的,Docker将自己定位为“分发应用的开放平台”,其网站上也明确地提到了Docker的典型应用场景:
- Automating the packaging and deployment of applications
- Creation of lightweight, private PAAS environments
- Automated testing and continuous integration/deployment
- Deploying and scaling web apps, databases and backend services
对应用进行自动打包和部署,创建轻量、私有的PAAS环境,自动化测试和持续整合与部署,部署和扩展Web应用、数据库和后端服务。
平台即服务一般与大数据量系统同在,反观当前我司各IT系统,可以在以下情形下使用docker替代方案:
docker不足
另外,Docker是面向应用的,其终极目标是构建PAAS平台,而现有虚拟机主要目的是提供一个灵活的计算资源池,是面向架构的,其终极目标是构建一个IAAS平台,所以它不能替代传统虚拟化解决方案。目前在容器可管理性方面,对于方便运维,提供UI来管理监控各个containers的功能还不足,还都是第三方实现如DockerUI、Dockland、Shipyard等。
Docker使用客户端-服务器(client-server)架构模式。Docker客户端会与Docker守护进程进行通信。Docker守护进程会处理复杂繁重的任务,例如建立、运行、发布你的Docker容器。Docker客户端和守护进程可以运行在同一个系统上,当然你也可以使用Docker客户端去连接一个远程的Docker守护进程。Docker客户端和守护进程之间通过socket或者RESTful API进行通信。
更多内容请参考: 及。
Docker 镜像就是一个只读的模板。例如,一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
镜像可以用来创建 Docker 容器。 Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。Docker 利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
镜像是只读的,容器在启动的时候创建一层可写层作为最上层。仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
docker团队控制的top-level的顶级repository,即,存放了数量庞大的镜像供用户下载,任何人都能读取,里面包含了许多常用的镜像,如ubuntu, mysql ,redis, python等。
个人公共库也是被托管在Docker Hub上,网络上的其它用户也可以pull你的仓库(如docker pull seanloook/centos6
)你可以在修改完自己的container之后,通过commit命令把它变成本地的一个image,push到自己的个人公共库。(在此之前你需要docker login
登录,或者vi ~/.dockercfg
。)
从镜像运行出一个容器docker run -t -i 68edf809afe7 /bin/bash记录下CONTAINER IDdocker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1528136ff541 172.29.88.222:5000/centos6:latest /bin/bash 40 minutes ago Exited (0) .. sad_mestorf从将容器提交成一个新的image(format is "sudo docker commit/ ")# docker commit -m " new images /docker.sean " -a "docker New" fcbd0a5348ca seanloook/centos6:test_tag_seanfe022762070b09866eaab47bc943ccb796e53f3f416abf3f2327481b446a9503docker images可以看到这个新的镜像# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEseanloook/centos6 test_tag_sean fe022762070b About an hour ago 212.7 MBsean:5000/library/centos6 latest 68edf809afe7 3 weeks ago 212.7 MB
在你commit为一个image后,通过push可以推送到个人公共registry中。此时需要login后才能push(当然没有设定login的Username,在第一次push时也会提示输入),接下来比较有意思。
# docker login https://index.docker.io/v1/Username: seanloookPassword: Email: seanlook7@gmail.comLogin Succeeded
如果你已经有docker官网的账号,则只需要输入正确的用户名和密码就可以登录,邮箱不做验证;
如果所输入的Username不存在,则这一步便是自动从官网创建一个账号,并发送一封确认邮件,以后也可以从 登录。(是不是太简单了?)login的同时,也会在~/.dockercfg中加入认证信息
# cat ~/.dockercfg{ "https://index.docker.io/v1/":{ "auth":"c2Vhbmxvb29rOk15UGFzc3dvcmQ=","email":"seanlook7@gmail.com"}}
其中auth=base64(username:password),base64编码与解码。
保存到个人公共库上,push可以是repos,格式docker push <username>/<repo_name>
:
# docker push seanloook/centos6:test_tag_seanThe push refers to a repository [seanloook/centos6] (len: 1)Sending image listPushing repository seanloook/centos6 (1 tags)511136ea3c5a: Image already pushed, skipping5b12ef8fd570: Image already pushed, skipping68edf809afe7: Image already pushed, skippingfe022762070b: Image successfully pushedPushing tag for rev [fe022762070b] on {https://cdn-registry-1.docker.io/v1/repositories/seanloook/centos6/tags/test_tag_sean}
上面的push操作也可以是docker push seanloook/centos6
(但不能是docker push fe022762070b
)。
这些镜像其他人也可以搜索得到docker search seanloo
。
首先与另外一种仓库区分——Docker Hub Private Repository,它简单理解为公网上的个人私有库,与上面的个人公共库相对应,在Docker Hub上Create Repository时选择Private便是,只有你自己才可以读写。
这里所说的私有仓库是指自己在本地服务器上搭建的专属自己的内部仓库docker-registry
,俗称“私服”,供无法访问互联网的内部网络使用,或者镜像到本地一份以加快pull、push的速度。
它与公共仓库最明显的区分就是repository的命名,如必须使用带.
的主机名或域名,后面必须接:port
,如sean.tp-link.net:5000/centos6:your_tag_name
,而公共仓库第一个斜杠前表示的是登录用户名。命名关系到推送到哪个服务器的哪个位置,更过内容可以关注。
docker client告诉docker daemon运行一个容器,例如:docker run -i -t ubuntu /bin/bash
转载地址:http://hjzlo.baihongyu.com/