为什么要使用Docker?
比如我们现在拥有了Linux CentOS系统,按理说可以在上面安装各种程序和服务了。但是高手并不会这么做,而是先安装Docker环境,然后在Docker里面部署各种数据库和中间件程序。这么做有两点原因:一个是节省时间,另一个是避免程序间的冲突。
比如说我们现在想要在Linux系统上搭建MySQL集群,想要在一个Linux系统上面同时运行多个MySQL,你要做跟多事情,例如定义繁复的配置文件和目录,然后还要写复杂的启动脚本,每个MySQL节点还要单独执行初始化等等,特别麻烦。有了Docker之后,我们只需要运行几条命令,MySQL节点就创建好了,特别节省时间,而且Docker隔离性做的很好,你也不用担心MySQL节点之间的冲突。
再比如说,你们公司开发了很多项目。去年开发的Java项目用的是JDK1.8和MariaDB数据库,已经部署在Linux上面了。今年开发的项目用的是JDK15和MySQL数据库,现在要把这个项目也部署在同一个Linux系统之上,那就非常困难。因为MySQL和MariaDB的程序包有冲突,在同一个Linux系统中只能安装其中一个数据库,要么是MySQL要么是MariaDB。还有JDK1.8和JDK15,你怎么给系统设置两个Java环境变量?所以我们就需要引入Docker环境了。
Docker特点
docker可以避免运行环境不一致的问题
docker是一个用来装程序以及环境的容器
docker属于Linux容器的一种封装,提供简单易用的容器使用接口
Docker的架构
Docker原理
往简单了说,Docker是个沙箱环境。你可以创建很多个沙箱空间,然后在每个沙箱中部署不同的程序。比如沙箱A里面部署MySQL,沙箱B中部署MariaDB。沙箱之间是物理隔绝的,只有网络可以联通,所以MariaDB和MySQL程序包的冲突,在Docker中完全体现不出来。
因为Docker环境给每个沙箱都创建了虚拟网卡,所以每个沙箱都有自己的内网IP地址,沙箱之间可以通过网络相互调用,这就能搭建数据库集群或者部署项目了。沙箱的内网IP在Docker环境之外是无法访问的,所以等我们创建沙箱的时候,需要把沙箱的某个端口映射到Linux系统的某个端口,这样在Docker之外才能用网络访问Docker容器里面的程序。
镜像和容器
Docker为了最大化的共享资源,减少资源浪费,创造出了镜像技术。镜像是沙箱之间相同的部分,差异化的部分叫做容器。比如说一个Java镜像,里面安装了JDK1.8,然后我为这个镜像创建出2个容器,这两个容器共享使用JDK镜像中的Java环境,并且我可以在每个容器中部署不同的Java程序。如果Docker没有镜像技术,我们只能分别在两个容器中安装JDK环境,这就造成了不必要的重复浪费。
创建Docker镜像的方式有多种,比如说你把要安装的程序和脚本写成Dockerfile文件,然后执行特殊的命令,Docker就会按照你的要求创建出镜像。或者说你利用现有的容器,在里面安装程序写好脚本,然后把这个容器逆向创建出镜像也可以。甚至说你不想自己创建镜像,也可以去DockerHub网站上下载别人创建的镜像。比如MySQL镜像、HBase镜像、JDK镜像、Python镜像等等。你把镜像下载下来,导入Docker环境,然后创建容器就可以使用MySQL、HBase这些东西了,特别节省时间。
容器
- 一个镜像可以有多个容器
- 镜像类似于Java类,而容器是实例
- 相互隔离
程序运行在容器中,性能有没有损失?
Docker创建的沙箱是轻量级的,只给容器创建了虚拟网卡,所以对Linux系统开销非常小。在容器中运行程序跟在Linux
同直接运行程序没有差别,性能也没有任何损失,所以你可以放心使用Docker环境。现实中,一台硬件服务器同时运行几
百个容器也没有问题。即便2GB内存的低端云主机,运行十几个容器也能撑得下来。
仓库
- 集中存储
- hub.docker.com(国外镜像官网)
- hub.daocloud.io(国内)