http://blog.csdn.net/pipisorry/article/details/50754385
对于运维来说,Docker提供了一种可移植的标准化部署过程,使得规模化、自动化、异构化的部署成为可能甚至是轻松简单的事情;而对于开发者来说,Docker提供了一种开发环境的管理方法,包括映像、构建、共享等功能。
经常忘记启用它,或者在切换工程时忘记切换它,这会遇到含糊的出错信息,另人倍感困惑。
它无法提供“纯粹的”隔离,只能是Python级别的隔离(系统库和非python的依赖项仍然会出问题)。
我通常不想在正式产品中运行它,这就意味着在开发环境和正式产品的不一致。
它让人感觉有点“黑客”作法:它是依靠修改脚本和设置新路径实现的。
[why-i-hate-virtualenv-and-pip]
1)一致的开发环境
使用Docker,可以保证整个研发团队使用一致的开发环境。
2)开发环境与最终的生产环境保持一致
这减少了部署出错的可能性。
3)简化了编译和构建的复杂性
对于一些动辄数小时的编译和构建工作,可以用Docker来简化。
4)在开发时只需Docker
无需在自己的开发主机上搭建各种编程语言环境。
5)可以使用同一编程语言的多个版本
可以使用同一编程语言(如python, python, ruby, ruby, java, node)等的多个版本,无需解决多版本冲突的问题。
6)部署很简单
应用程序在容器中运行,和在生产环境中部署运行是一样的。只需打包你的代码并部署到带有同样镜像的服务器上,或者是把代码连同原镜像建立一个新Docker镜像再直接运行新镜像。
7)使用自己喜欢的开发IDE
仍然可以继续使用自己喜欢的开发IDE,无需运行VirtualBox虚拟机或SSH。
其它:
Docker将业务打包成容器后,可以根据需求弹性扩展,快速扩展,轻松做到负载均衡。业务打包成容器后作为单独的节点,利于运维,哪里坏了修哪里。开发中可以将Docker当做一个运行环境。也就是说,开发中代码通过挂载的形式放入到容器中。在容器外开发的代码放容器里跑。所有的业务可以根据功能拆分成一个个服务放到容器中,便于扩展。
ELK、Graphite、Grafana已经是很成熟的运维管理了,但是结合了Docker让整个运维更加的便利。开源ELK+Graphite/Grafana和Docker可以有效的结合起来高效运维。
用Docker可以保存容器,保存时间点,中小规模实现容灾,这个需要更多的实践(从携程事件中的脑洞大开)。
Deploying and scaling web apps, databases and backend services
[唱衰Docker,给大红大火的Docker泼点冷水]
皮皮blog
docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App(叫Payload)装在Container内,通过Linux Container技术的包装将App变成一种标准化的、可移植的、自管理的组件,这种组件可以在你的latop上开发、调试、运行,最终非常方便和一致地运行在production环境下。
Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器。它原本是 dotCloud 启动的一个业余项目,并在前些时候开源了。它吸引了大量的关注和讨论,导致 dotCloud 把它重命名到 Docker Inc。它最初是用 Go 语言编写的,它就相当于是加在 LXC(LinuX Containers,linux 容器)上的管道,允许开发者在更高层次的概念上工作。 Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境。Docker 利用了 LXC, cgroups 和 Linux 自己的内核。和传统的虚拟机不同的是,一个 Docker 容器并不包含一个单独的操作系统,而是基于已有的基础设施中操作系统提供的功能来运行的。这里有一个 Stackoverflow 的答案,里面非常详细清晰地描述了所有 Docker 不同于纯粹的 LXC 的功能特性 Docker 会像一个可移植的容器引擎那样工作。它把应用程序及所有程序的依赖环境打包到一个虚拟容器中,这个虚拟容器可以运行在任何一种 Linux 服务器上。这大大地提高了程序运行的灵活性和可移植性,无论需不需要许可、是在公共云还是私密云、是不是裸机环境等等。
Docker采用了aufs文件系统来设计一个可以层层堆栈的Container映象文件,将Container内的所有程序(包括应用程序、相关函式库、配置文件),都打包进Docker映象档,并且提供了一个Dockerfile配置文件来记录建立Container过程的每一个步骤包括参数。只要在任何支持Docker平台的环境中,就可以从这个映象档来建立出一个一模一样的Container来执行同一个应用程序。如此一来,应用程序等于是可以透过Docker映象檔,或甚至只需要Dockerfile,就能将程序执行环境带着走,移动到任何支持Docker的环境中。Docker公司也释出API,可以用来控制所有的Container相关指令,任何人只要使用同一套Docker,就等于有了同一套管理和建立Container的方法,也就等同于将Container运用标准化了。
然后,在一个机器环境里,你还可以同时跑几个docker container。
image和container的关系可以理解为“类”和“实例”的关系。而且在一个机器环境里跑的container还可以是基于不同的image。你可以随时把一个container打包成一个image作再次的部署。
其次,你在一个container里作的修改也可以更新到基于同一image的其它container里。因为可以只更新修改过的部分,类似于版本控制下的更新。[Docker教程:docker远程repository和自建本地registry]
最后,它与VM的不同之处就在于一个字:轻。一个VM实际上包含了一套虚拟的硬件,一个完整的OS,再加入应用程序。而docker container只是一个隔离的应用程序运行环境,对于应用程序来说,docker环境相当于一个完整的OS,但是实际上它是跑在宿主OS上的,一个container只包含这个应用环境与宿主机环境的差异部分,非常的轻量。更贴切的类比应该是:类似于python的virtualenv。只不过这是一个OS层面的virtualenv。
Docker的核心底层技术是LXC(Linux Container),Docker在其上面加了薄薄的一层,添加了许多有用的功能。这篇stackoverflow上的问题和答案很好地诠释了Docker和LXC的区别,能够让你更好的了解什么是Docker, 简单翻译下就是以下几点:
[利用Docker构建开发环境]
包括:1)Docker客户端:即Docker的可执行程序,它可以通过命令行和API的形式与Docker的守护进程进行通信。
2)Docker守护进程:Docker守护进程提供Docker服务。
Note:
Docker镜像:Docker中的镜像就是一堆文件的集合,并不是像VM那样的是一个操作系统。镜像可以简单到只有一个程序文件。如果你写一个helloworld 静态编译后放到一个空的Image中(可以用FROM scratch作为基础镜像),那么整个image的大小,就是你编译后的二进制文件的大小。 如果你不是静态编译的话,就要把相应的链接库放到镜像中相应的位置,才能使得程序正确运行,否则会提示找不到文件。官方提供的ubuntu等基础镜像,就是把依赖的文件放到正确的地方,从而使得绝大部分程序可以正常运行。和VM的镜像是完全不同的概念。
一个Container的映象档内可以安装多支程序,例如同时安装Ubuntu、Apache、MySQL、Node.js、Ruby等。不过,Docker官方建议,一只程序安装在一个Container内,再把这些Container迭起来提供一个完整的服务。
Docker称这是一种Microservices(微服务)的新软件架构,将组成一个应用系统的每一个Stack,拆解成许多小型服务,例如Apache服务、MySQL服务、Node.js服务、Ruby服务,每一个服务都是包在Container里的一只程序,例如MySQL服务就是部署在Container内的MySQL。这么做的好处是可以建立一个松散耦合的弹性应用程序架构,也能轻易地抽换其中一个Container,例如要升级MySQL,只需要重载新版MySQL的Container映象文件,就可以完成数据库升级,不用将整套应用系统停机。
Container和Image 在Docker的世界里,Image是指一个只读的层(Layer),这里的层是AUFS里的概念,最直观的方式就是看一下docker官方给出的图:
Docker使用了一种叫AUFS的文件系统,这种文件系统可以让你一层一层地叠加修改你的文件,最底下的文件系统是只读的,如果需要修改文件,AUFS会增加一个可写的层(Layer),这样有很多好处,例如不同的Container可以共享底层的只读文件系统(同一个Kernel),使得你可以跑N多个Container而不至于你的硬盘被挤爆了!这个只读的层就是Image!而如你所看到的,一个可写的层就是Container。
那Image和Container的区别是什么?很简单,他们的区别仅仅是一个是只读的层,一个是可写的层,你可以使用docker commit 命令,将你的Container变成一个Image,也就是提交你所运行的Container的修改内容,变成一个新的只读的Image,这非常类似于git commit命令。[利用Docker构建开发环境][Docker的镜像和容器的区别]
皮皮blog
下载并安装Docker Toolbox
基本上一路确定就ok了,但是如果已经安装了git的,可以去掉git安装的选择。
Note: 安装需要cpu支持并开启虚拟化;且系统是64位的?
每次使用docker时都要启用dockerRT?
安装完成后,命令行中进入docker toolbox安装目录下cd /d/Docker\ Toolbox/,输入sh start.sh。
结果如下:
不启用时会出现
docker info
出现以下内容就说明安装正确
[install on Windows]
[DOCKER windows 7 详细安装教程]
[Install Docker Engine]
from:http://blog.csdn.net/pipisorry/article/details/50754385
ref:Docker one社区相关译文
Docker中文社区:Docker入门教程*
Docker入门教程*
Docker认识基础
Docker和虚拟化 - chszs的专栏