http://blog.csdn.net/pipisorry/article/details/50754385
Why docker
对于运维来说,Docker提供了一种可移植的标准化部署过程,使得规模化、自动化、异构化的部署成为可能甚至是轻松简单的事情;而对于开发者来说,Docker提供了一种开发环境的管理方法,包括映像、构建、共享等功能。
程序员在搭建开发环境时遇到的一些问题
- 软件安装麻烦,比如很多公司都使用redhat,一般开发人员又不给root,安装一个nginx或者是mysql都得自己下载编译安装 权限问题,没有root,一些软件无法运行,例如dnsmasq;
- 没有root,无法修改hosts,无法netstat -nptl,无法tcpdump,无法iptable
- 隔离性差,例如不同的开发人员如果在同一台主机环境下共享开发,虽然是用户隔离,但端口如果不规范可能会冲突;同一个Mysql如果权限管理不好很有可能误删别人的数据
- 可移植性差,例如和生产环境不一致,开发人员之间也无法共享;更严重的情况是当有新人入职时,通常需要又折腾一遍开发环境,无法快速搭建
这些问题可以通过在本地搭建虚拟机来解决,但虚拟机是一个很笨重的解决方案,Docker是一个非常轻量级的方案,而且还拥有虚拟机没有的一些功能,例如标准化Image,Image共享等,更重要的是,利用Docker,你可以运行非常多的容器,在你的Mac下搭建一个分布式的开发环境根本不是什么大的问题,而且对内存、磁盘和cpu的消耗相比传统的虚拟机要低许多,这些都要归功于AUFS和LXC这两大神奇的技术。
使用virtualenv配置python开发环境的问题
经常忘记启用它,或者在切换工程时忘记切换它,这会遇到含糊的出错信息,另人倍感困惑。
它无法提供“纯粹的”隔离,只能是Python级别的隔离(系统库和非python的依赖项仍然会出问题)。
我通常不想在正式产品中运行它,这就意味着在开发环境和正式产品的不一致。
它让人感觉有点“黑客”作法:它是依靠修改脚本和设置新路径实现的。
[why-i-hate-virtualenv-and-pip]
为什么要在开发中使用Docker
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可以保存容器,保存时间点,中小规模实现容灾,这个需要更多的实践(从携程事件中的脑洞大开)。
常见使用场景
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
why not?
Docker基本概念
2013年,dotCloud这家PaaS服务公司开源释出了一套将Container标准化的平台Docker,大受欢迎,所以,dotCloud决定以Docker为名成立新公司力推。
Docker是一个新的容器化的技术,它轻巧,且易移植,号称“build once, configure once and run anywhere"。docker是Go写的。
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的认识
可以认为docker是一个类似虚拟机(VM)的东西,你可以把你要发布的应用打包成一个docker image,然后部署到实际的机器上。这种机器可以是实际的服务器,也可以是VPS或其它PaaS之类的。
然后,在一个机器环境里,你还可以同时跑几个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的核心底层技术
Docker的核心底层技术是LXC(Linux Container),Docker在其上面加了薄薄的一层,添加了许多有用的功能。这篇stackoverflow上的问题和答案很好地诠释了Docker和LXC的区别,能够让你更好的了解什么是Docker, 简单翻译下就是以下几点:
- Docker提供了一种可移植的配置标准化机制,允许你一致性地在不同的机器上运行同一个Container;而LXC本身可能因为不同机器的不同配置而无法方便地移植运行;
- Docker以App为中心,为应用的部署做了很多优化,而LXC的帮助脚本主要是聚焦于如何机器启动地更快和耗更少的内存;
- Docker为App提供了一种自动化构建机制(Dockerfile),包括打包,基础设施依赖管理和安装等等;
- Docker提供了一种类似git的Container版本化的机制,允许你对你创建过的容器进行版本管理,依靠这种机制,你还可以下载别人创建的Container,甚至像git那样进行合并;
- Docker Container是可重用的,依赖于版本化机制,你很容易重用别人的Container(叫Image),作为基础版本进行扩展;
- Docker Container是可共享的,有点类似github一样,Docker有自己的INDEX,你可以创建自己的Docker用户并上传和下载Docker Image;
- Docker提供了很多的工具链,形成了一个生态系统;这些工具的目标是自动化、个性化和集成化,包括对PAAS平台的支持等;
Docker 特征
Docker的特性主要包括以下几点:
- 速度飞快以及优雅的隔离框架
- 物美价廉
- CPU/内存的低消耗
- 快速开/关机
- 跨云计算基础构架
Docker 组件与元素
Docker三个组件:
- Docker Client 是用户界面,它支持用户与Docker Daemon之间通信。
- Docker Daemon运行于主机上,处理服务请求。
- Docker Index是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份。
Note: Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。
[视频]
Docker采用C/S架构开发,整体架构如图所示:
包括:1)Docker客户端:即Docker的可执行程序,它可以通过命令行和API的形式与Docker的守护进程进行通信。
2)Docker守护进程:Docker守护进程提供Docker服务。
三个基本要素:
- Docker Containers负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。
- Docker Images是一个只读模板,用来运行Docker容器。
- DockerFile是文件指令集,用来说明如何自动创建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的镜像和容器的区别]
在讨论Docker组件和基本要素如何交互之前,让我们来谈谈Docker的支柱。
Docker使用以下操作系统的功能来提高容器技术效率:
- Namespaces 充当隔离的第一级。确保一个容器中运行一个进程而且不能看到或影响容器外的其它进程。
- Control Groups是LXC的重要组成部分,具有资源核算与限制的关键功能。
- UnionFS(文件系统)作为容器的构建块。为了支持Docker的轻量级以及速度快的特性,它创建了用户层。
运行应用程序:把它们放在一起
运行任何应用程序,都需要有两个基本步骤:
- 构建一个镜像。
- 运行容器。
这些步骤都是从Docker Client的命令开始的。Docker Client使用的是Docker二进制文件。在基础层面上,Docker Client会告诉Docker Daemon需要创建的镜像以及需要在容器内运行的命令。当Daemon接收到创建镜像的信号后,会进行如下操作:
第1步:构建镜像
Docker Image是一个构建容器的只读模板,它包含了容器启动所需的所有信息,包括运行程序和配置数据。
每个镜像都源于一个基本的镜像,然后根据Dockerfile中的指令创建模板。对于每个指令,在镜像上创建一个新的层面。
一旦镜像创建完成,就可以将它们推送到中央registry:
Docker Index,以供他人使用。然而,Docker Index为镜像提供了两个级别的访问权限:公有访问和私有访问。你可以将镜像存储在私有仓库,Docker官网有私有仓库的套餐可以供你选择。总之,公有仓库是可搜索和可重复使用的,而私有仓库只能给那些拥有访问权限的成员使用。
Docker Client可用于Docker Index内的镜像搜索。
第2步:运行容器
运行容器源于我们在第一步中创建的镜像。当容器被启动后,一个读写层会被添加到镜像的顶层。当分配到合适的网络和IP地址后,需要的应用程序就可以在容器中运行了。
Docker的安装
mac下的安装
直接下载并安装
https://download.docker.com/mac/stable/Docker.dmg
https://download.docker.com/mac/edge/Docker.dmg
命令行安装(下载慢,修改下载点也麻烦)
$brew update
$brew cask install docker
Note: brew install docker这样安装是找不到app的。
[镜像加速器]
linux下的安装
Ubuntu 14.04 x64安装Docker,需要确保Ubuntu的版本是64位,而且内核版本(uname -r )需大于3.10版(如Ubuntu 12.04的软件仓库中没有Docker软件)。
root@pika:/home/pi# apt-get update
root@pika:/home/pi# apt-get install docker.io
#Ubuntu的软件仓库里,Docker叫docker.io,原因是已经有别的软件先占据了Docker这个名字
root@pika:/home/pi# service docker status #校验Docker服务的状态,确保Docker服务是启动的
docker start/running, process 7155
# docker info Note: docker需要root权限
安装docker时,默认的安装位置是/var/lib/docker
$sudo ls /var/lib/docker/
aufs containers graph init linkgraph.db repositories-aufstmp trust volumes
Docker卸载和重装
sudo apt-get remove docker
sudo apt-get remove --auto-remove docker
sudo apt-get autoremove --purge
{可能是这么卸载,lz不是很确定,卸载时有点乱}
再同上一样安装,要重启,就ok了
[如何卸载重装docker? ]
window下的安装
下载并安装Docker Toolbox
Note: 不用注册版本https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe
基本上一路确定就ok了,但是如果已经安装了git的,可以去掉git安装的选择。
Note: 安装需要cpu支持并开启虚拟化;且系统是64位的?
启用dockerRT
每次使用docker时都要启用dockerRT?
安装完成后,命令行中进入docker toolbox安装目录下cd /d/Docker\ Toolbox/,输入sh start.sh。
结果如下:
不启用时会出现
检查Docker的安装是否正确
docker info
出现以下内容就说明安装正确
其它系统安装参考
from:http://blog.csdn.net/pipisorry/article/details/50754385
ref:Docker one社区相关译文