Docker是一个使用Go语言编写的虚拟化解决方案,很是轻量、易于使用。python
###为何要使用Docker 至于为何要使用Docker,相信你能够很轻松地在网上找到许多使用Docker的优势。一次配置、处处运行,更高效的虚拟化,更简单地管理等等。
可是,对于我我的来讲,使用Docker,可让个人工做环境变得整洁、干净。说到这里,就要说一下工做方式了。linux
在最开始时候,我的电脑就是工做电脑,工做娱乐都是在同一台电脑上进行的。通常状况下,会稍微对它们作下整理,好比放到不一样文件夹,或者放到不一样的磁盘。可是无论怎样,随着软件安装、删除、升级,文件的增删,慢慢的电脑中的文件碎片就愈来愈多。常见的好比windows电脑C盘愈来愈大,里面都是一些奇怪文件名的文件,都不知道哪些能够删,哪些不能够删,最后索性重装系统。nginx
在了解过一些虚拟机以及双系统的知识后,能够会选择安装双系统、装虚拟机,来保证工做环境的隔离。好比我之前就用Virtualbox装不一样的系统作不一样的事情。可是这类虚拟机启动缓慢,抽象看来它就是另一台电脑,因此只是你的一台电脑变成两台或者多台电脑而已。git
除了虚拟机启动缓慢、效率性能比较低以外,一台电脑仍是同一套环境,若是你想切换环境,仍是比较麻烦。好比你要作一个项目使用的是PHP5.3,可是你想试用PHP5.5的新特性时候就会比较麻烦。Docker的出现,能够比较好地解决其中某些问题。docker
Docker是一个轻量级的虚拟化解决方案,你能够实现秒级的虚拟机启动、很是轻量级的虚拟化。我的使用理解看来,它能够实现一个相似于版本管理Git同样的轻量化的状态保存。apache
Docker有两个很是重要的概念: 镜像和容器。ubuntu
镜像是呈载容器的实体,全部容器都是运行在镜像之上。用版本管理的角度来看,镜像就像是某一个节点,它能够派生出不一样的分支,你能够在不一样分支上作不一样的事情。能够想象成一棵树,最基本的镜像是主树干,主树干能够分出旁支树干,而旁支树干能够分出更细的旁支,而树干上能够生长树枝。vim
好比,你使用Docker,从官方仓库下载一个ubuntu镜像,把它做为最基础的镜像。而后在上面运行一个容器,这个容器里下载Nginx,再以这个容器为基础生成一个新的镜像,之后这个镜像生成的容器就都是ubuntu+nginx为基础。可是你工做环境可能须要你使用Apache来工做,你也想有一个ubuntu+apache为基础的镜像,因而你可使用最基础的ubuntu镜像运行一个容器,在里面下载安装Apache,而后以这个容器为基础,保存一个ubuntu+apache的镜像,之后在这个镜像基础上运行的全部容器都拥有了一个apache环境。windows
操做流程
在安装完Docker以后(这里以本机ubuntu操做系统为例):bash
# docker pull ubuntu
这样经过pull会从官方仓库下载一个最新构建的ubuntu镜像下来:
root@docker:~# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest 9cbaf023786c 7 days ago 192.8 MB
而后,你能够在这个镜像为基础,执行某些操做。以下:
root@docker:~# docker run -it ubuntu /bin/bash root@ead6f34e1f8e:/#
这样,你就进入了一个容器。新容器并不须要单首创建,只须要以某个镜像为基础,执行某些命令就能够。
注意,新容器就像一个全新安装的精简系统,里面不少指令和程序都默认没有安装,如python, wget, vim等。
下面,在容器里下载nginx:
root@ead6f34e1f8e:/# apt-get update root@ead6f34e1f8e:/# apt-get install nginx root@ead6f34e1f8e:/# which nginx /usr/sbin/nginx root@ead6f34e1f8e:/# nginx -v nginx version: nginx/1.4.6 (Ubuntu) root@ead6f34e1f8e:/# exit
在退出容器以后,使用docker ps -a
能够看到中止了的容器:
root@docker:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ead6f34e1f8e ubuntu:latest "/bin/bash" 9 minutes ago Exited (0) 44 seconds ago suspicious_rosalind
这里显示的一些东西:
经过上面已经下载Nginx的容器,咱们能够建立一个新的镜像:
root@docker:~# docker commit -m 'add nginx' ead6f34e1f8e ubuntu/nginx 6d61d587b283fd163a30eff8ec1928b503e1d05de24cb815bc3acc5bc4b4d1ed root@docker:~# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu/nginx latest 6d61d587b283 3 seconds ago 231.3 MB ubuntu latest 9cbaf023786c 7 days ago 192.8 MB
这样咱们就建立了一个新的镜像,里面默认包含了Nginx,之后全部须要nginx运行环境的容器均可以以这个镜像为基础,而不须要从新下载。固然,这里的镜像名字比较随意,此处仅为实验。
root@docker:~# docker run -it ubuntu/nginx /bin/bash root@3364e69c4654:/# which nginx /usr/sbin/nginx root@3364e69c4654:/# nginx -v nginx version: nginx/1.4.6 (Ubuntu)
进入后能够看到,默认就是上面那个环境。如今退出后,再查看容器:
root@docker:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3364e69c4654 ubuntu/nginx:latest "/bin/bash" 3 minutes ago Exited (0) 3 seconds ago happy_curie ead6f34e1f8e ubuntu:latest "/bin/bash" 23 minutes ago Exited (0) 14 minutes ago suspicious_rosalind
这里就能够看到,有了两个中止的容器。另外,容器ID就是容器的主机名。
你能够建立不少容器,仅消耗不多一部份资源,就能够拥了不少隔离的环境。并且,你能够把这样的环境保存起来,推送到某一个docker仓库中去,而后在生产环境再次下载运行。这样就达到了生产和开发环境的一致性,也就是一次开发处处运行。
因为我的电脑为OS X,因此运行docker须要同时安装boot2docker这个程序,并且须要virtualbox的配合,具体能够参见Mac OS X系统安装说明。若是使用了Homebrew,能够直接使用brew install docker boot2docker
来安装。可是若是之前安装过,或者更新,可能会有一些问题,很常见的如:
Error response from daemon: client and server don't have same version (client : 1.15, server: 1.13)
这个问题说明服务端和客户端版本不一致(在linux系统上应该不会出现这样的问题),主要是boot2docker引发的。若是遇到这样的问题,更新下boot2docker就能够了。注意,这里不是从新下载安装boot2docker:
boot2docker download boot2docker restart
或
boot2docker upgrade
这篇文章只是大概地讲述了一下Docker使用的最基本流程,里面有不少概念包括涉及到的概念(如镜像标签)并无展开来说,因此整体是比较粗略的。深刻了解能够期待本人后续文章或者直接参看下面的开源图书,这本书很适合想入门的朋友。
资料参考:Docker 从入门到实践