[Docker]为什么要使用Docker?


当我们安装好CentOS系统后,就可以在CentOS上安装各种各样的程序和服务了,但是对于开发者来说往往会存在2个问题:一方面是时间成本,另一个是避免程序间的冲突。

比如说我们现在想要在Linux系統上搭建MySQL集群,想要在一个Linux系統上面同时运行多个MySQL,你要做很多事情,例如:定义繁复的配置文件和目录,然后还要写复杂的启动脚本,每个MySQL节点还要单独执行初始化等等,特别麻烦。有了Docker之后,我们只需要运行几条命令,MySQL节点就创建好了,特别节省时间,而且Docker隔离性做的很好,你也不用担心MySQL节点之间的冲突。

再比如说,你们公司开发了很多项目。去年开发的Java项目用的是JDK1.8MariaDB数据库,已经部署在Linux上面了。今年开发的项目用的是JDK15MySQL数据库,现在要把这个项目也部署在同一个Linux系統之上,那就非常困难。因为MySQL和MariaDB的程序包有冲突,在同一个Linux系统中只能安装其中一个数据库,要么是MysQL要么是MariaDB。还有JDK1.8和JDK15,你怎么给系统设置两个Java环境变量?所以我们就需要引入 Docker环境了。

1.Docker原理

往简单了说,Docker是个沙箱环境。你可以创建很多个沙箱空间,然后在每个沙箱中部署不同的程序。比如沙箱 A里面部署MySQL,沙箱B中部署MariaDB。沙箱之间是物理隔绝的,只有网络可以联通,所以MariaDBMySQL程序包的冲突,在Docker中完全体现不出来。 因为Docker环境给每个沙箱都创建了虚拟网卡,所以每个沙箱都有自己的内网IP地址,沙箱之间可以通过网络相互调用,这就能搭建数据库集群或者部署项目了。沙箱的内网IP在Docker环境之外是无法访问的,所以等我们创建沙箱的时候,需要把沙箱的某个端口映射到Linux系統的某个端口,这样在Docker之外才能用网络访问Docker容器里面的程序。

2.镜像和容器

Docker为了最大化的共亨资源,减少资源浪费,创造出了镜像技术。镜像是沙箱之间相同的部分,差异化的部分叫做容器。比如说—个Java镜象,里面安装了JDK1.8,然后我为这个镜像创建出2个容器,这两个容器共享使用JDK镜像中的Java环境,并且我可以在每个容器中部署不同的Java程序。如果Docker没有镜像技术,我们只能分别在两个容器中安装JDK环境,这就造成了不必要的重复浪费。 创建Docker镜像的方式有多种,比如说你把要安装的程序和脚本写成Dockerfile文件,然后执行特殊的命令,Docker就会按照你的要求创建出镜像。或者说你利用现有的容器,在里面安装程序写好脚本,然后把这个容器逆向创建出镜像也可以。甚至说你不想自己创建镜像,也可以去DockerHub网站上下载别人创建的镜像。比如MySQL镜像、HBase镜像、JDK镜像、Python镜像等等。你把镜像下载下来,导入Docker环境,然后创建容器就 可以使用MySQL、HBase这些东西了,特别节省时间。

3.程序运行在容器中,性能有没有损失?

Docker创建的沙箱是轻量级的,只给容器创建了虚拟网卡,所以对Linux系统开销非常小。在容器中运行程序跟在 Linux同直接运行程序没有差别,性能也没有任何损失,所以你可以放心使用Docker环境。现实中,一台硬件服务器同时运行几百个容器也没有问题。即便2GB内存的低端云主机,运行十几个容器也能撑得下来。


分类:DevOps
标签: Docker
文章目录