Docker是个啥?

谈到docker大家应该都不陌生,从2013年初诞生到现在,短短两年时间内,迅速成为仅次于openstack的最受欢迎的云计算开源项目。

那么是什么原因导致docker这么火热呢?

我也很感兴趣,因此我将用docker实践这一系列博文,记录我对docker的认识和实践。

本文主要介绍docker是什么,以及docker与传统虚拟化之间的区别等。

docker是什么?

docker,它是一个基于LXC(LinuX Container)的高级容器引擎,使用Go语言开发,遵循Apache2.0协议,全部开源代码均托管在github上(https://github.com/docker/docker)。它诞生于2013年初,最初发起者是dotCloud公司,该公司现已经改名为Docker Inc,专注于Docker相关技术和产品的开发。

目前,主流的linux、windows和mac都已经支持docker。需要注意的是,由于docker是基于LXC的,所以除了linux之外的操作系统,都是靠在虚拟机里面跑linux,再在linux上跑docker来实现的。

docker诞生的主要目标是"Build,Ship and Run Any App,Anywhere",即通过对应用组件的封装(Packaging)、分发(Deployment)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的"一次封装,到处运行"。这里的应用组件,既可以是一个web应用,也可以是一套数据库服务,甚至是一个操作系统或者编译器。

LXC是什么?

docker引擎的基础是Linux容器(linux container,LXC)技术。IBM DevelperWorks上给出了关于容器技术的准确描述:

容器有效地将单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。

liunux容器并不是一个全新的概念,早期的容器技术有chroot、Solaris Containers、FreeBSD jail、linux-VServer、Solaris Zones、OpenVZ、lxc等。虽然这些技术发展很早,但是并没有集成到linux内核中去,使用起来很不方便,比如OpenVZ需要先给操作系统打上特定的内盒补丁才能使用。LXC项目借鉴了前人成熟的容器设计理念,并给予一系列新的内核特性实现了更具扩展性的虚拟化容器方案,并且被集成到了主流linux内核中,进而成为linux系统轻量级容器技术的事实标准。

在LXC的基础上,docker做了很大的改善,比如:

1、LXC的定位是作为一种虚拟机的替代方案。虽然所有的软件都可以安装在由 LXC 或者 Docker 管理的容器中,但是 Docker 更倾向于在一个容器中运行一个应用

2、每个LXC容器之间或许不兼容,但是 docker 采用了一种标准的配置方法使得由不同docker创建出的LXC能够完全兼容

3、Docker实现了类似 git 的容器版本管理方法,并且能够进行增量更新。

4、可以创建 base image 并将其保存在远程仓库 (repository) 中以便复用,其他容器可以在其基础上进行创建并保存为新的image。

5、docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,可以简单明了地管理和使用容器

6、Docker管理着一个公共的 image 库方便用户分享自己的image,同时公司也可以构造自己私有的 image 库。

7、Docker的容器是根据 Dockerfile 构建的,你可以在构建 image 的过程中,根据需要运行任何命令和程序。

8、因为 docker 越来越流行,有大量的方法能够将其轻易地集成到开发过程中,比如可以采用统一的方法来构造用于持续集成的环境和开发环境的容器。

Docker与虚拟机的区别

其实,docker和虚拟机都是属于虚拟化技术。而虚拟化技术又分了很多种类。比如VM、KVM这种全虚拟化和早期的Xen这种半虚拟化。而docker则是属于操作系统级虚拟化。

像VM、KVM之类的虚拟出来的都是虚拟机,而docker作为一种轻量级的虚拟化方式,那么docker在运行应用上跟传统的虚拟机方式有哪些显著优势呢?

1、docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快的很多

2、docker容器对系统资源需求很少,一台主机上可以同时运行数千个docker容器

3、docker通过类似git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本很低

4、docker通过dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率

下面是docker容器技术和传统虚拟机技术的特性比较:

特性 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个
隔离性 安全隔离 安全隔离

docker的这些优势是什么造成的呢?我们可以先看下图:

传统虚拟化是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层,而docker容器却不需要这两层,而是直接使用操作系统的系统调用接口。正因为这样子,docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统虚拟机方式,运行N个不同的应用就要启动N个虚拟机(每个虚拟机需要单独分配内存、磁盘等资源),而docker只需要启动N个隔离的容器,并将应用放到容器中即可,这样子就减少了很多的资源消耗。

docker在软件开发流程中的优势

docker在设计之初就有以下几个目的:

1、加强开发人员写代码的开发环境和应用程序要部署的生产环境的一致性,从而降低那种"开发一切正常,肯定是运维的问题"的风险。

2、缩短代码从开发、测试到部署、上线运行的周期,让你的程序具备可以执行,易于构建、并易于协作

3、docker鼓励面向服务的架构和微服务架构。docker推荐单个容器运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型

使用docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。

总体来讲,docker在开发和运维过程中,具有如下优势:

1、更快速的交付和部署

2、更高效的资源利用。docker容器的运行不需要额外的虚拟机管理程序(VMM,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的需求很低

3、更轻松的迁移和扩展

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

OK!

以上即是本文的全部内容,有关docker的其它内容,会在下篇博文出现。

时间: 2024-10-13 21:48:10

Docker是个啥?的相关文章

Docker学习笔记——Mongo Dockerfile及容器运行

1.创建项目目录mongo,在目录下上传下载的Mongodb安装文件及mongo.conf配置文件,创建Dockerfile文件,项目结构如下: mongo - Dockerfile - mongo.conf - mongodb-linux-x86_64-3.4.9.tgz - data - logs Dockerfile内容如下: # mongo # SOURCE_IMAGE FROM centos # MAINTAINER_INFO MAINTAINER bluemooder [email 

docker深入2-API示例

2017/9/18 一.目的 演示 http API 使用的方式 注1:本次实例是在 docker swarm mode 下使用的,目的是:更新指定服务的镜像. 注2:要在 swarm manager node 上执行. docker 的 API 文档是自动生成的,没有太多有用的示例可用. [版本] ~]# docker version Client:  Version:      17.06.0-ce  API version:  1.30  Go version:   go1.8.3  Gi

docker私有仓库删除image

docker仓库存放着公司内部的镜像.时间长了难免存在一些废弃的镜像在里面.如果不删除造成空间的浪费.下面就简单的看看仓库中的镜像是怎么删除的. 第一步:registry启动依赖config.yml配置文件:在默认文件的storage区域中添加delete_enable_ture配置项.也可以在启动时候指定-e添加.允许删除镜像: 配置文件: 第二步:下载registry镜像并启动容器. docker run  -d -v /conf/:/etc/docker/registry -v /opt/

docker run常用命令及 解决 ubuntu镜像无法识别 ifconfig ping 命令

docker run -it     docker 前端启动 container容器           -d             后端启动 container容器           -p             固定端口映射            -P             不固定端口映射           --name         给生成的容器起名字docker ps:默认显示正在运行的container       ps -a 显示所有的container容器docker r

原创:Docker在云家政的应用 谢绝复制粘贴内容

我们公司目前大规模使用了Docker,目前除了数据库应用,其他所有应用都在Docker容器内运行,下面我就Docker在公司的应用做一些分享.. 首先我介绍一下公司的背景,公司属于中小型创业公司,服务器数量不多,但是为了解决一些问题,我们引入了现在比较火的Docker技术. 看一下我们在没用Docker之前遇到的问题: 1.线上环境和测试环境不完全一致,导致测试好的功能上线后会出现一些BUG. 2.部署新项目步骤繁琐,批量部署运行环境后,需要根据每个项目不同的情况,手动修改配置参数. 3.新项目

win7 系统安装 docker

如果顺利的话,步骤如下: 1.下载DockerToolbox 2.安装DockerToolbox,默认配置,一路下一步即可完成安装 3.安装成功后,桌面会新增三个快捷方式,如下图 4.点击运行Docker Quickstart Terminal,会从github加载boot2docker.iso,加载完成后会自动在Oracle VM VirtualBox中创建一个Linux的虚拟环境 5.显示如下图表示安装成功 6.执行 docker run hello-world再次验证一下 如果遇到问题,可

【Docker常见问题1】​下载docker镜像,如何下载指定的应用版本?

举例:如何下载postgres版本9.2? 步骤1:访问官网 https://hub.docker.com/ 步骤2:搜索postgres镜像 搜索框,输入postgres进行搜索 步骤3:查看已发布的版本 点击进入postgres页面,并点击tags,可看到已发布的版本 步骤4:选择一个版本下载 下载版本9.2 sudo docker pull postgres:9.2 或下载最新版本 sudo docker pull postgres:latest

【Docker常见问题2】如何设置容器日志大小和保留个数

举例:当tomcat容器的运行,容器占用空间越来越大,约1个月就会超过2G,如何解决? 步骤1:查看容器日志大小:假设容器目录为/var/lib/docker/containers,那么执行如下命令 cd /var/lib/docker/containers  #进入默认容器空间目录 du -sh *            #统计文件大小2.4G  de92a5643f7ffb106f8abba21fc0f93996842917a52879153adc95a73312934a-json.log

Docker的概念及剖析原理和特点

一.docker的简介: 应用容器是个啥样子呢,一个做好的应用容器长的就像一个装好了一组特定应用的虚拟机一样,比如我现在想用mysql数据库,我直接找个装好了的MySQL的容器就可以了,想用的时候一运行容器,MySQL服务就起来了,就可以使用MySQL了 为什么不能直接安装一个MySQL?或者是SqlServer呢也可以啊? 答:因为有的时候根据每个人的电脑的不同,在物理机安装的时候会出现各种各样的错误,突然你的机器中病毒了或者是挂了,你所有的服务都需要重新安装. 注意:    但是有了dock

docker的存储结构,和以前有了很大不同

在网上学习这一块知识点时,有一个URL讲得很详细, docker 镜像与容器存储目录结构精讲 http://blog.csdn.net/wanglei_storage/article/details/50299491 但我在最新版的docker作验证时,发现早已物是人非,等以后用得着时,再仔细研究吧. 我作的截图如下: overlay里作image相关的存储, 而container目录里作run起来的docker容器的相关存储, 且两者之间,有uuid作对应. 在下图中已标明.