容器简介

管理程序虚拟化(hypervisor virtualization, HV)是通过中间虚拟运行于物理硬件之上。而容器是直接运行在操作系统内核之上用户空间。因此,容器虚拟化运行也成为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上。

容器只能运行与底层宿主机相同或类似的操作系统。例如,可以在 Ubuntu 服务器中运行 RedHat Enterprise Linux,但是不能运行 Windows。

在超大规模的多租户服务不熟、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。比如“权限隔离监牢”(chroot jail),它建立一个隔离的目录环境来运行进程,如果权限隔离监牢正在运行的进程被入侵者攻破,入侵者便会发现自己身陷“身陷囹圄”,因为权限不足被困在容器创建的目录中,无非对宿主机进行进一步的破坏。

最新的容器引入了 Open、Solaris Zones、Linux 容器(如 lxc),容器不再仅仅是一个单纯的运行环境。在自己的权限范围内,容器更像是一个完整的宿主机。

Docker 得益于现代 Linux 内核特性,如控件组(control group)、命名空间(namespace)技术,容器和宿主机直接的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,是的同一台宿主机中的多个容器可以友好地共存。

容器开销低,和传统的虚拟化以及半虚拟化(paravirtualization)相比,容器运行不需要模拟层(emulation layer)和管理层(hypervisor layer),二手使用操作系统的系统调用接口,着降低了运行单个容器所吸引的开销,也是的宿主机中可以运行更多的容器。

但容器本身比较复杂,不易安装,管理和自动化也很困难,而Docker就是为改变着一切而生的。

Docker简介

Docker是一个能把开发应用程序自动不熟到容器的开源引擎。由Docker 团队编写,基于Apache 2.0 开源协议发行。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

Docker在虚拟化的容器执行环境中增加了一个应用部署引擎,该引擎的目标是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。Docker机器简洁,它所需要的全部环境只是一台仅仅安装了兼容版本的Linux内核和二进制文件最小限的宿主机。而Docker的目标是提供一些这些东西:

提供简单、轻量的建模方式

Docker上手非常快,只要几分钟就能把自己的程序“Docker化”(Dockerize)。Docker依赖于“写时付至”(copy-on-write)
模型,是修改应用程序也非常迅速,可以说是“随心所至,代码即改”。

随后就可以创建容器来运行程序了。大多数Docker容器只需不到1秒钟即可启动。去除了管理程序的开销,性能较高,可以同时运行多个容器。

职责的逻辑分离

使用Docker,开发人员只需关系容器运行的程序,运维人员只需关系如何管理容器。加强了开发人员写代码的环境与程序部署的生产环境的一致性。

快速、高效的开发生命周期

缩短代码从开发、测试、部署、上下的周期,让应用可移植、易构建、易协作。

鼓励使用面向服务的架构

Docker推荐单个容器运行一个应用程序或进程,形成分布式的应用程序模型,这样,程序或服务都可以表示为一系列内部互联的容器,使分布式部署应用程序,扩展或调试程序标的简单。当然也可以在一个容器里运行多个进程的应用程序。

Docker 组件

镜像

Docker 镜像就是一个只读的模板。例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。

镜像是Docker生命周期中的“构建”部分,可以用来创建 Docker 容器。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,可以当做容器的“源代码”,它体积很小,便于分享、存储、更新。用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

镜像是基于联合(union)文件系统的一种层式的结构,由一系列指令一步步构建处理。例如:

  • 添加一个文件
  • 执行一个命令
  • 打开一个端口

容器

Docker利用容器来运行应用。Docker可以帮你构建和部署容器,你只需要把自己的程序或服务打包到容器里即可。容器是基于镜像启动的,容器可以运行多个进程,所以可以认为,镜像是Docker生命周期的构建/打包阶段,容器是启动/执行阶段。

打个比方,容器是集装箱,镜像是货物。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

总结起来,Docker容器就是:

  • 一个镜像格式
  • 一系列标准的操作
  • 一个执行环境

注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

仓库(registry)

仓库用于保存用户构建的镜像,分为公有、私有。Docker公司运营的公共仓库叫Docker Hub,用户可以在Docker Hub注册账号,保存并分享自己的镜像。 国内的公开仓库有 Docker Pool等。用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

