文章目录

一、什么是Docker

Docker是诞生于2013年年初,基于Go语言实现的开源容器项目。Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。

写给Docker小白的Docker科普_docker


简单的讲,可以将Docker容器理解为一个软件集装箱化平台,可以让开发者构建应用程序时,将它及其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中。


二、为什么要学习Docker

未使用Docker的开发、测试、运维流程

写给Docker小白的Docker科普_微服务_02


如果在团队开发中没有使用Docker技术,开发人员在开发时配置了环境,测试人员和运维人员的PC上不一定配置了环境,所以可能就无法运行(例如开发人员用的Ubuntu,而运维人员用的CentOS)。然后就需要花大量的精力去干配置环境这种枯燥的琐事,极大的浪费了精力,降低了工作效率。使用了Docker的开发、测试、运维流程

写给Docker小白的Docker科普_运维_03


如果使用了Docker技术,开发人员在开发完成之后,只需要把镜像Push到仓库中,测试人员和运维人员直接从仓库中Pull镜像,然后将镜像实例为容器运行就可以了。这样就避免了因为环境依赖导致的在我的电脑上可以运行,而在你的电脑上不能运行的问题。


对开发和运维(人员)来说,最梦寐以求的效果可能就是一次创建或配置,之后可以在任意地方、任意时间让应用正常运行,而Docker恰恰可以实现这一终极目标。具体来说,在开发和运维过程中,Docker具有如下几个方面的优势:

  • 更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境无缝运行。Docker可以快速创建和删除容器,实现快速迭代,节约开发、测试、部署的大量时间。并且,整个过程全程可见,使团队更容易理解应用的创建和工作过程。
  • 更高效的资源利用。运行Docker容器不需要额外的虚拟化管理程序的支持,Docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。与传统虚拟机方式相比,Docker的性能要提高1~2个数量级。
  • 更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松地迁移应用。
  • 更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实行自动化并且高效的容器管理。

Docker容器技术与传统虚拟机技术的比较

特性

容器

虚拟机

启动速度

秒级

分钟级

性能

接近原生

较弱

内存代价

很小

较多

磁盘使用

一般为MB

一般为GB

运行密度

单机支持上千个容器

一般几十个

隔离性

安全隔离

完全隔离

迁移性

优秀

一般


三、Docker的三大核心概念

Docker镜像:Docker镜像类似于虚拟机镜像,包含了应用及其运行的依赖环境,例如,一个镜像可以包含一个基本的操作系统环境。

Docker容器:Docker容器类似于集装箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。它可以启动、开始、停止、删除,而这些容器都是彼此相互隔离、互不可见的。镜像是静态的,而容器是动态的,里面运行着我们指定的应用。

Docker仓库:Docker仓库类似与代码仓库,是Docker集中存放镜像文件的场所。


四、开发者可以使用Docker做什么?

1、尝试新软件
对开发者而言,每天会催生出的各式各样的新技术都需要尝试,然而开发者却不太可能为它们一一搭建好环境并进行测试。时间非常宝贵,正得益于Docker,让我们有能够在一条或者几条命令内就搭建完环境。Docker有一个傻瓜化的获取软件的方法,Docker后台会自动获得环境镜像并且运行环境。
并不仅仅是新技术搭建用得到Docker。如果你想快速在你的笔记本上运行一个MySQL数据库,或者一个Redis消息队列,那么使用Docker便可以非常容易地得到。例如Docker只需要一条命令便可以运行MySQL数据库:

docker run -d -p 3306:3306 tutum/mysql

虽然使用命令也能非常快地安装MySQL数据库,但是当用到最新的技术或者非常复杂的技术时,使用Docker便会时个非常号的选择,例如Gitlab,普通用户大概需要一天的时间去搭建Gitlab平台,而Docker则只需要一条命令。

2、进行演示
如果需要把自己开发的成果对客户或者别人做一两个演示,搭建演示环境的过程非常麻烦。现在发现Docker已经成为了演示这些工具的最合理的方式。同时,对于客户来说,可以直接将Docker镜像提供给他们,而不必去做任何环境配置的工作,工作的效果也会和在给他们演示中所看到的一模一样,同时不必担心他们的环境配置会导致我们的产品无法运行。

3、避免“我机器上可以运行”
环境配置不同,很多人在开发中也会遇到这个情况,甚至开发的软件到了测试人员的机器上便不能运行。但这都不是重点。重点是如果我们有一个可靠的、可分发的标准开发环境。那么我们的开发将不会出现这种痛苦的现象。Docker便可以解决这个问题,Docker镜像并不会因为环境的变化而不能运行,也不会在不同的电脑上有不同的运行结果。可以给测试人员提交含有应用的Docker镜像,这样便不再会发生“在我机器上是可以运行的”这种事情,很大程度上减轻了开发人员、测试人员互相检查机器环境设置带来的时间成本。

