[Docker]保持屋子整洁,开始使用docker

关于Docker

Docker是一个使用Go语言编写的虚拟化解决方案,很是轻量、易于使用。python


###为何要使用Docker 至于为何要使用Docker,相信你能够很轻松地在网上找到许多使用Docker的优势。一次配置、处处运行,更高效的虚拟化,更简单地管理等等。
可是,对于我我的来讲,使用Docker,可让个人工做环境变得整洁、干净。说到这里,就要说一下工做方式了。linux

1. 石器时代

在最开始时候,我的电脑就是工做电脑,工做娱乐都是在同一台电脑上进行的。通常状况下,会稍微对它们作下整理,好比放到不一样文件夹,或者放到不一样的磁盘。可是无论怎样,随着软件安装、删除、升级,文件的增删,慢慢的电脑中的文件碎片就愈来愈多。常见的好比windows电脑C盘愈来愈大,里面都是一些奇怪文件名的文件,都不知道哪些能够删,哪些不能够删,最后索性重装系统。nginx

2. 青铜时代

在了解过一些虚拟机以及双系统的知识后,能够会选择安装双系统、装虚拟机,来保证工做环境的隔离。好比我之前就用Virtualbox装不一样的系统作不一样的事情。可是这类虚拟机启动缓慢,抽象看来它就是另一台电脑,因此只是你的一台电脑变成两台或者多台电脑而已。git

3. 工业时代

除了虚拟机启动缓慢、效率性能比较低以外,一台电脑仍是同一套环境,若是你想切换环境,仍是比较麻烦。好比你要作一个项目使用的是PHP5.3,可是你想试用PHP5.5的新特性时候就会比较麻烦。Docker的出现,能够比较好地解决其中某些问题。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

这里显示的一些东西:

  • CONTAINER ID: 容器的ID
  • IMAGE: 容器所使用的镜像
  • COMMAND: 创建容器时候使用的命令
  • CREATED: 建立时间
  • STATUS: 当前状态
  • PORTS: 端口映射(默认为无)
  • NAMES: 容器的名字

经过上面已经下载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仓库中去,而后在生产环境再次下载运行。这样就达到了生产和开发环境的一致性,也就是一次开发处处运行。


使用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 从入门到实践

相关文章
相关标签/搜索