设置网站默认首页,网站进行诊断,这么改变WordPress上传主题的大小,建设银行杭州网站首页戳蓝字“CSDN云计算”关注我们哦#xff01;技术头条#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前#xff0c;get要点、solve难题#xff0c;统统不在话下#xff01;作者#xff1a;常仕禄转自#xff1a;Docker前一段花了一段时间研究Log4j2的源码技术头条干货、简洁、多维全面。更多云计算精华知识尽在眼前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命令cdcatls….太多了Lib则包含了一些基本程序库供我们自己编写的各种程序调用。最上面就是我们开发的各种Application了。Docker与虚拟机说完了基本的分层关系下面就需要重点介绍两种比较重要的虚拟化技术虚拟机和Docker虽然感觉区别被讲烂了不过为了介绍的完整性还是简单提一句还请大家耐心看完。Hypervisor与虚拟机从本质上看虚拟机和Docker属于在不同层次上的虚拟虚拟机则是虚拟到操作系统层次的如下图所示。 在宿主机的操作系统中抽象出了一个Hypervisor的概念因为自己并没有涉猎过这个领域所以扒一些现成的资料给我自己扫扫盲。首先是Hypervisor的定义根据wiki上讲Hypervisor或者Virtual Machine MonitorVMM是创造并且运行虚拟机的软件、固件、或者硬件通俗的讲hypervisor是一种将操作系统和硬件分离的一种方式,使得宿主机的硬件上能够同时运行多个虚拟机。Hypervisor具有如下的优点提高主机硬件的使用率虚拟机移动性较强资源的隔离性某台虚拟机的宕机不影响其他虚拟机的使用易保护易恢复Hypervisor种类 如上面两张图所示Hypervisor分为两类一类是直接部署在硬件层面上bare-metal hypervisors另一类则是部署在宿主机的操作系统上算是一种软件hosted hypervisors。两种方式的特点与典型系统如下bare-metal hypervisors 特点需要硬件支持虚拟机monitor作为主操作系统运行效率高典型系统VMware5.5Xen3.0KVMhosted hypervisors 特点虚拟机监视器作为应用程序运行在主操作系统环境内效率较低典型系统Virtual Boxearly VMware5.5early Xen3.0Docker与虚拟机不同Docker是通过软件层的虚拟化实现了更加轻量级的虚拟化其架构图如下 初步看来Docker所在的层级与虚拟机所在的层次相同都是在宿主机的操作系统上部署但是Docker完全是软件不需要硬件进行支持它利用的是操作系统自带的资源隔离机制对硬件资源进行隔离例如Win中的Hyper-vLinux中的cgroup等由Docker的后端程序Docker Engine调用这些接口完成资源隔离。Docker在创建容器时并不运行完整的操作系统使用的资源更少部署启动更快。但提供的隔离粒度不足所以Docker更加适合单个用户使用而虚拟机则更适合在多个用户混合的多租户类型的场景中执行。为什么用Docker其实这个问题我在介绍虚拟机与Docker的区别时已经提到Docker由于其使用了更加轻量级的隔离机制不论是在部署启动恢复上均比虚拟机要快上数个数量级因此如果是个人用户想要快速构建某个特定的环境比如想要测试某个代码在linux的运行情况而使用的是mac系统或win系统或者练习搭建环境等通过Docker可以快速满足需求。Docker简单使用方法Docker架构介绍使用方法前先明确Docker中的几个基本组件以及这些组件的交互关系。 Docker镜像Docker镜像是用于创建Docker容器的模板Docker容器Container容器是独立运行的一个或一组应用Docker客户端ClientDocker客户端通过命令行或者其他工具使用Docker API与Docker的守护进程通信。Docker主机Host一个物理或者虚拟的机器用于执行Docker守护进程和容器Docker仓库RegistryDocker仓库用来保存镜像可以理解为代码控制中的代码仓库。Docker Hub提供了庞大的镜像集合供使用。Docker MachineDocker Machine是一个简化Docker安装的命令行工具通过一个简单的命令行即可在相应的平台上安装Docker比如VirtualBox、 Digital Ocean、Microsoft Azure终于到了实战环节在这一小节里面我们通过两个具体案例介绍Docker的简单使用方法首先是Docker的Hello World另一个则是按照Docker官方文档部署一个Flask后端服务。安装DockerMac Windows直接下载安装文件进行安装Linuxyum install -y epel-release ##安装仓库yum install docker-io ##安装Dockerchkconfig docker on ## 加入开机自动启动service docker start ## 启动DockerDocker Hello World这个案例非常简单只有一个命令docker run hello-world如果看到下图中的结果则说明成功。 Docker复杂使用这个应用主要是一个Python的Web服务该服务用于统计用户访问量用户访问量存储在Redis中。下面正式开始部署。首先先写一个Flask的Python程序主要的统计逻辑和前端展示都由这个文件提供代码如下from flask import Flaskfrom redis import Redis, RedisErrorimport osimport socket# Connect to Redisredis Redis(hostredis, db0, socket_connect_timeout2, socket_timeout2)## 连接redisapp Flask(__name__)app.route(/)def hello(): try: visits redis.incr(counter) ##获取计数器当前值并将其1 except RedisError: visits icannot connect to Redis, counter disabled/i html h3Hello {name}!/h3 \ bHostname:/b {hostname}br/ \ bVisits:/b {visits} return html.format(nameos.getenv(NAME, world), hostnamesocket.gethostname(), visitsvisits) ##网页渲染if __name__ __main__: app.run(host0.0.0.0, port80) ## 服务的设置为80端口然后编写Python需要的依赖文件requirements.txt。RedisFlask最后写出Docker的部署文件Dockerfile# 将官方 Python 运行时用作父镜像FROM python:2.7-slim# 将工作目录设置为 /appWORKDIR /app# 将当前目录内容复制到位于 /app 中的容器中ADD . /app# 安装 requirements.txt 中指定的任何所需软件包RUN pip install -r requirements.txt# 使端口 80 可供此容器外的环境使用EXPOSE 80# 定义环境变量ENV NAME World# 在容器启动时运行 app.pyCMD [python, app.py]最后的目录结构如下 完成之后开始构建首先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涉及的一些常见命令docker build -t friendlyname .# 使用此目录的 Dockerfile 创建镜像docker run -p 4001:80 friendlyname # 运行端口 4001 到 80 的“友好名称”映射docker run -d -p 4001:80 friendlyname # 内容相同但在分离模式下docker ps # 查看所有正在运行的容器的列表docker stop hash # 平稳地停止指定的容器docker ps -a # 查看所有容器的列表甚至包含未运行的容器docker kill hash # 强制关闭指定的容器docker rm hash # 从此机器中删除指定的容器docker rm $(docker ps -a -q) # 从此机器中删除所有容器docker images -a # 显示此机器上的所有镜像docker rmi imagename # 从此机器中删除指定的镜像docker rmi $(docker images -q) # 从此机器中删除所有镜像docker login # 使用您的 Docker 凭证登录此 CLI 会话docker tag image username/repository:tag # 标记 image 以上传到镜像库docker push username/repository:tag # 将已标记的镜像上传到镜像库docker run username/repository:tag docker stack ls # 列出此 Docker 主机上所有正在运行的应用docker stack deploy -c composefile appname # 运行指定的 Compose 文件docker stack services appname # 列出与应用关联的服务docker stack ps appname # 列出与应用关联的正在运行的容器docker stack rm appname # 清除应用注意下面我不再继续沿用那篇文档里面的内容我直接将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。福利扫描添加小编微信备注“姓名公司职位”加入【云计算学习交流群】和志同道合的朋友们共同打卡学习推荐阅读分布式架构系列: 负载均衡技术详解 | 技术头条00后的AI开发者进阶之道从入门到鏖战MIT编程大赛 | 人物志吃了公司零食被指“偷吃”外包怎么了ICPC 2019国际大学生程序设计竞赛中国高校未能夺冠EOS现状: 72%应用涉赌被列为高危, 说好的诗和远方, 你竟沦落成了这样凉山火灾启示录面对大火AI 能做些什么真香朕在看了