为什么要使用Docker
按之前的想法,你可能会问:在Linux上就能安装程序、部署项目了,那为什么还要在Linux上安装Docker虚拟机呢?然后还要在Docker上安装程序、部署项目?
答案是:为了解决主要矛盾:隔离性问题。
有的程序在运行的时候会占用大量的硬件资源,如mongdb,其运行时会占用大量的内存,创建缓存,这会影响到其他程序的运行;另外,使用Docker虚拟机去部署程序非常方便,例如,需要部署程序时,开启一个虚拟的空间,而不需要部署程序时,就把这个虚拟空间删除。而这些虚拟空间之间是完全隔离的。
但是,如果你在Linux上安装程序,如果把A程序卸载掉,且A程序关联了相关的软件包,就有可能影响到B程序,B程序就有可能运行不起来了。这就体现不了隔离性。
而,在Docker虚拟机中,把A容器(Docker中的虚拟空间)删掉,不会影响到B容器。
这就是我们使用Docker虚拟机去部署项目的主要原因。
Docker虚拟机的使用
Docker虚拟机架构
一个问题:
为什么不在Linux上再次安装VMware虚拟机部署程序,而安装Docker虚拟机部署程序(前者也能体现隔离性)?
答:
Docker虚拟机是一个轻量级的虚拟机,VMware是一个重量级的虚拟机,在主机上开启上千个Docker虚拟机一点问题没有,不会造成机器的卡顿等问题。而VMware没法多开,开多了会造成主机卡顿。
再问:
其次,Docker虚拟机为什么是一个轻量级的虚拟机?
再答:
由其架构决定。如下图:Docker创建的所有虚拟实例能共用同一个Linux内核,对硬件占用较小,属于轻量级虚拟机。
所以,宿主机系统,首选Linux系统,然后在宿主机系统中安装Docker程序,Docker程序中的Docker引擎会去管理、创建、销毁、启动、停止这些虚拟空间。在这些虚拟空间(称作:容器)中,我们可以去安装程序,部署项目,容器与容器之间是完全隔离的。
轻量级的另一方面,这些容器中运行的Linux系统,并不是完整的Linux系统,它们其实是共享了一个Linux内核。而VMware中每一个虚拟的空间中运行的都是一个独立的操作系统,这就对主机的销毁是巨大的。所以,在Docker虚拟机中,只能使用Docker提供的操作系统,没法安装其他操作系统。
由此可见,在服务器主机上开启几千个Docker虚拟机压力很小,这就为大规模部署更多的应用提供条件。
Docker虚拟机在云计算中的应用
从前,我们想把自己的项目部署到服务器上,那么在本地搭建一个服务器的成本就会很高,比如要去买固定的IP、申宽带、购买硬件的服务器等等,所以,经常的做法是到云空间中申请一个虚拟的主机。这个就跟Docker虚拟机很相似。在Docker虚拟机中创建容器的时候,可以设置这个容器占用多大的内存、CPU的配置、网络配置等,这就相当于IaaS云的功能。接着,申请云主机之后,云主机里面除了操作系统之外,里面什么程序可能都没有给你安装,那就比较麻烦了。但是,目前云主机中有提供redis,mysql,等等服务,这就是PaaS云。它不仅给你提供虚拟的运行环境,还在其中安装了一些中间件,如redis等。如果用Docker就可以实现这一点。Docker的虚拟空间叫容器(Container),那么我们可以开启一个容器,在里面安装你想要的中间件。安装之后,可以把容器转换为镜像(镜像Image是用来创建容器的)。那么,以后再有用户来,他想要申请一个自带java环境等中间件的虚拟主机,那么我们就可以直接把这个镜像拿过来创建一个自带了中间件的容器。这就是Docker在PasS云上的使用。另外,有些用户可能不懂技术,不懂部署项目,那么这些用户要怎么把项目放上去呢?于是云计算又往前迈了一步。这种架构叫SaaS云。它为你提供了虚拟的硬件环境,你想要的中间件,以及你想要的项目。而这个工作就可以交给Docker来做。同样可以使用Docker去安装硬件环境、中间件、项目,做完之后,把容器转换为镜像。下次,用户需要的时候,就把这个镜像拿来生成一个容器,即可。
Docker容器与镜像
这里,给出容器与镜像的区别:
- 镜像是用来创建容器的,容器是从镜像中创建出来的虚拟实例。
- 容器可以用来运行程序,是读写层。可读可写;
- 镜像用来安装程序,是只读层。
所以,部署项目是部署在容器中。镜像不是虚拟空间,容器才是虚拟的空间。镜像(Image
)只是一个文件,其内部安装了相关的程序。那么如何向镜像中安装程序呢?
Docker有一个Dockerfile文件
,它可以定义你想要安装的程序,在里面写好这些安装的程序后,运行dockerfile,就会把这些程序安装上,然后创建出镜像。
当然,我们还可以在运行的容器中安装这些程序,然后把容器转换为镜像。
安装与管理Docker虚拟机
执行yum命令
,安装前需要先更新yum软件管理器。
[root @ localhost / ] yum -y unpdate
[root @ localhost / ] yum install -y docker
注: -y
代表选择程序安装中的yes
选项
要使用Docker时,首先要启动Docker服务
:
启动:[root @ localhost / ] service docker start
关闭:[root @ localhost / ] service docker stop
重启:[root @ localhost / ] service docker restart
为了更系统的理清Docker虚拟机的管理命令,我们给出如下一张很重要的图:
解释:
- DockerFile 文件: 定义了镜像要安装的程序和配置的环境;通过
docker build dockerfile文件名
指令可以创建你想要的镜像(image)。
当然,一旦创建出镜像,如何把镜像分发给其他主机的虚拟机?
办法1:借助docker仓库。通过push
指令把本地镜像上传到仓库,而其他主机可以通过search
指令到仓库中查找上传的镜像,找到之后,可以通过pull
这个指令把镜像下载到本地。这样别的主机的Docker虚拟机中就可以有这个镜像了。
办法2:通过文件方式。把镜像导出为压缩文件backup.tar.gz
,别的主机用这个压缩文件再导入为镜像。导出指令:save/export
;导入指令:load/import
rmi
指令:删除镜像。inspect
:查看某一个镜像的详细信息;images
: 查看所有镜像的详细信息;run:
使用镜像去创建容器。创建容器之后,这个容器就会直接运行了。
怎么把这个运行的容器停下来,或者删除?pause
:暂停;unpause
:从暂停恢复到运行状态;stop
: 把运行的容器彻底的停止;start
: 把容器从停止状态恢复成运行状态;inspect
: 也可以查看某一个容器的详细信息ps
: 查看所有容器的信息rm
: 删除某个容器;commit
: 容器可以保存为镜像。
Docker虚拟机常用指令
Docker有一个非常庞大的镜像仓库,我们可以在里面查找到我们想要的仓库。
安装镜像
安装Java镜像
查找:[root @ localhost / ] docker search java
下载:[root @ localhost / ] docker pull java
但是,由于国外镜像仓库下载速度较慢,所以建议使用国内镜像仓库,如DaoCloud
。
配置加速器DaoCloud:先去DaoCloud官网www.daocloud.io,进行注册。然后进入这里:https://www.daocloud.io/mirror 进行Docker加速器的配置。
我们复制上面的命令,在CentOS上执行:
执行之后,还需要进行一些修改:因为在Docker配置文件里面添加了一个加速器的设置,其结尾多了一个逗号,我们要把这个逗号删除掉,否则加速器用不了。
接下来,我们就编辑下Docker的配置文件:
然后保存 退出 :wq
。
然后我们去搜索一个与java有关的镜像:
docker search java
然后把镜像名字复制下来。例如:我们选择 docker.io/java
这个java环境的镜像。
然后我们把这个镜像下载下来: docker pull docker.io/java
(粘贴:shift+insert)
下载完成之后,我们查看下镜像信息 docker images
导出导入镜像
[root @ localhost / ] docker save java > /home/java.tar.gz
[root @ localhost / ] docker load < /home/java.tar.gz
[root @ localhost / ] docker images
[root @ localhost /] docker rmi java
导出:docker save 镜像名 导出路径
可以看到在home目录下有一个镜像的压缩文件:
现在我们在试试用压缩文件的方式导入:
先把java这个镜像文件删除: docker rmi docker.io/java
删除成功后,在导入压缩文件: docker load < /home/java.tar.gz
导入成功后,再次执行: docker images
启动容器
启动镜像会创建出一个运行状态的容器
- 启动一个名称为myjava的java容器,并使用bash命令行:
[root @ localhost / ] docker run -it --name myjava java bash
- 启动一个容器,开放端口 -p 9000:8080 //9000宿主机端口,8080容器端口,即把容器的8080端口映射到真实的宿主机端口上。另外,要映射多少个端口,就写多少个p参数。
[root @ localhost / ] docker run -it --name myjava -p 9000:9090 -p 9001:8085 java bash
- 把宿主机的文件或目录映射到容器中:例如跑数据库的时候,数据库中存储的数据一定是要保存在宿主机中,不应该存储在容器中,这方便我们将来备份和恢复。
多个 -v 可以映射多个;
[root @ localhost /] docker run -it --name myjava -v /home/project:/soft --privileged java bash
注释:/home/project 是宿主机目录; 与文件用冒号(:)隔开
/home/project:/soft 把宿主机的目录映射到容器的soft目录中
--privileged 读写执行 | 权限参数
上图红框中的这条信息,是容器的编号。
测试下java环境:
暂停和停止容器
[root @ localhost / ] docker pause myjava
[root @ localhost / ] docker unpause myjava
[root @ localhost / ] docker stop myjava
[root @ localhost/ ] docker start -i myjava
OK ,到这里我们就把Docker虚拟机的安装、Docker命令简要概述了下。
关于Docker命令更多的细节可以参考docker中文文档:
如果你是位前端开发者,学习到这里就够了。
下一节,我们将使用Docker搭建集群。
【Docker】基于实例项目的集群部署(五)Docker搭建MySQL集群 | PXC集群