docker实践入门之一:基础

前戏……呃,前言

docker是什么?

docker是一种容器技术,它的主要功能就是能够让进程在一个隔离的容器环境里运行——在进程看来,它有一整套“独立”的OS环境,包括文件系统,类似于虚拟机。

docker不是什么?

docker 不是虚拟机,它只是一套虚拟运行环境,实际上在host机上用ps可以看到容器里面的进程。实际上docker里用到的环境都是来自于host机,只是相 对隔离而已,类似于python的virtualenv,在每个独立的env里,python程序有独立的python解释器和相应的site- packages,看似隔离的环境,但实际上还是运行在host机上。只是docker的容器隔离比python的环境隔离更高一些,但又比虚拟机的完全 隔离更低一些。

docker有什么用途?

docker最大的用途就是方便了部署。以python应用为例,如果在一台机器上部署多个应用时,如果不同的应用有不同的依赖,比如使用了不同版本的python或者不同版本的包,就会冲突。

当然python有virtualenv可以较好地实现隔离,但是并不是所有的应用都是用python写的,而且即使python应用也还是需要依赖别的应用程序,比如数据库。比如一个应用需要mysql5.0另一个应用需要mysql5.6,一样会面临冲突的问题。

用虚拟机虽然也可以解决这样的问题,但是代价太大,且不说虚拟化造成的性能损失,还有每个虚拟机里都需要安装完整的OS。

微服务

实 际上,docker的最佳实践就是每个进程(实际上是指每个运行的应用程序,但一个应用程序本身可能会开好几个工作进程,比如webserver)开一个 容器。 所以在这点上,它与virtualenv还不太一样,对于venv来说,如果两个应用的依赖一样,也完全可以跑在一个venv里,但是docker并不是 这样。

比如nginx开一个容器,mysql开一个容器,redis开一个容器,每个应用开一个容器。然后把它们互联起来。对host机来 说,它的环境是干净的,只是跑着几个docker容器。对于每个容器来说,其中的程序所用的环境也是干净的,只有它们用到的依赖,保证不会有不必要的冲 突。每个容器做的事情也是清楚的:对外提供某个服务,或者依赖某个外部服务。所有的服务都是通过docker的虚拟网络建立连接。

其实这种就是所谓的“微服务”架构,每个container就是一个微服务。

Container和Image

说了半天容器,它到底是什么?

前 面说过,容器(container)是一个虚拟运行环境,这里的关键在于它是一个“运行”环境,即是一个“动态”的概念,只在运行时存在,一个容器就是一 个运行的image,其中构造了一个虚拟的OS环境(相比之下虚拟机是构造一个虚拟的硬件环境,venv只是构造了一个虚拟的python运行环境),应 用就运行在这个虚拟OS环境中。

那么image又是什么?

image就是一个静态的container。如果你对image和container还不是很理解的话,可以把它们类比成程序和进程:

image就相当于程序,是一个静态的东西,container则相当于进程,就是把程序运行起来的一个实例,一个程序可以启动成多个进程,就像一个image可以启动成多个container。

当然,实际上image和container并不完全等同于程序和进程。因为一个container还可以通过docker的commit命令保存成一个image,这是进程做不到的。

安装及使用说明

docker的安装(略,详见官网,现在docker已经被解封了,不用再像两年前我刚开始玩docker时那么折腾)

docker的使用(略,常用命令见官方文档)

推送到[go4pro.org]