Docker学习之路(一)的更多相关文章

  1. docker学习之路-centos下安装docker

    前言 我要在云服务器上做一个asp.net core的webapi应用,使用docker来部署应用,中间用到的任何组件包括nginx和sqlserver 2017都是用docker来装载运行,所以,这 ...

  2. Docker学习之路(三)Docker网络详解

    1. Docker的4种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host ...

  3. Docker学习之路(二)DockerFile详解

    Dockerfile是一个镜像的表示,可以通过Dockerfile来描述构建镜像的步骤,并自动构建一个容器 所有的 Dockerfile 命令格式都是: INSTRUCTION arguments 虽 ...

  4. docker学习之路-build asp.net core 2.2产生 warning MSB3245: Could not resolve this reference.错误的解决办法

    在docker build的时候有时我们可以直接使用dotnet publish来发布,但是如果用docker构建镜像的时候却会出现下面的错误: 解决办法:https://stackoverflow. ...

  5. docker学习之路-nginx镜像(翻译)

    本篇来自https://hub.docker.com/_/nginx/?tab=description 它是docker hub上nginx的官方网站,上面有关于nginx的使用描述等.从这里你可以找 ...

  6. docker 学习之路 将docker容器变为镜像并上传

    环境 ubunt 16.4 去hub.docker.com上注册一个账号,并在账号中注册一个公有public或者私有仓库private 步骤如下 如上图 点击该处进入创建docker库页面 除了名字之 ...

  7. docker学习之路

    环境 : ubuntu 16.4 下载docker 首先使用命令行下载 docker wget -qO- https://get.docker.com/ | sh 启动 下载完成之后进行一个启动,但是 ...

  8. docker学习之路(安装、使用)

    一.docker安装 1.更新现有的yum包 yum update 2.配置docker yum源 [root@docker ~]# cat /etc/yum.repos.d/docker.repo ...

  9. Docker学习总结(18)——阿里超大规模Docker化之路

    12月6-7日,由阿里巴巴集团.阿里巴巴技术发展部.阿里云云栖社区联合主办,以"2016双11技术创新"为主题的阿里巴巴技术论坛上,阿里巴巴研究员林昊分享了阿里超大规模Docker ...

随机推荐

  1. 【java规则引擎】一个基于drools规则引擎实现的数学计算例子

    最近在研究JBPM工作流引擎,发现JBPM是基于Drools的,官方文档查看得知Drools是一款规则引擎.兴趣之下,仔细了解了下 Drools,Drools作为JBoss出品的一款开源推理和规则引擎 ...

  2. LG3648 [APIO2014]序列分割

    题意 你正在玩一个关于长度为 \(n\) 的非负整数序列的游戏.这个游戏中你需要把序列分成 \(k+1\) 个非空的块.为了得到 \(k+1\) 块,你需要重复下面的操作 \(k\) 次: 选择一个有 ...

  3. C++笔记之CopyFile和MoveFile的使用

    1.函数定义 CopyFile(A, B, FALSE);表示将文件A拷贝到B,如果B已经存在则覆盖(第三参数为TRUE时表示不覆盖) MoveFile(A, B);表示将文件A移动到B 2.函数原型 ...

  4. iOS侧滑返回到隐藏导航栏的VC,导航栏会闪现一次

    VCA:是一个隐藏导航栏的页面:VCA在ViewWillAppear生命周期函数中设置导航栏隐藏: //隐藏导航栏 [self.navigationController setNavigationBa ...

  5. (转)安装Android SDK时遇到Failed to rename directory

    安装Android SDK时遇到Failed to rename directory E:\Java\Android SDK\android-sdk_r06-windows\android-sdk-w ...

  6. 使用resteasy作为dubbox消费者

    dubbox服务提供者是REST风格的,消费者可能是从dubbox过来的,也可能是从第三方外部系统过来的.后者的话我们没得选,只能以服务提供者直连,服务治理平台和监控中心手再长,也管不到别人的地盘.但 ...

  7. MySQL中创建用户与授权

    参考地址:http://blog.csdn.net/gebitan505/article/details/51726649 一.创建用户(使用root用户登录进入mysql命令行) create us ...

  8. 浅谈FPGA有限状态机

    状态机几乎可以实现一切时序电路. 有限状态机(FiniteStateMachine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机.Moore型状态机输出仅仅 ...

  9. AppCan上下拉列表刷新

    function initBounce(funcTop, funcBottom){ uexWindow.setBounce("1"); if (!funcTop && ...

  10. java求10!的阶乘

    package com.aaa; //求10!的阶乘 public class Cheng { public static void main(String[] args) { int s=1; fo ...