另一个Docker可以发挥用处的地方是培训班。除了Docker容器的隔离性之外,更能体会到Docker优势的地方在于环境搭建。培训班的新手每个人都要在环境配置上花费很多时间,但是如果在这里应用到Docker的话。那么我们只需要把标准的运行镜像分发下去,然后就可以开始上课了。使用Docker和使用虚拟机一样简单,但是Docker要更方便、更轻量级。同时,我们也可以告诉学员:“在培训的同时,我们还将学到当下最流行的技术–Docker”,这种双赢的结局,何乐而不为呢。

4、学习Linux脚本
当然这个原因看起来可能很奇怪,但是对不熟悉Linux操作系统和shll脚本的人来说,确实是一个好机会。即便本文并不是在讲Linux,Linux的重要度仍然不言而喻,如果你用的是Windows,那么我给你一个建议i:从云主机提供商那租用一台云主机,推荐用CensOS操作系统。虽然这并不会让你成为专业的Linux运维,但是可以让你快速地学到Linux基础知识,爱上命令行操作,并且慢慢开始熟悉和欣赏Linux。

5、更好地利用资源
虚拟机的粒度是“虚拟出的机器”,而Docker的粒度是“被限制的应用”,相比较而言Docker的内存占用更小,更加轻量级。

6、为微服务定制
如果你一直关注科技新闻的话,那么你应该听说过“微服务(Microservices)”的概念。Docker可以很好地和微服务结合起来。从概念上来说,一个微服务便是一个提供一整套应用程序地部分功能,Docker便可以在开发、测试和部署过程中一直充当微服务地容器。甚至生产环境也可以在Docker中部署微服务。

7、在云服务器提供商之间移植
大多数地云主机提供商已经全面支持Docker。对于开发人员来说,这表示你可以很方便地切换云服务提供商,淡然也可以很方便地将你本地开发环境移动到云主机上,不需要本地上配置一次运行环境,在云主机上还配置一次运行环境。全面部署Docker作为标准运行环境可以极大地减轻应用上线是地工作量和产生BUG。

8、API端
API是应用之间的粘合剂,一个合格开发者肯定使用过别人提供地REST API,或者自己开发过REST API。需要指出地是,无论是客户端还是API提供端,在开发之前都需要先定义一组公共地API接口,写成文档,然后才能进行编码。如果服务端和客户端是共同开发地话,那么服务端通常会先实现能返回固定字符串地API接口,在以后地开发中再慢慢去实现API地功能。

虽然有人会认为在这里 Docker 被滥用了,完全可以用 sample.json 这种文件去实现虚拟 API,但是下面有个实例可以更好地解决前后端分离开发时的 API 问题。

为了更好地解释我的意思,给大家提供一个实例:JSON Server,一个用于提供 JSON 数据的 REST API。使用过这个容器的人就会知道,既然有这么好用的 Docker JSON Server,我们没有理由不用 Docker。

9、技术的创新
这点应该算不上是用例,但是我还是来写一下。Docker 正在快速发展,工具也在不断更新,没有人能预见到未来 Docker 会是什么样子的。你在复杂的系统中 Docker 使用的越多,越是可能会发现技术上的空白和未来技术发展的方向。现在还处在 Docker 的发展期,任何你使用 Docker 创建的工具都有可能成为社区关注的热点。这是 Docker 的机会,也是成就你自己的机会。

其他
还有两个技巧可以分享给你们。在学习 Docker 的过程中因为有了这两个的帮助,我才得意不断地提升自己。

一:Docker Hub Registry。这是 Docker 的官方镜像仓库,除了托管着 Docker 官方的镜像外,和 Github 一样,你可以在上面上传自己的镜像,也可以在上面搜寻其他有用的镜像,极大地节省自己的时间。例如 Oracle-XE-11g 镜像,所有的一切都是现成的,完全不需要自己去下载 Oracle XE 11g 安装。这样为你和团队节约了大量的时间成本。

如果你不太确定的话,可以去 Docker Hub 上搜有一下有没有自己用得到的镜像。大部分情况下你所需要的镜像在 Docker Hub 上都已经有人构建了。

二:多参考 IaaS 供应商的新闻,虽然我们不能像在他们会议室里那样完全了解他们的公司动态,但是仍然可以从新闻中可以了解到 Docker 最新的发展方向和技术趋势。可以肯定的是,容器化技术是未来的热点,我们不仅可以在本机运行 Docker,不仅仅在一家云服务提供商的主机上运行 Docker,未来所有的云服务提供商都会支持 Docker。

Docker 前景很明确,采用 Docker 只会让开发变得更方便。