docker容器基础入门

什么是容器

在计算机领域:容器(container)以一种特定的格式来打包软件,这种格式可以各自独立的运行在同一个操作系统之上,不像虚拟机,容器不会捆绑一个完整的操作系统,而仅仅打包软件运行所需要的依赖库和设置。这样可以实现一个高效、轻量级、自给自足系统,并且可以保证软件总是以相同的方式运行,而不管它被部署在哪里。

所以从上可知,容器是一种打包应用的方式,可以帮你们打包应用中的所有软件和软件所依赖的环境,并且可以实现跨平台部署。相比虚拟机,容器更高效和轻量化,一台服务器运行1000个虚拟机基本是难以想象的,但IBM的服务器据称已经在服务器上运行万级的容器。

容器和虚拟化的区别

对于虚拟化来说就是通过虚拟化技术,可以将物理资源转变为逻辑资源(虚拟机),应用程序服务运行在虚拟资源上,而不是真实的物理机上。因此,对于主机级虚拟化,我们的实现方式一般是想办法去模拟出硬件环境,模拟出虚拟的cpu、内存、硬盘、网卡等资源,然后在这些虚拟资源之上安装合适的操作系统来控制这些资源。

如上图所示,在VMM(又叫做hypervisor)之上,可以模拟出逻辑的计算机虚拟环境,然后安装操作系统,使其成为一台逻辑上虚拟的计算机主机(简称虚拟机),该主机有自己的系统内核,有自己的用户空间,可以在自己的用户空间内跑各种各样的应用程序。虚拟机与虚拟机之间是完全隔离的,也就是说一台虚拟机上运行的进程与其他虚拟机上运行的进程是互不干扰的,所以隔离性也是虚拟化所追求的一个目标。
所以对于虚拟化来说存在以下几个缺点
(1)资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1MB,虚拟机依然需要几百MB的内存才能运行。
(2)冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
(3)启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

由于虚拟机存在这些缺点,所以又发展出了另一种虚拟化技术:容器(Containers)。
容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
由于容器是进程级别的,相比虚拟机有很多优势。
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
(4)简化部署:容器技术可以将应用打包成单一地址访问的、Registry存储的、 仅通过一行命令就可以部署完成的组件。
(5)服务组合:采用容器的方式进行部署,整个系统会变得易于组合,通过容器技术将不同服务封装在对应的容器中,之后结合一些脚本使这些容器按照要求相互协作,这样操作不仅可以简化部署难度还可以降低操作风险。
(6)易于迁移:容器技术最重要的价值就是为在不同主机上运行服务提供一个轻便的、一致的格式。容器格式的标准化加快交付体验,允许用户方便地对工作负载进行迁移,避免局限于单一的平台提供商。
简而言之就是,容器是一个盒子,一个盒子装一个玩具,无论你丢在哪里,你给他通电,他就能运行。你的玩具大就用大盒子,小玩具就用小盒子。
容器与虚拟化的区别,简单来说:虚拟化使得多个操作系统可同时运行在单个系统上容器则可共享同一个操作系统的内核,将应用程序与系统其它部分隔离开

 上面这幅图可以帮助我们更主观的理解二者之间的区别,下面归纳常见的疑问。
Q1:Container技术和服务器虚拟化是一样的技术吗?
答:不是。两者虽然都属于虚拟化的技术,目标都是为了将一套应用程序所需的执行环境打包起来,建立一个隔离环境,方便在不同的硬件中移动,但两者的运作思维截然不同。简单来说,常见的传统虚拟化技术如vSphere、KVM或Hyper-V是以操作系统为中心,而Container技术则是一种以应用程序为中心的虚拟化技术。
传统虚拟化技术从操作系统层下手,目标是建立一个可以用来执行整套操作系统的独立执行环境,习惯以虚拟机(Virtual Machine)来称呼。而Container技术则是直接将一个应用程序所需的相关程序代码、函式库、环境配置文件都打包起来建立的执行环境,为了和传统虚拟化技术产生的虚拟机区分,Container技术产生的环境就称为Container。
Q2:一般常见的虚拟机和Container有何不同? 
答:最明显的差别是,虚拟机需要安装操作系统(安装Guest OS)才能执行应用程序,而Container内不需要安装操作系统就能执行应用程序,通过共享Host OS的作法。Container也因此被称为是OS层的虚拟化技术。
Q3:为何Container是轻量级虚拟化技术? 
答:因为Container技术采取共享Host OS的作法,而不需在每一个Container内执行Guest OS,因此建立Container不需要等待操作系统开机时间,几秒钟就可以启用,远比需要数分钟甚至数十分钟才能开启的传统虚拟机来的快。资源的消耗要比虚拟机低的多。

