| 
                         1 docker简介    Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器。它原本是 dotCloud 启动的一个业余项目,并在前些时候开源了。它吸引了大量的关注和讨论,导致 dotCloud 把它重命名到 Docker Inc。它最初是用 Go 语言编写的,它就相当于是加在 LXC(LinuX Containers,linux 容器)上的管道,允许开发者在更高层次的概念上工作。    Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境。Docker 利用了 LXC, cgroups 和 Linux 自己的内核。和传统的虚拟机不同的是,一个 Docker 容器并不包含一个单独的操作系统,而是基于已有的基础设施中操作系统提供的功能来运行的。    Docker类似虚拟机的概念,但是与虚拟化技术的不同点在于下面几点:    1.虚拟化技术依赖物理CPU和内存,是硬件级别的;而docker构建在操作系统上,利用操作系统的containerization技术,所以docker甚至可以在虚拟机上运行。    2.虚拟化系统一般都是指操作系统镜像,比较复杂,称为“系统”;而docker开源而且轻量,称为“容器”,单个容器适合部署少量应用,比如部署一个redis、一个memcached。    3.传统的虚拟化技术使用快照来保存状态;而docker在保存状态上不仅更为轻便和低成本,而且引入了类似源代码管理机制,将容器的快照历史版本一一记录,切换成本很低。    4.传统的虚拟化技术在构建系统的时候较为复杂,需要大量的人力;而docker可以通过Dockfile来构建整个容器,重启和构建速度很快。更重要的是Dockfile可以手动编写,这样应用程序开发人员可以通过发布Dockfile来指导系统环境和依赖,这样对于持续交付十分有利。    5.Dockerfile可以基于已经构建好的容器镜像,创建新容器。Dockerfile可以通过社区分享和下载,有利于该技术的推广。    Docker 会像一个可移植的容器引擎那样工作。它把应用程序及所有程序的依赖环境打包到一个虚拟容器中,这个虚拟容器可以运行在任何一种 Linux 服务器上。这大大地提高了程序运行的灵活性和可移植性,无论需不需要许可、是在公共云还是私密云、是不是裸机环境等等。    Docker也是一个云计算平台,它利用Linux的LXC、AUFU、Go语言、cgroup实现了资源的独立,可以很轻松的实现文件、资源、网络等隔离,其最终的目标是实现类似PaaS平台的应用隔离。    Docker 由下面这些组成:    1. Docker 服务器守护程序(server daemon),用于管理所有的容器。    2. Docker 命令行客户端,用于控制服务器守护程序。    3. Docker 镜像:查找和浏览 docker 容器镜像。  
 2 docker特性  
   文件系统隔离:每个进程容器运行在完全独立的根文件系统里。    资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。    网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。    写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。    日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。    变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。    交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。  
 3 两个基础概念images与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命令。  
 4 docker安装与启动  
   安装docker  
   [root@localhost/]#yum-yinstalldocker-io  
   更改配置文件  
   [root@localhost/]#vi/etc/sysconfig/docker
     other-args列更改为:other_args="--exec-driver=lxc --selinux-enabled"  
   启动docker服务  
   [root@localhost/]#servicedockerstart  Startingcgconfigservice:[OK]  Startingdocker:[OK]
    将docker加入开机启动  [root@localhost/]#chkconfigdockeron  
   基本信息查看  
   docker version:查看docker的版本号,包括客户端、服务端、依赖的Go等  
   [root@localhost/]#dockerversion  Clientversion:1.0.0  ClientAPIversion:1.12  Goversion(client):go1.2.2  Gitcommit(client):63fe64c/1.0.0  Serverversion:1.0.0  ServerAPIversion:1.12  Goversion(server):go1.2.2  Gitcommit(server):63fe64c/1.0.0
    docker info :查看系统(docker)层面信息,包括管理的images,containers数等  [root@localhost/]#dockerinfo  Containers:16  Images:40  StorageDriver:devicemapper  PoolName:docker-253:0-1183580-pool  Datafile:/var/lib/docker/devicemapper/devicemapper/data  Metadatafile:/var/lib/docker/devicemapper/devicemapper/metadata  DataSpaceUsed:2180.4Mb  DataSpaceTotal:102400.0Mb  MetadataSpaceUsed:3.4Mb  MetadataSpaceTotal:2048.0Mb  ExecutionDriver:lxc-0.9.0  KernelVersion:2.6.32-431.el6.x86_64  
 5 镜像的获取与容器的使用  
  镜像可以看作是包含有某些软件的容器系统,比如ubuntu就是一个官方的基础镜像,很多镜像都是基于这个镜像“衍生”,该镜像包含基本的ubuntu系统。再比如,hipache是一个官方的镜像容器,运行后可以支持http和websocket的代理服务,而这个镜像本身又基于ubuntu。  
   搜索镜像    docker search <image>:在docker index中搜索image  
   [root@localhost/]#dockersearchubuntu12.10  NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED  mirolin/ubuntu12.100  marcgibbons/ubuntu12.100  mirolin/ubuntu12.10_redis0  chug/ubuntu12.10x32UbuntuQuantalQuetzal12.1032bitbasei...0  chug/ubuntu12.10x64UbuntuQuantalQuetzal12.1064bitbasei...0  
   下载镜像  
   docker pull <image> :从docker registry server 中下拉image  
   [root@localhost/]#dockerpullchug/ubuntu12.10x64  
   查看镜像  
   docker images: 列出images  
   docker images -a :列出所有的images(包含历史)  
   docker images --tree:显示镜像的所有层(layer)  
   docker rmi <image ID>: 删除一个或多个image  
   [root@localhost/]#dockerimages  REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE  chug/ubuntu12.10x64latest0b96c14dafcd4monthsago270.3MB  [root@localhost/]#dockerimages-a  REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE  chug/ubuntu12.10x64latest0b96c14dafcd4monthsago270.3MB  <none><none>31edfed3bb884monthsago175.8MB  [root@localhost/]#dockerimages--tree  Warning:'--tree'isdeprecated,itwillberemovedsoon.Seeusage.  └─31edfed3bb88VirtualSize:175.8MB  └─0b96c14dafcdVirtualSize:270.3MBTags:chug/ubuntu12.10x64:latest  [root@localhost/]#dockerrmi<imageID>....  
   使用镜像创建容器  
   [root@localhost/]#dockerrunchug/ubuntu12.10x64/bin/echohelloworld  helloworld
     交互式运行  [root@localhost/]#dockerrun-i-tchug/ubuntu12.10x64/bin/bash  root@2161509ff65e:/#  
   查看容器  
   docker ps :列出当前所有正在运行的container    docker ps -l :列出最近一次启动的container    docker ps -a :列出所有的container(包含历史,即运行过的container)    docker ps -q :列出最近一次运行的container ID  
   [root@localhost/]#dockerps  CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES  ccf3de663dc9chug/ubuntu12.10x64:latest/bin/bash22hoursagoUp22hourssharp_hypatia  [root@localhost/]#dockerps-l  CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES  f145f184647bchug/ubuntu12.10x64:latest/bin/bash6secondsagoExited(0)3secondsagocompassionate_galileo  [root@localhost/]#dockerps-a  CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES  f145f184647bchug/ubuntu12.10x64:latest/bin/bash30secondsagoExited(0)26secondsagocompassionate_galileo  f4624b42fe7echug/ubuntu12.10x64:latest/bin/bash2minutesagoExited(0)2minutesagosharp_wilson  ccf3de663dc9chug/ubuntu12.10x64:latest/bin/bash22hoursagoUp22hourssharp_hypatia  9cbaa79b9703chug/ubuntu12.10x64:latest/bin/bash22hoursagoExited(127)36minutesagoberserk_mcclintock  2161509ff65echug/ubuntu12.10x64:latest/bin/bash22hoursagoExited(0)22hoursagobackstabbing_mclean  [root@localhost/]#dockerps-q  ccf3de663dc9  
   再次启动容器  
   docker start/stop/restart <container> :开启/停止/重启container    docker start [container_id] :再次运行某个container (包括历史container)    docker attach [container_id] :连接一个正在运行的container实例(即实例必须为start状态,可以多个窗口同时attach 一个container实例)    docker start -i <container> :启动一个container并进入交互模式(相当于先start,在attach)  
                         (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |