Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker的应用场景
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。因此容器与镜像的关系类似于面向对象编程中的对象与类,换言之,镜像是一种描述,而容器是将描述具体化的对象。
构件 | 作用 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
虚拟机,我们知道是通过软件模拟了一个操作系统,我们可以在这个模拟出来的操作系统上(客户机)进行任意操作,就和正常使用一个装载了该模拟系统的电脑几乎没有区别。而且模拟出来的系统和承载虚拟机软件的系统(宿主机)之间是隔离的,所以不用担心两者会造成什么相互影响,不过模拟系统肯定要分去本机的一些硬件资源(磁盘、内存、CPU)的。
而docker中最核心的概念就是容器。光看作用,容器和虚拟机很像,都是为应用提供一个可正常运行的环境,不过最直观的一个区别是,容器相比虚拟机要更节省内存,启动更快。Docker官方一直对外宣传的就是“虚拟机需要数分钟启动,而Docker容器只需要50毫秒”。
我们首先来看一下虚拟机的运行模式,即虚拟机如何运行多个相互隔离的应用:
从下到上理解上图:
应用。安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的。
理解docker容器
再看docker如何运行多个相互隔离的应用:
首先最直观的感受就是,相比虚拟机的运行架构,docker的运行架构要简洁一些,因为虚拟机的Hypervisor+GUEST OS两层被docker的一层DAEMON给替代掉了。
从下到上理解上图:
应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。
对比虚拟机与docker
Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。( 简而言之,容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。容器使用宿主操作系统的内核,而虚拟机使用独立的内核。)
说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
另外,Docker 的局限性之一是,它只能用在 64 位的操作系统上。
Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令:
yum install docker
安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动:
[root@localhost ~]# service docker start
[root@localhost ~]# chkconfig docker on
(此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:
[root@localhost ~]# systemctl start docker.service
[root@localhost ~]# systemctl enable docker.service
由于 Docker 被墙 ,所以请使用 http://docker.cn 的镜像。
[root@localhost ~]# docker pull centos
Pulling repository centos
192178b11d36:Download complete
70441cac1ed5:Download complete
ae0c2d0bdc10:Download complete
511136ea3c5a:Download complete
5b12ef8fd570:Download complete
确认 CentOS 镜像已经被获取:
[root@localhost ~]# docker images centos
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos centos5 192178b11d362 weeks ago 466.9 MB
centos centos6 70441cac1ed52 weeks ago 215.8 MB
centos centos7 ae0c2d0bdc10 2 weeks ago 224 MB
centos latest ae0c2d0bdc10 2 weeks ago 224 MB
运行一个 Docker 容器:
[root@localhost ~]# docker run -i -t centos /bin/bash
[root@dbf66395436d /]#
我们可以看到,CentOS 容器已经被启动,并且我们得到了 bash 提示符。在 docker 命令中我们使用了 “-i 捕获标准输入输出”和 “-t 分配一个终端或控制台”选项。若要断开与容器的连接,输入 exit。
[root@cd05639b3f5c /]# cat /etc/RedHat-release
CentOSLinux release 7.0.1406(Core)
[root@cd05639b3f5c /]#exit
exit
[root@localhost ~]#
我们还可以搜索基于 Fedora 和 Ubuntu 操作系统的容器。
[root@localhost ~]# docker search ubuntu
[root@localhost ~]# docker search fedora
显示正在运行的容器列表
[root@localhost ~]# docker ps
本文参考:
[1]Docker 教程
[2] 虚拟机与Docker有何不同
[3]CentOS 7 上安装 Docker 详解