微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Docker简介与简单使用

 常仕禄 分布式实验室

图片

前一段花了一段时间研究Log4j2的源码,现在这个项目基本也告一段落,也算是度过了初入职场这一个阶段。之前在18年总结时说过19年自己要学会C++,所以接下来一段时间,会用一些文章和大家分享下自己学习C++过程中的新的,不过在正式写关于C++内容前,想先介绍一下Docker,因为有了这个利器,自己搞个小开发环境会变得十分简单。而且在云化的时代,如果连Docker都没用过甚至没听说过的话确实有点说不过去。所以我愿意单独拉出一篇文简单介绍一下Docker的使用,后面的C++开发环境也会直接使用Docker进行部署。本文主要分为3部分,什么是Docker,为什么用Docker以及Docker的基本使用方法。闲言少叙,直奔主题~
什么是Docker

图片


至于给Docker的定义,我觉得还是直接引用吧,Docker是一个用Go语言开发的一个开源容器引擎,Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的App),更重要的是容器性能开销极低。
Docker作为虚拟化分支的一项重要的革新,有必要将Docker和其他虚拟化技术进行一下比较。下面是介绍虚拟化过程中最常见的一张图,它描述了计算机从软到硬的一个层次关系。 

图片


这个图看似简单,其实它很清晰的描述了计算机资源的一种层次关系。最底层是基础设施层,基本都是硬件方面的构成,如cpu,内存,磁盘,这些支撑了计算机的基本运行,如果没有这些硬件,计算机也就不存在了。在硬件层上运行了格式的操作系统,他能够根据合理的将硬件资源合理的分配给上面的应用,并保证他们有条不紊的运行。在系统上自带一些系统的lib和可执行命令,这些可执行命令就是我们常用的Linux命令(cd,cat,ls….太多了),Lib则包含了一些基本程序库,供我们自己编写的各种程序调用。最上面就是我们开发的各种Application了。
Docker与虚拟机
说完了基本的分层关系,下面就需要重点介绍两种比较重要的虚拟化技术,虚拟机和Docker,虽然感觉区别被讲烂了不过为了介绍的完整性还是简单提一句,还请大家耐心看完。
Hypervisor与虚拟机
从本质上看,虚拟机和Docker属于在不同层次上的虚拟,虚拟机则是虚拟到操作系统层次的,如下图所示。 

图片


在宿主机的操作系统中,抽象出了一个Hypervisor的概念,因为自己并没有涉猎过这个领域,所以扒一些现成的资料给我自己扫扫盲。
首先是Hypervisor的定义,根据wiki上讲,Hypervisor或者Virtual Machine Monitor(VMM)是创造并且运行虚拟机的软件、固件、或者硬件,通俗的讲,hypervisor是一种将操作系统和硬件分离的一种方式,使得宿主机的硬件上能够同时运行多个虚拟机。
Hypervisor具有如下的优点:
  • 提高主机硬件的使用率

  • 虚拟机移动性较强

  • 资源的隔离性,某台虚拟机的宕机不影响其他虚拟机的使用

  • 易保护,易恢复


Hypervisor种类: 

图片


如上面两张图所示,Hypervisor分为两类,一类是直接部署在硬件层面上(bare-Metal hypervisors),另一类则是部署在宿主机的操作系统上,算是一种软件(hosted hypervisors)。两种方式的特点与典型系统如下:
  • bare-Metal hypervisors 特点

    • 需要硬件支持

    • 虚拟机monitor作为主操作系统

    • 运行效率高


典型系统

  • VMware5.5+

  • Xen3.0+

  • KVM


  • hosted hypervisors 特点

    • 虚拟机监视器作为应用程序运行在主操作系统环境内

    • 效率较低


  • 典型系统

    • Virtual Box

    • early VMware5.5

    • early Xen3.0


Docker
与虚拟机不同,Docker是通过软件层的虚拟化实现了更加轻量级的虚拟化,其架构图如下: 

