Docker简介、常用命令与实践(一)

Bohr

一、为什么要使用Docker以及与虚拟机的区别?

1.1 为什么要使用Docker

Docker的思想来自于集装箱
集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。
可是这个箱子为什么这么神奇呢?无非就是两个字:标准

是的!标准!标准!标准!

按照这个思路,docker 其实跟集装箱一样,或者说它想跟集装箱一样,成为“标准化”。
这就是 docker 的实质:标准化。

Docker带来了哪些好处

粗略来说,Docker好处有:

1.保证了线上线下环境的一致性。我们在线下的开发环境使用Docker构建好weaapp的镜像后,可以直接在线上使用一个镜像,保证了线上线下环境的一致性,再也不会有在线下开发环境中运行正常,而部署到线上各种错误了。

2.极大的简化了webapp的部署流程。在不使用Docker时,我们部署app时,要先搭建好app运行所需环境,这个过程做过的人都知道多么枯燥繁琐,一不小心还出错。而有了Docker,我们只需要直接构建一个我们webapp的镜像然后将其运行即可,无论在多少台服务器中部署,都是如此。再比如,使用Docker之前要搭建一个WordPress对于新手来说是有些困难的,而有了Docker,只需要从DockerHub上pull一个WordPress镜像并启动就可以了,非常非常方便。

3.实现了沙盒机制,提高了安全性。由于webapp运行在容器中,与操作系统隔离开了,从而使操作系统基本不可能受到破坏,另外如果webapp因为攻击而瘫痪,并不需要重启服务器,直接重启容器或者再启动一个镜像就可以了。

4.实现了模块化,提高了复用性。在二中使用Docker的第二种方式就可以看出,我们将数据库和Tomcat运行在不同的容器中,从某种角度来说,这也降低了模块之间的耦合性,便于拓展。比如我们要把MySQL替换为oracle,只需要再构建一个oracle镜像并启动与Tomcat连接即可,非常方便。对于我们构建的镜像,在其他app中直接拿来用就可以了,不必重复劳动。

设想一个如下场景:

我们需要一个webapp,其功能是用户注册并将注册信息插入到数据库,环境为Ubuntu+Tomcat+Mysql,怎么做?不使用Docker的话,我们通常会这样做,以Ubuntu为操作系统,然后安装Tomcat和MySQL,最后把app部署上就可以了。那么使用Docker会怎么做呢,在这个场景下,可以有两种方式:1.仍然以Ubuntu为操作系统,然后构建一个安装有MySQL和Tomcat的Docker镜像,并把app部署到其中,最后启动Docker镜像就可以了。看起来好像和不使用Docker基本相同,甚至还要麻烦一些,是这样吗?别着急,继续往下看。2.第二种方式则体现了Docker的"每个容器只做一件事情"的思想,我们构建两个镜像,一个仅安装Tomcat并部署我们的app,另一个仅安装MySQL,然后启动这两个镜像,得到两个容器,再利用Docker的容器互联技术将二者连接(Docker的容器是通过http连接的)。

5.实现了虚拟化,提高硬件利用率。有了Docker,我们可以在一台服务器上运行很多webapp,充分利用闲置资源。这时候,服务器的操作系统就类似于货轮,而一个个Docker容器就相当于货轮上的一个个集装箱。现在大热的云服务市场,不少就用了Docker。举个例子来说,现在我们有一台操作系统为Ubuntu14.04的服务器,我们构建不同版本的ubuntu镜像并启动,并且为不同的用户分配不同的容器。这样,用一台服务器可以虚拟出n个运行着不同操作系统的虚拟服务器,而对于用户来说,这些是透明的––用户则认为自己拥有一台完整的服务器。据我推测,阿里云的服务器就是这么干的。这充分利用了闲置的硬件资源。

总结:
    Docker背后的想法是创建软件程序可移植的轻量级容器,让其可以在任何安装了Docker的机器上运行,并不用关心底层操作系统,就像野心勃勃的造船者们成功创建了集装箱而不需要考虑装在哪种船舶上一样。

    只有一个共同目标:简化部署流程,提高生产力!

参考:如何通俗解释Docker是什么?

1.2 Docker和虚拟机的区别

Docker基于LXC(Linux容器),在LXC的基础上进一步封装,使得操作更简单,就像操作一个轻量级的虚拟机一样。

先上图,vm与docker框架,直观上来讲vm多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化,docker直接使用硬件资源,所以资源利用率相对docker低也是比较容易理解的

clipboard.png

一个IBM测试案例,关于计算能力的,对于kvm为什么会有这么大的性能损失,一方面是因为虚拟机增加了一层虚拟硬件层,运行在虚拟机上的应用程序在进行数值计算时是运行在Hypervisor虚拟的CPU上的;另外一方面是由于计算程序本身的特性导致的差异。虚拟机虚拟的cpu架构不同于实际cpu架构,数值计算程序一般针对特定的cpu架构有一定的优化措施,虚拟化使这些措施作废,甚至起到反效果。

clipboard.png

参考:docker与虚拟机性能比较

总结:

图片描述

二、使用Docker的正确姿势

clipboard.png

集装箱:程序部署,保证运行环境不会出错。

标准化:
(1)运输方式:QQ/邮件==>>从仓库(hub.docker.com)获取。
(2)存储方式:应用程序。
(3)API接口:REST api接口,统一控制所有应用。

隔离:Linux内核限制机制LXC。LXC是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。

三、Docker项目架构

    Docker使用C/S架构,通过docker客户端连接到Docker服务器上从而管理Docker服务器里面的镜像和容器,类似于git的架构。

clipboard.png

四、三个核心概念:镜像、容器、仓库

三个Docker基本概念

Image(镜像):类似于模板,包含软件运行环境和代码。例如包含完整的CentOS系统,并安装了JRE。镜像用于创建Docker容器,镜像本身是只读的。

Container(容器):Docker利用容器来运行应用,容器是从镜像创建的运行实例。它可以被启动、停止、删除,每个容器相互隔离。

Repository(仓库): 几种存放Docker镜像的场所。最大的仓库未Dockey Hub,国内网易蜂巢:https://c.163.com等。一个仓库包含多个镜像。仓库可以分为私有和共有。私有的仓库可以push和pull。仓库注册服务器(Registry)往往包含多个仓库。

clipboard.png

Build-构建镜像 - 集装箱 - 镜像

Ship-运输镜像(从仓库和我们的主机上运输)- 码头 - 仓库

Run- 运行镜像(运行的镜像就是一个容器,可以当成一个“虚拟机”) - 运行程序的地方 - 容器

clipboard.png

docker镜像文件都是只读的,只有最上层是可以写

容器的本质是一个进程。

Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。

检查docker的版本,这样可以用来确认docker服务在运行并可通过客户端链接。

$docker version  

五、镜像加速

    鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置 国内镜像加速。

5.1 获取阿里云加速器地址

1.进入http://dev.aliyun.com
2.登录阿里云进入后台

clipboard.png

5.2 配置docker加速器

clipboard.png

点击 Apply&Restart 后 Docker 就会重启并应用配置的镜像地址了

5.3 检查加速器是否生效

配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。

clipboard.png

【下一篇:Docker简介、常用命令与实践(二)】

参考教程:Docker之编程环境应用

阅读 2.3k

刻意练习
技术学习点滴记录

不学习,如何肩负全面建设社会主义现代化任务。

6.4k 声望
3.3k 粉丝
0 条评论

不学习,如何肩负全面建设社会主义现代化任务。

6.4k 声望
3.3k 粉丝
文章目录
宣传栏