1 什么是Docker?
Docker是一款由Go语言编写,遵从Apache2.0协议开源的应用容器引擎,其容器完全使用沙箱机制,相互之间无任何接口。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级
、可移植
的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
。
2 主要组成
先上图,一览下这个牛掰的开源引擎。
- Docker 使用
客户端-服务器
体系结构(C/S)。 Docker Client
与Docker Daemon
通信,后者负责构建、运行和分发 Docker 容器的繁重工作。- Docker Client和Docker Daemon可以在同一系统上运行,也可以将 Docker Client连接到远程 Docker Daemon。
- Docker Client和Docker Daemon使用
REST API
、UNIX 套接字
或网络接口
进行通信。 - 另一个 Docker Client是
Docker Compose
,它允许您使用由一组容器组成的应用程序。
2.1 Docker Client
Docker Client,即客户端( docker ),是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如 docker run
之类的命令时,客户端会将这些命令发送到 dockerd
即Docker Daemon,后者会执行这些命令。该 docker 命令使用 Docker API
。
Docker 客户端可以与多个守护程序进行通信。
2.2 Docker Daemon
Docker Daemon,守护程序( dockerd )侦听 Docker API 请求并管理 Docker 对象,例如映像、容器、网络和卷。
守护程序还可以与其他守护程序通信以管理 Docker 服务。
2.3 Docker Image
即Docker镜像,相当于是一个 root 文件系统
。比如官方镜像 ubuntu:16.04
就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
2.4 Docker Container
即容器,是通过镜像来创建。
容器和镜像
的关系,可以类比看做面向对象程序设计中的对象和类
的关系。镜像是静态的定义,是容器的源代码,而容器是镜像运行时的实体。
容器可以被创建、启动、停止、删除、暂停等。
2.5 Docker Registry
即注册表,也称作“代码仓库”,其保存了各种镜像。分公有
和私有
。
Docker Hub
是任何人都可以使用的公共注册表,默认情况下,Docker 会在 Docker Hub 上查找映像。您甚至可以运行自己的私有注册表。
使用 docker pull
或docker run
命令时,Docker 会从配置的注册表中提取所需的映像。使用docker push
命令时,Docker 会将映像推送到配置的注册表。
3 应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
4 优缺点
4.1 简化程序
开发者只需将自己的应用打包至可移植的容器当中,发布出去,其他使用者便可无差别的获取并使用,简化了开发流程。这种虚拟化方式,大大减少了沟通成本,更加方便开发者管理应用。
4.2 节省开支
传统通过服务器一步一步按照文档部署的历史已经渐渐退出舞台,运维或开发人员无需太多软件、插件安装来完善某个应用的部署环境,简单通过命令或操作台即可完成与开发者同样的应用部署,加上现有的云计算,既合理又充分利用了有限的资源,无需太多考虑其他硬件管理问题,改变了过去高性能必然高价格的思维定势,同时也改变了虚拟化的方式。
4.3 一致性
正如上节所说,使用者可以得到开发者同样的部署过程和应用运行环境,基本不会再出现“我机子上运行没问题,为何你那里就不行?”类似这种灵魂质问的问题。非常契合Docker的理念:一处构建,处处运行,也非常适合CI/CD,简化了开发流程。
4.4 隔离性
正如本文开头介绍docker所说的,docker容器完全使用沙箱机制,相互之间并无任何接口,所以可以起到隔离作用,比如这个项目需要MySQL5.2,那个项目需要用到MySQL5.7,甚至8.0+的版本,如果按照传统的物理机器部署方式,估计运维要疯了,如果服务器虚拟机不够,真的又要浪费一笔不小的运维开支,增加了企业成本。
另外,版本隔离也是能够通过docker简单实现且更加便利快捷,特别的,不同环境的应用隔离,使得开发、测试、预生产、生产环境互不影响,且可以实现无差别切换
4.5 更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易.
Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的。
4.6 镜像问题
目前docker镜像并没有统一的标准,造成很多诸如版本混乱,功能阉割,这里不是批评多样性的问题,主要是指OS,很多工具要么被阉割,要么库包不全。
例如调试的时候需要 curl,wget,telnet,nslookup 等工具在镜像中没有。甚至 ps, top, free, find, netstat, ifconfig 命令都没有。
4.7 安装位置不统一
学习过Linux的都知道,文件管理是多么重要,对于docker而言,有的时候如果不看docker file,你很难知道其安装目录究竟在哪里。
另外引用下之前知乎网友对docker的缺点总结,仅此作为参考,总之,docker还不是完美的,完美的也不会总是存在。看你怎么用?用在什么地方?一句话,合适才是最好的。
Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:
1)Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。
2)LXC是基于Cgroup等Linux kernel功能的,因此Container的Guest系统只能是Linux base的。
3)隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。网络管理相对简单,主要是基于namespace隔离。
4)cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)。
5)docker对disk的管理比较有限。
6)container随着用户进程的停止而销毁,container中的log等用户数据不便收集。