图片


初步看来,Docker所在的层级与虚拟机所在的层次相同,都是在宿主机的操作系统上部署,但是Docker完全是软件,不需要硬件进行支持,它利用的是操作系统自带的资源隔离机制对硬件资源进行隔离,例如Win中的Hyper-v,Linux中的cgroup等,由Docker的后端程序Docker Engine调用这些接口完成资源隔离。Docker在创建容器时并不运行完整的操作系统,使用的资源更少,部署,启动更快。但提供的隔离粒度不足,所以Docker更加适合单个用户使用,而虚拟机则更适合在多个用户混合的多租户类型的场景中执行。
为什么用Docker

图片


其实这个问题我在介绍虚拟机与Docker的区别时已经提到,Docker由于其使用了更加轻量级的隔离机制,不论是在部署,启动恢复上均比虚拟机要快上数个数量级,因此,如果是个人用户想要快速构建某个特定的环境,比如想要测试某个代码在linux的运行情况,而使用的是mac系统或win系统,或者练习搭建环境等,通过Docker可以快速满足需求。
Docker简单使用方法

图片


Docker架构
介绍使用方法前,先明确Docker中的几个基本组件以及这些组件的交互关系。 

图片


  • Docker镜像:Docker镜像是用于创建Docker容器的模板

  • Docker容器(Container):容器是独立运行的一个或一组应用

  • Docker客户端(Client):Docker客户端通过命令行或者其他工具使用Docker API与Docker的守护进程通信。

  • Docker主机(Host):一个物理或者虚拟的机器用于执行Docker守护进程和容器

  • Docker仓库(Registry):Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub提供了庞大的镜像集合供使用。

  • Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure


终于到了实战环节,在这一小节里面,我们通过两个具体案例介绍Docker的简单使用方法,首先是Docker的Hello World,另一个则是按照Docker官方文档部署一个Flask后端服务。
安装Docker
Mac && Windows:直接下载安装文件进行安装
Linux:

image.png


Docker Hello World
这个案例非常简单,只有一个命令:

docker run hello-world


如果看到下图中的结果则说明成功。 

图片


Docker复杂使用
这个应用主要是一个Python的Web服务,该服务用于统计用户访问量,用户访问量存储在Redis中。下面正式开始部署。
首先先写一个Flask的Python程序,主要的统计逻辑和前端展示都由这个文件提供,代码如下:

image.png


然后编写Python需要的依赖文件requirements.txt。

image.png


最后写出Docker的部署文件Dockerfile:

image.png

最后的目录结构如下: 

图片


完成之后开始构建,首先build镜像:

docker build -t bryantchangflasktest .


其中 -t 的作用是指定镜像的名字。
完成构建后,结果如下: 

图片


使用docker images查看已经构建的镜像: 

图片


完成构建后,接下来开始运行:

docker run -p 4001:80 bryantchangflasktest  ##将4001端口映射到80端口


运行结果: 

图片


可以看到因为没有配置Redis所以这里面的异常是我们预期内的,为了做后面的配置方便,我们将镜像上传到公共镜像,命令如下:

docker build -t bryantchangxy/bryantchangflasktest .docker push bryantchangxy/bryantchangflasktest:latest


涉及的一些常见命令:

image.png


注意,下面我不再继续沿用那篇文档里面的内容,我直接将Flask和Redis集成,并使用Docker Compose部署,部署文件为docker-compose.yml,内容如下:

web:  build: .  command: python app.py  ports:    - "4001:80"  volumes:    - .:/app  links:    - redisredis:  image: microBox/redis


最后部署镜像,命令如下:

docker-compose up -d


完成后,输入localhost:4001,终于看到了最终的结果: 

图片


对于Docker Compose的使用,参见博客:https://blog.csdn.net/u011781521/article/details/80464826。
原文链接:https://bryantchang.github.io/2019/02/17/docker-utilization/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