为什么需要容器?容器到底解决的是什么问题?

简要的答案是:容器使软件具备了超强的可移植能力。

如今的系统在架构上较十年前已经变得非常复杂了。以前几乎所有的应用都采用三层架构(Presentation/Application/Data),系统部署到有限的几台物理服务器上(Web Server/Application Server/Database Server),而今天,开发人员通常使用多种服务(比如MQ、Cache、DB )构建和组装应用,而且应用很可能会部署到不同的环境,比如虚拟服务器、私有云和公有云。

一方面应用包含多种服务,这些服务有自己所依赖的库和软件包;另一方面存在多种部署环境,服务在运行时可能需要动态迁移到不同的环境中.这就产生了一个问题:如何让每种服务能够在所有的部署环境中顺利运行?

各种服务和环境通过排列组合产生了一个大矩阵。开发人员在编写代码时需要考虑不同的运行环境,运维人员则需要为不同的服务和平台配置环境。对他们双方来说, 这都是一项困难而艰巨的任务。

如何解决这个问题呢?聪明的技术人员从传统的运输行业找到了答案。几十年前, 运输业面临着类似的问题,每一次运输,货主与承运方都会担心因货物类型的不同而导致损失, 比如几个铁桶错误地压在了一堆香蕉上。另一方面,运输过程中需要使用不同的交通工具也让整个过程痛苦不堪:

货物先装上车运到码头,卸货,然后装上船,到岸后又卸下船,再装上火车,到达目的地,最后卸货。一半以上的时间花费在装货、卸货上,而且搬上搬下还容易损坏货物。幸运的是,集装箱的发明解决了这个难题。

任何货物,无论钢琴还是保时捷,都被放到各自的集装箱中。集装箱在整个运输过程中都是密封的,只有到达最终目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以自动在卡车、轮船和火车之间移动集装箱。集装箱被誉为运输业与世界贸易最重要的发明,

容器运用了集装箱思想将软件打包,为代码提供了一个基于容器的标准化运输系统。可以将任何应用及其依赖打包成一个轻量级、可移植的容器。容器可以运行在几乎所有的操作系统上。

什么是Docker?

Docker是一种轻量虚拟化的容器技术,提供类似虚拟机的隔离功能,并使用了一种分层的联合文件系统技术管理镜像,能极大简化环境运维过程。Docker是容器运行的引擎(容器系统)负责启动容器镜像、运行容器应用和管理容器实例,并且支持在多种主流平台(PaaS)和本地部署。

Docker是基于Go语言实现的云开源项目,诞生于2013年,最初发起者是DotCloud公司,后来改名为Docker Inc,之后专注于Docker相关技术和产品的开发。

Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

 

docker的Logo设计为蓝色鲸鱼,驮着许多集装箱。Docker将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统,Docker的是一个轻量级的操作系统虚拟化解决方案。 主要目标,用官网的概括来说就是“Build,Ship and Run Any App,Anywhere”:编译,装载任何App,在任何地方都可以运行,我们大概理解就是一个容器,实现了对应用的封装,部署,运行等生命周期管理,到处都可以运行。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务等等。

可以看看集装箱思想是如何与Docker 各种特性相对应的,如表所示

特性

集装箱

Docker容器

打包对象

几乎任何货物

任何软件及其依赖

硬件依赖

标准形状和接口允许集装箱被装卸到各种交通工具,整个运输过程无须打开。

容器无须修改便可运行在几乎所有的平台上:虚拟机、物理机、公有云、私有云

隔离性

集装箱可以重叠起来一起运输, 香蕉再也不会被铁桶压烂了

资源、网络、库都是隔离的, 不会出现依赖问题

自动化

标准接口使集装箱很容易自动装卸和移动

提供run、start、Stop等标准化操作, 非常适合自动化

高效性

无须开箱,可在各种交通工具间快速搬运

轻盘级,能够快速启动和迁移

职责分工

货主只需考虑把什么放到集装箱里,承运方只需关心怎样运输集装

开发人员只需考虑怎么写代码, 运维人员只需关心如何配置基础环境

Docker的英文本意是“搬运工”, Docker搬运的是集装箱(Container),集装箱里装的是任意类型的应用程序和该应用程序所依赖的环境

Docker官方网站:http://www.docker.com

Github Docker 源码:https://github.com/docker/docker

安装docker

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

安装校验

root@iZbp12adskpuoxodbkqzjfZ:$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64
 Experimental: false

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值