docker容器技术基础入门

一、LXC简单介绍与使用

1.1 简介

LXC(LinuX Containers)Linux容器,一种操作系统层虚拟化技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
在Linux内核中,提供了cgroups功能,来达成资源的隔离。它同时也提供了名称空间隔离的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要启动任何虚拟机。
LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。

而Docker本质来说不是容器,而是容器的管理工具,最初的Docker也是基于LXC实现的。

LXC关键技术点:

  • chroot,根切换,从容器内的角度来看,仿佛真的有自己的根树
  • namespaces:名称空间,负责将资源隔离,比如pid,网络,mnt,user,uts等
  • CGroups:控制组,负责控制资源的分配

1.2 LXC基本架构

在这里插入图片描述

1.3 LXC常用命令

  • lxc-checkconfig 检查系统环境是否满足容器使用要求;
  • lxc-create 创建lxc容器; 格式:lxc-create -n NAME -t TEMPLATE_NAME
  • lxc-start 启动容器; 格式:lxc-start -n NAME -d
  • lxc-info 查看容器相关的信息; 格式:lxc-info -n NAME
  • lxc-console 附加至指定容器的控制台; 格式:lxc-console -n NAME -t NUMBER
  • lxc-stop 停止容器;
  • lxc-destory 删除处于停机状态的容器;
  • lxc-snapshot 创建和恢复快照;
  • 退出容器方式:<Ctrl+a q>

1.4 LXC简单使用

第一步:安装LXC与网桥管理工具包
LXC的安装包在CentOS的epel源有提供的,使用官网的epel源需要安装一个软件包

[root@localhost ~]# yum -y install epel-release

安装LXC软件包和依赖包

[root@localhost ~]# yum install lxc-templates lxc  bridge-utils -y
lxc           #主程序包
lxc-templates #lxc的配置模板
bridge-utils  #网桥管理工具
lxc-libs      #lxc所需的库文件
libcgroup     #cgroup是为Linux内核提供任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
libvirt       #管理Linux的虚拟化功能所需的服务器端守护程序。 需要针对特定驱动程序的管理程序。

注:如果要创建debian系列的主机需要再安装一个软件包:debootstrap

第二步:添加网桥
下面几步最好同时执行,否则如果你在xshell终端上会断网


二、docker

2.1 docter基本概念

docker是容器技术的一个前端工具,容器是内核的一项技术,docker只是把这一项技术的使用得以简化,使之普及而已。

LXC进行大规模创建容器很难,想在另一台主机上复刻一个一模一样的容器也很难,而docker就是从这方面着手去找解决方案。所以docker早期的版本其核心就是一个LXC,docker对其进行了二次封装,功能的实现是通过LXC做容器管理引擎,但是在创建容器时,不再是像LXC一样用模板去现场安装,而是事先通过一种类似镜像技术,就像在KVM中一样,将一个操作系统打包成一个镜像,然后将这个镜像拷贝到目标主机上直接部署启动。

我们可以尝试着把一个操作系统用户空间需要用到的所有组件,事先准备、编排好,编排好以后整体打包成一个文件,这个文件我们称其为镜像文件(image)。

docker的镜像文件是放在一个集中统一的互联网仓库中的,把一些人们常用的镜像文件放在互联网仓库中,比如最小化的centos系统,有时我们需要在操作系统上安装一些应用,比如nginx,我们就可以在一个最小化的centos系统中安装一个nginx,然后将其打包成镜像,将其放在互联网仓库中,当人们想启动一个容器的时候,docker会到这个互联网仓库中去下载我们需要的镜像到本地,并基于镜像来启动容器。

自docker 0.9版本起,docker除了继续支持LXC外,还开始引入自家的libcontainer,试图打造更通用的底层容器虚拟化库。如今的docker基本上都已经是使用libcontainer而非LXC了。

从操作系统功能上看,docker底层依赖的核心技术主要包括Linux操作系统的命名空间、控制组、联合文件系统和Linux虚拟网络支持。

2.2 Docker产生背景

  • 存在问题

① 开发和运维环境或配置不同,导致开发环境运行良好的交付产物在运维环境出问题,此类问题让人不胜其烦。

② 传统运维过程中,如果线上有十台机器,每台都需要重新部署一次,重复劳动。

以上出现了两种解决方案:虚拟机和容器

  • 虚拟机 vs 容器

虚拟机在一定程度可以解决这些问题。

