戳蓝字“CSDN云计算”关注我们哦!

技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!

作者:常仕禄

转自: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:

  1. yum install -y epel-release ##安装仓库

  2. yum install docker-io ##安装Docker

  3. chkconfig docker on ## 加入开机自动启动

  4. service docker start ## 启动Docker

Docker Hello World

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

  1. docker run hello-world

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

Docker复杂使用

这个应用主要是一个Python的Web服务,该服务用于统计用户访问量,用户访问量存储在Redis中。下面正式开始部署。

首先先写一个Flask的Python程序,主要的统计逻辑和前端展示都由这个文件提供,代码如下:

  1. from flask import Flask

  2. from redis import Redis, RedisError

  3. import os

  4. import socket

  5. # Connect to Redis

  6. redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)## 连接redis

  7. app = Flask(__name__)

  8. @app.route("/")

  9. def hello():

  10. try:

  11. visits = redis.incr("counter") ##获取计数器当前值并将其+1

  12. except RedisError:

  13. visits = "<i>cannot connect to Redis, counter disabled</i>"

  14. html = "<h3>Hello {name}!</h3>" \

  15. "<b>Hostname:</b> {hostname}<br/>" \

  16. "<b>Visits:</b> {visits}"

  17. return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) ##网页渲染

  18. if __name__ == "__main__":

  19. app.run(host='0.0.0.0', port=80) ## 服务的设置为80端口

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

  1. Redis

  2. Flask

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

  1. # 将官方 Python 运行时用作父镜像

  2. FROM python:2.7-slim

  3. # 将工作目录设置为 /app

  4. WORKDIR /app

  5. # 将当前目录内容复制到位于 /app 中的容器中

  6. ADD . /app

  7. # 安装 requirements.txt 中指定的任何所需软件包

  8. RUN pip install -r requirements.txt

  9. # 使端口 80 可供此容器外的环境使用

  10. EXPOSE 80

  11. # 定义环境变量

  12. ENV NAME World

  13. # 在容器启动时运行 app.py

  14. CMD ["python", "app.py"]

最后的目录结构如下:

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

  1. docker build -t bryantchangflasktest .

其中 -t 的作用是指定镜像的名字。

完成构建后,结果如下:

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

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

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

运行结果:

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

  1. docker build -t bryantchangxy/bryantchangflasktest .

  2. docker push bryantchangxy/bryantchangflasktest:latest

涉及的一些常见命令:

  1. docker build -t friendlyname .# 使用此目录的 Dockerfile 创建镜像

  2. docker run -p 4001:80 friendlyname # 运行端口 4001 到 80 的“友好名称”映射

  3. docker run -d -p 4001:80 friendlyname # 内容相同,但在分离模式下

  4. docker ps # 查看所有正在运行的容器的列表

  5. docker stop <hash> # 平稳地停止指定的容器

  6. docker ps -a # 查看所有容器的列表,甚至包含未运行的容器

  7. docker kill <hash> # 强制关闭指定的容器

  8. docker rm <hash> # 从此机器中删除指定的容器

  9. docker rm $(docker ps -a -q) # 从此机器中删除所有容器

  10. docker images -a # 显示此机器上的所有镜像

  11. docker rmi <imagename> # 从此机器中删除指定的镜像

  12. docker rmi $(docker images -q) # 从此机器中删除所有镜像

  13. docker login # 使用您的 Docker 凭证登录此 CLI 会话

  14. docker tag <image> username/repository:tag # 标记 <image> 以上传到镜像库

  15. docker push username/repository:tag # 将已标记的镜像上传到镜像库

  16. docker run username/repository:tag

  17. docker stack ls # 列出此 Docker 主机上所有正在运行的应用

  18. docker stack deploy -c <composefile> <appname> # 运行指定的 Compose 文件

  19. docker stack services <appname> # 列出与应用关联的服务

  20. docker stack ps <appname> # 列出与应用关联的正在运行的容器

  21. docker stack rm <appname> # 清除应用

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

  1. web:

  2. build: .

  3. command: python app.py

  4. ports:

  5. - "4001:80"

  6. volumes:

  7. - .:/app

  8. links:

  9. - redis

  10. redis:

  11. image: microbox/redis

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

  1. docker-compose up -d

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

对于Docker Compose的使用,参见博客:https://blog.csdn.net/u011781521/article/details/80464826。

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

推荐阅读:

  • 分布式架构系列: 负载均衡技术详解 | 技术头条

  • 00后的AI开发者进阶之道:从入门到鏖战MIT编程大赛 | 人物志

  • 吃了公司零食被指“偷吃”,外包怎么了?

  • ICPC 2019国际大学生程序设计竞赛,中国高校未能夺冠

  • EOS现状: 72%应用涉赌被列为高危, 说好的诗和远方, 你竟沦落成了这样?

  • 凉山火灾启示录:面对大火,AI 能做些什么?

