docker ,docker与虚拟机的区别

时间:2023-02-11 23:01:14

什么是Docker:

1.Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

2.Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

3.Docker是一个虚拟环境容器,可以将你的可执行文件、配置文件及一切其他你需要的文件一并打包到这个容器中,并发布和应用到任意平台。比如,你在本地用Python开发了一个网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。

如果不好理解,我们再拿集装箱打个比方。

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

docker也是类似的理念。我们可以在一台机器上跑多个互相毫无关联的docker容器,每一个容器就相当于一个集装箱。

为什么用docker:

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

Docker 在如下几个方面具有较大的优势:

更快速的交付和部署
Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发。可以直接集成到可持续开发流程中。

例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

高效的部署和扩容
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或方便的下线的你的应用和服务,这种速度趋近实时。

更高的资源利用率
Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

Docker引擎:

docker引擎是一个c/s结构的应用。
Server是一个常驻进程
REST API 实现了client和server间的交互协议
CLI 实现容器和镜像的管理,为用户提供统一的操作界面

docker特性:

在docker的网站上提到了docker的典型场景:
Automating the packaging and deployment of applications(使应用的打包与部署自动化)
Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。
构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。
PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础
因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来
因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源

docker局限:

Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:
Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
网络管理相对简单,主要是基于namespace隔离
cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
Docker对disk的管理比较有限
container随着用户进程的停止而销毁,container中的log等用户数据不便收集

Docker并非适合所有应用场景,Docker只能虚拟基于Linux的服务。Windows Azure 服务能够运行Docker实例,但到目前为止Windows服务还不能被虚拟化。
Docker在本质上是一个附加系统。使用文件系统的不同层构建一个应用是有可能的。每个组件被添加到之前已经创建的组件之上,可以比作为一个文件系统更明智。分层架构带来另一方面的效率提升,当你重建存在变化的Docker镜像时,不需要重建整个Docker镜像,只需要重建变化的部分.
可能更为重要的是,Docker旨在用于弹性计算。每个Docker实例的运营生命周期有限,实例数量根据需求增减。在一个管理适度的系统中,这些实例生而平等,不再需要时便各自消亡了。
针对Docker环境存在的不足,意味着在开始部署Docker前需要考虑如下几个问题。首先,Docker实例是无状态的。这意味着它们不应该承载任何交易数据,所有数据应该保存在数据库服务器中。
其次,开发Docker实例并不像创建一台虚拟机、添加应用然后克隆那样简单。为成功创建并使用Docker基础设施,管理员需要对系统管理的各个方面有一个全面的理解,包括Linux管理、编排及配置工具比如Puppet、Chef以及Salt。这些工具生来就基于命令行以及脚本.

Docker里的几个基本概念

镜像
镜像可以理解为一堆静态的文件

容器
容器则是镜像run起来之后的一个实例。镜像之于容器就好比面向对象编程里的class之于object。

仓库
镜像需要地方保存,这个地方就是仓库

与传统虚拟化的区别:

我们看到,传统虚拟化是站在硬件物理资源的基础上,虚拟出多个OS,然后在OS的基础上构建相对独立的程序运行环境,而Dokcer则是在OS的基础上进行虚拟,显然Dokcer轻量得多,因此其资源占用、性能消耗相比传统虚拟化都有很大优势。

什么是虚拟化?

顾名思义,虚拟化技术是将物理资源以某种技术虚拟成资源池的形式,主要有一虚多和多虚一两种形式,比如个人电脑安装Vmware软件,可以在这个软件上安装其他Win系统、MacOS、Linux系统等,实现一台电脑/笔记本承载多个系统的优点,目前苹果笔记本用户双系统解决方案也以虚拟机为主,普通Windows用户可能需求量不大,而技术人员基本是必备软件了。

虚拟化与docker的区别

docker设计小巧,部署迁移快速,运行高效,应用之间相互独立,管理人员可以看到所有容器的内容,虚拟化技术比较臃肿,不论什么应用都需要先创建新的系统,并且并非按照应用隔离,而是按照系统隔离,管理员无法看到系统内部信息
举个例子,Docker就是手机中的各种APP,只需要一个系统就可以下载自己所需的应用,但是虚拟化技术相当于你的苹果手机安装一个庞大软件,这个软件上安装安卓系统、魅族系统等,每个系统上还要安装各类应用,比较麻烦。
但两者没有绝对的好坏,主要还是看应用场景,根据不同的需求选择不同的解决方案即可。

常用命令

安装时注意修改 git安装路径

显示版本号
docker –versions

下载镜像
docker pull centos:版本号

显示镜像
docker images

保存镜像
docker save -o /home/dyufei/tensorflow.tar tensorflow/tensorflow

或者 docker save tensorflow/tensorflow > /home/dyufei/tensorflow.tar

加载镜像
docker load -i tensorflow.tar

登录系统 镜像编号
docker run -ti 6866
docker run -it centos /bin/bash

提交更改
docker commit 容器id 镜像名称

删除镜像

docker rmi -f 镜像id

检查系统
cat /etc/redhat-release

退出镜像
exit

docker run -it ubuntu:rename /bin/echo "Hello World"

docker stop 镜像IP 停止
yum list 查看需要安装的
yum list installed 查看已经安装的