虚拟机是虚拟出一套硬件后,在上面运行一套完整的操作系统,在该系统上再运行所需的应用,架构如下:
在这里插入图片描述

server:宿主机硬件
Host OS:宿主机操作系统
Hypervisor:硬件模拟
Guest OS:虚拟机操作系统
APP/Bins:虚拟机上的应用

虚拟机存在几个缺点:

① 资源占用多,虚机启动需要占用几百M的内存。

② 冗余步骤多,系统级别的操作步骤,往往无法跳过,比如用户登录。

③ 启动慢,往往几分钟 启动操作系统需要多久,启动虚拟机就需要多久。

相对于虚拟机,容器内没有自己的内核/操作系统,也没有硬件虚拟,容器内的应用进程直接运行在宿主的内核上,因此比传统虚拟机更加轻便。
在这里插入图片描述
容器不是模拟一个操作系统,而是对进程进行隔离。属于进程级别。

① 启动快, 相当于启动本机底层系统的一个进程,而不是虚拟机内部的进程,速度快很多。

② 占用资源少,容器只占用需要的资源,不占用那些没有用到的资源;多个容器可以共享资源,虚拟机是独享资源。

③ 体积小,容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

一句话总结:虚拟机是虚拟一个操作系统,在操作系统上跑应用;容器不虚拟操作系统,应用跑在宿主机内核上,本质是进程隔离。

2.3 docker工作方式

为了使容器的使用更加易于管理,docker采取一个用户空间只跑一个业务进程的方式,在一个容器内只运行一个进程,比如我们要在一台主机上安装一个nginx和一个tomcat,那么nginx就运行在nginx的容器中,tomcat运行在tomcat的容器中,二者用容器间的通信逻辑来进行通信。

LXC是把一个容器当一个用户空间使用,当虚拟机一样使用,里面可以运行N个进程,这就使得我们在容器内去管理时极为不便,而docker用这种限制性的方式,在一个容器中只运行一个进程的方式,使得容器的管理更加方便。
在这里插入图片描述
使用docker的优劣:

  • 删除一个容器不会影响其他容器
  • 调试不便,占空间(每个容器中都必须自带调试工具,比如ps命令)
  • 分发容易,真正意义上一次编写到处运行,比java的跨平台更彻底
  • 部署容易,无论底层系统是什么,只要有docker,直接run就可以了
  • 分层构建,联合挂载
    在这里插入图片描述
    在容器中有数据称作有状态,没有数据称作无状态。在容器的使用中,我们应以有状态为耻,以无状态为荣。数据不应该放在容器中,而应放置于外部存储中,通过挂载到容器中从而进行数据的存储。

2.4 Docker架构设计

Docker是一个Client-Server架构的系统,左侧Client是操作端;中间docker宿主机,Docker守护进程运行在宿主机上,然后通过socket从客户端访问,守护进程接收命令并管理运行在主机上的容器;右边是远程仓库,可以提供Docker镜像。

比如Client执行docker pull,宿主机就会到远程仓库拉取镜像,docker run则将镜像放到容器中运行。
在这里插入图片描述
Docker有三个要素:镜像、容器、仓库。

  • 镜像

镜像是容器的模板,是二进制文件(image),可以用来创建Docker容器,一个镜像可以创建很多容器,镜像与容器的关系类似软件安装包和运行程序的关系。

  • 容器

容器是用镜像创建的运行实例,可以把镜像看成一个简易版的Linux环境和运行在其中的应用程序。

  • 仓库

集中存放镜像的地方。类比github。分为公开库和私有库,国内阿里云。

2.5 docker容器编排

当我们要去构建一个lnmp架构的时候,它们之间会有依赖关系,哪个应用应该在什么时候启动,在谁之前或之后启动,这种依赖关系我们应该要事先定义好,最好是按照一定的次序实现,而docker自身没有这个功能,所以我们需要一个在docker的基础上,能够把这种应用程序之间的依赖关系、从属关系、隶属关系等等反映在启动、关闭时的次序和管理逻辑中,这种功能被称为容器编排。

有了docker以后,运维的发布工作必须通过编排工具来实现容器的编排,如果没有编排工具,运维人员想去管理容器其实比直接管理程序要更加麻烦,增加了运维环境管理的复杂度。

常见的容器编排工具:

  • machine+swarm(把N个docker主机当一个主机来管理)+compose(单机编排)
  • mesos(实现统一资源调度和分配)+marathon
  • kubernetes --> k8s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值