真香,朕在看了!

Docker简介与简单使用 | 技术头条相关推荐

  1. 深入浅出Docker 镜像 | 技术头条

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作为云计算的当红明星Docker 来势 ...

  2. 使用云原生buildpacks将你的代码转换成Docker Image | 技术头条

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 当我们在大概七年前将buildpack ...

  3. 在docker上调用宿主机硬件_Docker精华问答:Docker与虚拟机的区别?| 技术头条

    Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署.测试和分发都变得前所未有的高效和轻松! 1 ...

  4. Docker精华问答:Docker与虚拟机的区别?| 技术头条

    Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署.测试和分发都变得前所未有的高效和轻松! 1 ...

  5. 从Spark Streaming到Apache Flink: 实时数据流在爱奇艺的演进 | 技术头条

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者:陈越晨 转自:高可用架构 本文将 ...

  6. 10亿级数据规模的半监督图像分类模型,Imagenet测试精度高达81.2% | 技术头条...

    译者 | linstancy 作者| I. Zeki Yanlniz, Herve Jegou, Kan Chen, Manohar Paluri, Dhruv Mahajan 编辑 | 蓝色琥珀鱼, ...

  7. 恶犬秒变萌汪:东京大学开源“治愈系”GAN图片拼贴工具 | 技术头条

    参加「CTA 核心技术及应用峰会」,请扫码报名 ↑↑↑ 译者 | linstancy 责编 | 琥珀 出品 | AI科技大本营(id:rgznai100) 教新手画画?字体风格迁移?换明星" ...

  8. AI算法在FPGA芯片上还有这种操作?| 技术头条

    作者 | 杨付收 出品 | CSDN(ID:CSDNnews) 碾压与崛起 AI算法的崛起并非一帆风顺的,现在的主流的NN类的卷积神经网络已经是第二波浪潮了,早在上个世纪80年代,源于仿生学,后又发展 ...

  9. 如何构建优质的推荐系统服务?| 技术头条

    作者丨gongyouliu 来源 | 大数据与人工智能(ID:ai-big-data) 任何一个优质的软件服务都必须考虑高性能.高可用(HighAvailability).可伸缩.可拓展.安全性等5大 ...

最新文章

  1. vector,数组,动态数组效率测试
  2. HTML设置字体颜色1008无标题,如何在HTML中设置字体颜色,你知道这几种方式吗?...
  3. How Setting Show Transaction Code on SAP Tree Menu Side.
  4. 推荐系统知识梳理——WideDeep
  5. raspberry ubuntu 修改源为清华_Ubuntu 下 Janus Server 搭建笔记
  6. [Angular 2] Nesting Elements in Angular 2 Components with ng-content (AKA Angular 2 Transclusion)
  7. 报告:上周比特币基金流出9800万美元,ETH、ADA等投资需求上升
  8. Django内置数据表
  9. 移动100m宽带慢的要死_【今日小知识】卡吗?慢吗?移动千兆路由器带你飞
  10. Weui 结合 xmlHttpRequest 上传图片
  11. 人口预测模型及matlab代码
  12. 深度学习图像分类问题涨分总结
  13. java 数据权限控制_数据权限-数据列权限设计方案
  14. android获取手机号码的归属地以及运营商,本地查询
  15. win7计算机搜不到无线网,怎么解决win7笔记本搜索不到WiFi
  16. 全国各地DNS地址详细列表
  17. 她 | papi酱的中场“战事”
  18. idea翻译成中文是什么意思_agoodidea翻译成中文是什么意思
  19. 八年级python考试题及答案_(新世纪版)2018-2019学年第二学期八年级信息技术期末试卷+答题卡+答案...
  20. App Store搜索广告如何筛词

热门文章

  1. php 匹配关键字,php获取搜索引擎搜索关键词关键字的正则表达式实现方法
  2. ios jsonkit 报错_iOS开源项目:JSONKit
  3. methods vue过滤器 和_数据动态过滤技巧在 Vue 项目中的实践
  4. linux awk if 多个条件,linux shell awk 流程控制语句(if,for,while,do)详细介绍
  5. 成果堪称“诺奖”一夜成名却无法复现的韩春雨,再发高分文章
  6. 震撼!7月12日山东滨州,中科院向起电的雷暴云发射拖带金属导线专用火箭人工引雷!...
  7. 权威发布:2020软科中国最好学科排名
  8. 网友的有趣发现:冬天里,欧洲古建筑上的雕像都好像“生病了”
  9. Mysql写入数据时,adapter 日志报ES连接错误
  10. 如何画一张架构图(内含知识图谱)